using Theriapolis.Game; // Resolve content directories relative to the executable. // Distribution: Data/ and Gfx/ sit next to the exe (absolute path) // Development: walk up from the exe to find Content/Data and Content/Gfx string dataDir = ResolveContentDir("Data"); string gfxDir = ResolveContentDir("Gfx"); static string ResolveContentDir(string subdir) { // 1. "" next to the executable — distribution layout string local = Path.Combine(AppContext.BaseDirectory, subdir); if (Directory.Exists(local)) return local; // 2. Walk up from the exe to find Content/ — development layout. // Trim the trailing separator first: on Windows AppContext.BaseDirectory ends // with '\', and GetDirectoryName on a trailing-slash path strips the slash // without ascending, wasting one iteration. string? dir = AppContext.BaseDirectory.TrimEnd( Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); for (int i = 0; i < 6; i++) { if (dir is null) break; string candidate = Path.Combine(dir, "Content", subdir); if (Directory.Exists(candidate)) return candidate; dir = Path.GetDirectoryName(dir); } return local; // missing-file errors will surface from the consumer with the bad path } using var game = new Game1 { ContentDataDirectory = dataDir, ContentGfxDirectory = gfxDir, }; game.Run();