Skip to content

Commit

Permalink
update to latest helldivers-2/json module (#69)
Browse files Browse the repository at this point in the history
* update to latest helldivers-2/json module

- update source generator to work with new JSON format
- add environmental and biome data to planets
- made planet names translatable

* make `json` folder invisible in project again
  • Loading branch information
dealloc authored Apr 12, 2024
1 parent f2992c6 commit 5c9720d
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 23 deletions.
10 changes: 7 additions & 3 deletions src/Helldivers-2-Core/Mapping/V1/PlanetMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,18 @@ public IEnumerable<Planet> MapToV1(WarInfo warInfo, WarStatus warStatus, WarSumm
/// </summary>
public Planet MapToV1(PlanetInfo info, PlanetStatus status, PlanetEvent? @event, PlanetStats? stats, List<int> attacking)
{
Static.Planets.TryGetValue(info.Index, out var name);
Static.Planets.TryGetValue(info.Index, out var planet);
Static.Factions.TryGetValue(info.InitialOwner, out var initialOwner);
Static.Factions.TryGetValue(status.Owner, out var currentOwner);

var (name, sector, biomeKey, environmentals) = planet;

return new Planet(
Index: info.Index,
Name: name ?? string.Empty,
Sector: Static.Sectors.First(sector => sector.Value.Contains(info.Index)).Key,
Name: name,
Sector: sector,
Biome: Static.Biomes[biomeKey],
Hazards: environmentals.Select(environmental => Static.Environmentals[environmental]).ToList(),
Hash: info.SettingsHash,
Position: new Position(info.Position.X, info.Position.Y),
Waypoints: info.Waypoints.ToList(),
Expand Down
7 changes: 4 additions & 3 deletions src/Helldivers-2-Models/Helldivers-2-Models.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
</PropertyGroup>

<ItemGroup>
<None Remove="json/*" Visible="false" />
<None Remove="json/**/*" Visible="false" />
<AdditionalFiles Include="json/factions.json" Visible="false" />
<AdditionalFiles Include="json/planets.json" Visible="false" />
<AdditionalFiles Include="json/sectors.json" Visible="false" />
<AdditionalFiles Include="json/planets/planets.json" Visible="false" />
<AdditionalFiles Include="json/planets/biomes.json" Visible="false" />
<AdditionalFiles Include="json/planets/environmentals.json" Visible="false" />

<ProjectReference Include="..\Helldivers-2-SourceGen\Helldivers-2-SourceGen.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
</ItemGroup>
Expand Down
9 changes: 7 additions & 2 deletions src/Helldivers-2-Models/V1/Planet.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Helldivers.Models.V1.Planets;
using Helldivers.Models.Domain.Localization;
using Helldivers.Models.V1.Planets;

namespace Helldivers.Models.V1;

Expand All @@ -8,6 +9,8 @@ namespace Helldivers.Models.V1;
/// <param name="Index">The unique identifier ArrowHead assigned to this planet.</param>
/// <param name="Name">The name of the planet, as shown in game.</param>
/// <param name="Sector">The name of the sector the planet is in, as shown in game.</param>
/// <param name="Biome">The biome this planet has.</param>
/// <param name="Hazards">All <see cref="Hazard" />s that are applicable to this planet.</param>
/// <param name="Hash">A hash assigned to the planet by ArrowHead, purpose unknown.</param>
/// <param name="Position">The coordinates of this planet on the galactic war map.</param>
/// <param name="Waypoints">A list of <see cref="Index" /> of all the planets to which this planet is connected.</param>
Expand All @@ -22,8 +25,10 @@ namespace Helldivers.Models.V1;
/// <param name="Attacking">A list of <see cref="Index" /> integers that this planet is currently attacking.</param>
public record Planet(
int Index,
string Name,
LocalizedMessage Name,
string Sector,
Biome Biome,
List<Hazard> Hazards,
long Hash,
Position Position,
List<int> Waypoints,
Expand Down
11 changes: 11 additions & 0 deletions src/Helldivers-2-Models/V1/Planets/Biome.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Helldivers.Models.V1.Planets;

/// <summary>
/// Represents information about a biome of a planet.
/// </summary>
/// <param name="Name">The name of this biome.</param>
/// <param name="Description">A human-readable description of the biome.</param>
public sealed record Biome(
string Name,
string Description
);
11 changes: 11 additions & 0 deletions src/Helldivers-2-Models/V1/Planets/Hazard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Helldivers.Models.V1.Planets;

/// <summary>
/// Describes an environmental hazard that can be present on a <see cref="Planet" />.
/// </summary>
/// <param name="Name">The name of this environmental hazard.</param>
/// <param name="Description">The description of the environmental hazard.</param>
public sealed record Hazard(
string Name,
string Description
);
64 changes: 50 additions & 14 deletions src/Helldivers-2-SourceGen/StaticJsonSourceGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,17 @@ public void Execute(GeneratorExecutionContext context)

var (type, value) = name.ToLowerInvariant() switch
{
"planets" => ParseNumericDictionary(json),
"factions" => ParseNumericDictionary(json),
"sectors" => ParseNumericListDictionary(json),
"planets" => ParsePlanetsDictionary(json),
"biomes" => ParseBiomesDictionary(json),
"environmentals" => ParseEnvironmentalsDictionary(json),
"factions" => ParseFactionsDictionary(json),
_ => throw new Exception($"Generator does not know how to parse {name}")
};

var source = $@"// <auto-generated />
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
using global::System.Collections.Generic;
using global::Helldivers.Models.Domain.Localization;
namespace Helldivers.Models;
Expand Down Expand Up @@ -78,7 +80,7 @@ public static partial class Static
/// <summary>
/// Parses a JSON file that's an object where keys are numerical and values are names (strings).
/// </summary>
private (string Type, string Source) ParseNumericDictionary(string json)
private (string Type, string Source) ParseFactionsDictionary(string json)
{
var builder = new StringBuilder("new Dictionary<int, string>()\n\t{\n");
var entries = JsonSerializer.Deserialize<Dictionary<string, string>>(json)!;
Expand All @@ -89,20 +91,54 @@ public static partial class Static
return ("IReadOnlyDictionary<int, string>", builder.ToString());
}

/// <summary>
/// Parses a JSON file that's an object where keys are strings and values are lists of integers.
/// </summary>
private (string Type, string Source) ParseNumericListDictionary(string json)
private (string Type, string Source) ParsePlanetsDictionary(string json)
{
var builder = new StringBuilder("new Dictionary<string, List<int>>()\n\t{\n");
var entries = JsonSerializer.Deserialize<Dictionary<string, List<int>>>(json, new JsonSerializerOptions())!;
foreach (var pair in entries)
var builder = new StringBuilder("new Dictionary<int, (LocalizedMessage Name, string Sector, string Biome, List<string> Environmentals)>()\n\t{\n");
var document = JsonDocument.Parse(json);
foreach (var property in document.RootElement.EnumerateObject())
{
var values = string.Join(", ", pair.Value);
builder.AppendLine($@"{'\t'}{'\t'}{{ ""{pair.Key}"", [{values}] }},");
var index = property.Name;
var name = property.Value.GetProperty("name").GetString();
var names = property
.Value
.GetProperty("names")
.EnumerateObject()
.ToDictionary(prop => prop.Name, prop => prop.Value.GetString()!);
var sector = property.Value.GetProperty("sector").GetString();
var biome = property.Value.GetProperty("biome").GetString();
var environmentals = property
.Value
.GetProperty("environmentals")
.EnumerateArray()
.Select(prop => $@"""{prop.GetString()!}""")
.ToList();
builder.AppendLine($@"{'\t'}{'\t'}{{ {index}, (LocalizedMessage.FromStrings([{string.Join(", ", names.Select(pair => $@"new KeyValuePair<string, string>(""{pair.Key}"", ""{pair.Value}"")"))}]), ""{sector}"", ""{biome}"", [{string.Join(", ", environmentals)}]) }},");
}

builder.Append("\t}");
return ("IReadOnlyDictionary<string, List<int>>", builder.ToString());
return ("IReadOnlyDictionary<int, (LocalizedMessage Name, string Sector, string Biome, List<string> Environmentals)>", builder.ToString());
}

private (string Type, string Source) ParseBiomesDictionary(string json)
{
var builder = new StringBuilder("new Dictionary<string, Helldivers.Models.V1.Planets.Biome>()\n\t{\n");
var entries = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(json)!;
foreach (var pair in entries)
builder.AppendLine($@"{'\t'}{'\t'}{{ ""{pair.Key}"", new Helldivers.Models.V1.Planets.Biome(""{pair.Value["name"]}"", ""{pair.Value["description"]}"") }},");

builder.Append("\t}");
return ("IReadOnlyDictionary<string, Helldivers.Models.V1.Planets.Biome>", builder.ToString());
}

private (string Type, string Source) ParseEnvironmentalsDictionary(string json)
{
var builder = new StringBuilder("new Dictionary<string, Helldivers.Models.V1.Planets.Hazard>()\n\t{\n");
var entries = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(json)!;
foreach (var pair in entries)
builder.AppendLine($@"{'\t'}{'\t'}{{ ""{pair.Key}"", new Helldivers.Models.V1.Planets.Hazard(""{pair.Value["name"]}"", ""{pair.Value["description"]}"") }},");

builder.Append("\t}");
return ("IReadOnlyDictionary<string, Helldivers.Models.V1.Planets.Hazard>", builder.ToString());
}
}

0 comments on commit 5c9720d

Please sign in to comment.