Exemplo n.º 1
0
    // 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;
    }
Exemplo n.º 2
0
    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));
    }
Exemplo n.º 3
0
    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();
    }
Exemplo n.º 4
0
    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));
    }
Exemplo n.º 5
0
    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);
        }
    }
Exemplo n.º 6
0
    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();
    }