// Call this if you don't want a level placed in RAM public void unpackWorld() { string dir = $"user://Worlds/{BinLoader.RootDirectory}"; GDKnyttAssetManager.ensureDirExists(dir); string marker_name = $"{dir}/_do_not_load_"; File marker = new File(); marker.Open(marker_name, File.ModeFlags.Write); marker.Close(); foreach (string filename in BinLoader.GetFileNames()) { string fullname = $"{dir}/{filename}"; GDKnyttAssetManager.ensureDirExists(fullname.Substring(0, fullname.LastIndexOf('/'))); File f = new File(); f.Open(fullname, File.ModeFlags.Write); f.StoreBuffer(BinLoader.GetFile(filename)); f.Close(); } new Directory().Remove(marker_name); new Directory().Remove(WorldDirectory); removeDirectory("user://Cache/" + GDKnyttAssetManager.extractFilename(WorldDirectory)); purgeBinFile(); setDirectory(dir, WorldDirectoryName); BinMode = false; }
private WorldEntry generateDirectoryWorld(string world_dir) { KnyttWorldInfo world_info; string cache_dir = "user://Cache/" + GDKnyttAssetManager.extractFilename(world_dir); string ini_cache_name = cache_dir + "/World.ini"; string played_flag_name = cache_dir + "/LastPlayed.flag"; if (new File().FileExists(ini_cache_name)) { world_info = getWorldInfo(GDKnyttAssetManager.loadFile(ini_cache_name)); } else { var ini_bin = GDKnyttAssetManager.loadFile(world_dir + "/world.ini"); var ini_data = new IniData(); world_info = getWorldInfo(ini_bin, merge_to: ini_data["World"]); GDKnyttAssetManager.ensureDirExists(cache_dir); var f = new File(); f.Open(ini_cache_name, File.ModeFlags.Write); f.StoreString(ini_data.ToString()); f.Close(); } Texture icon = GDKnyttAssetManager.loadExternalTexture(world_dir + "/icon.png"); var last_played = new File().FileExists(played_flag_name) ? new File().GetModifiedTime(played_flag_name) : 0; return(new WorldEntry(icon, world_info, world_dir, last_played)); }
public void saveGame(KnyttSave save) { GDKnyttAssetManager.ensureDirExists("user://Saves"); var f = new File(); f.Open($"user://Saves/{save.SaveFileName}", File.ModeFlags.Write); f.StoreString(save.ToString()); f.Close(); }
private WorldEntry generateBinWorld(string world_dir) { byte[] icon_bin; KnyttWorldInfo world_info; string cache_dir = "user://Cache/" + GDKnyttAssetManager.extractFilename(world_dir); string icon_cache_name = cache_dir + "/Icon.png"; string ini_cache_name = cache_dir + "/World.ini"; string played_flag_name = cache_dir + "/LastPlayed.flag"; if (new Directory().DirExists(cache_dir)) { icon_bin = GDKnyttAssetManager.loadFile(icon_cache_name); world_info = getWorldInfo(GDKnyttAssetManager.loadFile(ini_cache_name)); } else { KnyttBinWorldLoader binloader; byte[] ini_bin; try { binloader = new KnyttBinWorldLoader(GDKnyttAssetManager.loadFile(world_dir)); } catch (InvalidOperationException) { return(null); } icon_bin = binloader.GetFile("Icon.png"); ini_bin = binloader.GetFile("World.ini"); GDKnyttAssetManager.ensureDirExists("user://Cache"); new Directory().MakeDir(cache_dir); var f = new File(); f.Open(icon_cache_name, File.ModeFlags.Write); f.StoreBuffer(icon_bin); f.Close(); var ini_data = new IniData(); world_info = getWorldInfo(ini_bin, merge_to: ini_data["World"]); f.Open(ini_cache_name, File.ModeFlags.Write); f.StoreString(ini_data.ToString()); f.Close(); } Texture icon = GDKnyttAssetManager.loadTexture(icon_bin); var last_played = new File().FileExists(played_flag_name) ? new File().GetModifiedTime(played_flag_name) : 0; return(new WorldEntry(icon, world_info, world_dir, last_played)); }
public void _on_GamePressed(GameButton button) { if (button.worldEntry.Path == null) { var timer = GetNode <Timer>("DownloadMonitor"); if (!timer.IsStopped()) { return; } GDKnyttAssetManager.ensureDirExists("user://Worlds"); string filename = button.worldEntry.Link; filename = filename.Substring(filename.LastIndexOf('/') + 1); if (filename.IndexOf('?') != -1) { filename = filename.Substring(0, filename.IndexOf('?')); } if (!filename.EndsWith(".knytt.bin")) { filename += ".knytt.bin"; } filename = Uri.UnescapeDataString(filename); http_node.DownloadFile = $"user://Worlds/{filename}.part"; var error = http_node.Request(button.worldEntry.Link); if (error != Error.Ok) { download_button.markFailed(); return; } timer.Start(); download_button = button; button.setDownloaded(0); } else { ClickPlayer.Play(); var info_screen = info_scene.Instance() as InfoScreen; info_screen.initialize(button.worldEntry.Path); info_screen.worldEntry = button.worldEntry; this.GetParent().AddChild(info_screen); } }
public void _on_SlotButton_StartGame(bool new_save, string filename, int slot) { GetNode <LevelSelection>("../LevelSelection").killConsumers(); string cache_dir = GDKnyttAssetManager.extractFilename(KWorld.WorldDirectory); GDKnyttAssetManager.ensureDirExists($"user://Cache/{cache_dir}"); var f = new File(); f.Open($"user://Cache/{cache_dir}/LastPlayed.flag", File.ModeFlags.Write); f.Close(); KnyttSave save = new KnyttSave(KWorld, new_save ? GDKnyttAssetManager.loadTextFile(KWorld.getWorldData("DefaultSavegame.ini")) : GDKnyttAssetManager.loadTextFile(filename), slot); KWorld.CurrentSave = save; GDKnyttDataStore.KWorld = KWorld; GDKnyttDataStore.startGame(new_save); this.QueueFree(); }