diff --git a/src/CapySR.Data/GameData.cs b/src/CapySR.Data/GameData.cs index 96480c6..f0d80fd 100644 --- a/src/CapySR.Data/GameData.cs +++ b/src/CapySR.Data/GameData.cs @@ -134,12 +134,15 @@ public sealed partial class GameData { log ??= _ => { }; - var roots = sources.Where(Directory.Exists).ToArray(); + var wanted = sources.ToArray(); + var roots = wanted.Where(Directory.Exists).ToArray(); + if (roots.Length == 0) { throw new DirectoryNotFoundException( - "no game data sources found. Clone Dimbreath/turnbasedgamedata and point " + - "Data:Sources at its ExcelOutput folder."); + "no game data sources found. Clone Dimbreath/turnbasedgamedata and set Data:Sources " + + "in config/config.json to its ExcelOutput folder. Looked in: " + + (wanted.Length > 0 ? string.Join(", ", wanted) : "nowhere, Data:Sources is empty")); } var data = new GameData(roots); diff --git a/src/CapySR.GameServer/Program.cs b/src/CapySR.GameServer/Program.cs index e7e6ea0..b908e29 100644 --- a/src/CapySR.GameServer/Program.cs +++ b/src/CapySR.GameServer/Program.cs @@ -30,7 +30,18 @@ logger.LogInformation("protocol: {Count} commands", ProtocolRegistry.Count); var handlers = HandlerRegistry.Build(logger); logger.LogInformation("handlers: {Handlers} implemented", handlers.HandlerCount); -var world = new GameWorld(config, logger); +GameWorld world; + +try +{ + world = new GameWorld(config, logger); +} +catch (DirectoryNotFoundException e) +{ + // a fresh clone has no game data yet; say so plainly instead of dumping a stack trace + logger.LogError("{Message}", e.Message); + return 1; +} var gateway = new KcpGateway( config, @@ -46,3 +57,5 @@ Console.CancelKeyPress += (_, e) => }; await gateway.RunAsync(cancellation.Token); + +return 0;