Exemple #1
0
 private void PreviewFile(SaveFile F)
 {
     using (var BMP = MapRender.RenderFile(F))
     {
         PreviewImage(BMP, F.SessionName);
     }
 }
 private void RedrawMap()
 {
     Log.Write("{0}: Rendering Map", GetType().Name);
     BackgroundImage.Dispose();
     if (F != null)
     {
         using (var BMP = MapRender.RenderFile(F))
         {
             //Add file info string
             using (var G = Graphics.FromImage(BMP))
             {
                 var Info = string.Format("{0}: {1} {2}",
                                          Path.GetFileName(FileName),
                                          DateTime.Now.ToShortDateString(),
                                          DateTime.Now.ToShortTimeString());
                 using (var F = new Font("Arial", 16))
                 {
                     var Pos = G.MeasureString(Info, F);
                     G.DrawString(
                         Info, F,
                         Brushes.Red,
                         (int)(BMP.Width - Pos.Width),
                         (int)(BMP.Height - Pos.Height));
                 }
             }
             BackgroundImage = new Bitmap(BMP);
             BMP.Save(Path.ChangeExtension(FileName, "png"));
         }
     }
     else
     {
         BackgroundImage = MapRender.GetMap();
     }
 }
 public frmRegionDeleter(SaveFile F)
 {
     this.F    = F;
     HasChange = false;
     Points    = new List <PointF>();
     InitializeComponent();
     pbMap.Image = MapRender.RenderFile(F);
     Tools.SetupEscHandler(this);
 }
        private void renderToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var Node = GetSelectedFile();

            if (Node != null)
            {
                if (IsValidNode(Node))
                {
                    Log.Write("{0}: Rendering {1}.sav", GetType().Name, Node.Text);
                    using (var FS = File.OpenRead(GetName(Node)))
                    {
                        SaveFile F;
                        try
                        {
                            F = SaveFile.Open(FS);
                        }
                        catch (Exception ex)
                        {
                            Log.Write(new Exception("Attempted to render invalid file", ex));
                            InvalidMessage();
                            return;
                        }
                        using (var BMP = MapRender.RenderFile(F))
                        {
                            using (var frm = new Form())
                            {
                                frm.Text                  = "Preview of " + Node.Text;
                                frm.ShowIcon              = frm.ShowInTaskbar = false;
                                frm.WindowState           = FormWindowState.Maximized;
                                frm.BackgroundImageLayout = ImageLayout.Zoom;
                                frm.BackgroundImage       = BMP;
                                Tools.SetupEscHandler(frm);
                                frm.ShowDialog();
                            }
                        }
                    }
                }
                else
                {
                    InvalidMessage();
                }
            }
        }
        private static int HandleArguments(string[] args)
        {
            var    Ops         = new List <Modes>();
            string Filename    = null;
            string SessionName = null;

            if (args.Contains("/?"))
            {
                Help();
                return(RET.HELP);
            }
            for (var i = 0; i < args.Length; i++)
            {
                var arg = args[i];
                Log.Write("{0}: processing argument: {1}", nameof(HandleArguments), arg);
                switch (arg.ToLower())
                {
                case "/verify":
                    Ops.Add(Modes.Verify);
                    break;

                case "/list":
                    Ops.Add(Modes.List);
                    break;

                case "/pack":
                    Ops.Add(Modes.Pack);
                    break;

                case "/render":
                    Ops.Add(Modes.Render);
                    break;

                case "/info":
                    Ops.Add(Modes.Info);
                    break;

                case "/rename":
                    Ops.Add(Modes.RenameSession);
                    if (i < args.Length - 1)
                    {
                        SessionName = args[++i];
                    }
                    else
                    {
                        Log.Write("{0}: /rename requires a new session name", nameof(HandleArguments));
                        Console.WriteLine("/rename requires a new session name");
                        return(RET.ARG);
                    }
                    break;

                default:
                    if (string.IsNullOrEmpty(Filename))
                    {
                        Filename = arg;
                    }
                    else
                    {
                        Log.Write("{0}: unknown argument: {1}", nameof(HandleArguments), arg);
                        Console.WriteLine("Unknown argument: {0}", arg);
                        return(RET.ARG);
                    }
                    break;
                }
            }

            if (Ops.Count == 0 && args.Length < 2)
            {
                return(RET.UI);
            }

            Tools.AllocConsole();

            if (string.IsNullOrEmpty(Filename))
            {
                Log.Write("{0}: No file name argument supplied", nameof(HandleArguments));
                Console.WriteLine("No file name argument supplied");
                return(RET.ARG);
            }

            Ops = Ops.Distinct().ToList();

            var        Changes = false;
            var        IsGz    = false;
            SaveFile   SF      = null;
            FileStream FS      = null;

            try
            {
                FS = File.Open(Filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to open input file");
                Log.Write("{0}: Unable to open input file", nameof(HandleArguments));
                Log.Write(ex);
                return(RET.IO);
            }
            using (FS)
            {
                IsGz = Tools.IsGzFile(FS);
                try
                {
                    SF = SaveFile.Open(FS);
                    if (SF == null)
                    {
                        throw new InvalidDataException("The file is not a valid satisfactory save game");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Invalid game file");
                    Log.Write("{0}: Invalid game file", nameof(HandleArguments));
                    Log.Write(ex);
                    return(RET.IO);
                }


                if (Ops.Contains(Modes.Verify))
                {
                    Log.Write("{0}: Verifying file", nameof(HandleArguments));
                    //Verify does nothing on its own
                    Check(SF.PlayTime.Ticks >= 0, "Positive play time");
                    Check(Tools.IsMatch(SF.SessionName, @"^[\w\.\- ]{1,31}$"), "Non-Problematic Session Name");
                    Check(SF.LevelType == SaveFile.DEFAULT_LEVEL_TYPE, $"Level type is '{SaveFile.DEFAULT_LEVEL_TYPE}'");
                    Check(SF.SaveDate.ToUniversalTime() < DateTime.UtcNow, "Date in past");
                    foreach (var key in "sessionName Visibility startloc".Split(' '))
                    {
                        Check(SF.Properties.ContainsKey(key), $"Header contains field '{key}'");
                    }
                    //Don't double error with the previous one
                    if (SF.Properties.ContainsKey("sessionName"))
                    {
                        Check(SF.Properties["sessionName"] == SF.SessionName, "Both session names match");
                    }
                    else
                    {
                        Console.WriteLine("[SKIP]: Both session names match");
                    }
                }

                if (Ops.Contains(Modes.List))
                {
                    Log.Write("{0}: Printing item list", nameof(HandleArguments));
                    foreach (var e in SF.Entries.GroupBy(m => m.ObjectData.Name).OrderBy(m => m.Key))
                    {
                        Console.WriteLine("{1}\t{0}", e.Key, e.Count());
                    }
                }

                if (Ops.Contains(Modes.Render))
                {
                    var ImgFile = Path.ChangeExtension(Filename, ".png");
                    Log.Write("{0}: Rendering map as original size to {1}", nameof(HandleArguments), ImgFile);
                    Console.WriteLine("Initializing image...");
                    MapRender.Init(-1, -1);
                    Console.WriteLine("Rendering file...");
                    using (var IMG = MapRender.RenderFile(SF, 8.192))
                    {
                        Console.WriteLine("Saving image...");
                        IMG.Save(ImgFile);
                    }
                }

                if (Ops.Contains(Modes.Info))
                {
                    Log.Write("{0}: Showing game info", nameof(HandleArguments));
                    Console.WriteLine("Save File Size:\t{0}", FS.Position);
                    Console.WriteLine("Build Version:\t{0}", SF.BuildVersion);
                    Console.WriteLine("Save Version:\t{0}", SF.SaveVersion);
                    Console.WriteLine("Header Version:\t{0}", SF.SaveHeaderVersion);
                    Console.WriteLine("Session Name:\t{0}", SF.SessionName);
                    Console.WriteLine("Save Date:\t{0}", SF.SaveDate);
                    Console.WriteLine("Play Time:\t{0}", SF.PlayTime);
                    foreach (var KV in SF.Properties)
                    {
                        Console.WriteLine("{0}:\t{1}", KV.Key, KV.Value);
                    }
                    Console.WriteLine("Object Count:\t{0}", SF.Entries.Count);
                    Console.WriteLine("String List:\t{0}", SF.StringList.Count);
                }

                if (Ops.Contains(Modes.RenameSession))
                {
                    Log.Write("{0}: Renaming session to {1}", nameof(HandleArguments), SessionName);
                    SF.SetSessionName(SessionName);
                    Changes = true;
                }

                if (Ops.Contains(Modes.Pack))
                {
                    string     NewFile;
                    FileStream OUT;
                    FS.Seek(0, SeekOrigin.Begin);
                    if (IsGz)
                    {
                        if (Filename.ToLower().EndsWith(".sav.gz"))
                        {
                            NewFile = Path.ChangeExtension(Filename, null);
                        }
                        else
                        {
                            NewFile = Path.ChangeExtension(Filename, ".sav");
                        }
                    }
                    else
                    {
                        NewFile = Filename + ".gz";
                    }
                    try
                    {
                        OUT = File.Create(NewFile);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Can't create output file");
                        Log.Write("{0}: Can't create {1}", nameof(HandleArguments), NewFile);
                        Log.Write(ex);
                        return(RET.IO);
                    }
                    Log.Write("{0}: {1} file", nameof(HandleArguments), IsGz ? "Compressing" : "Decompressing");
                    using (OUT)
                    {
                        if (IsGz)
                        {
                            Compression.DecompressStream(FS, OUT);
                        }
                        else
                        {
                            Compression.CompressStream(FS, OUT);
                        }
                    }
                    Log.Write("{0}: {1} file OK", nameof(HandleArguments), IsGz ? "Compressing" : "Decompressing");
                }
                if (Changes)
                {
                    Log.Write("{0}: Writing back changes", nameof(HandleArguments));
                    FS.Seek(0, SeekOrigin.Begin);
                    SF.Export(FS);
                    FS.Flush();
                    FS.SetLength(FS.Position);
                }
            }

            return(RET.SUCCESS);
        }
        /// <summary>
        /// Redraws the map
        /// </summary>
        private void RedrawMap()
        {
            Image I = null;

            if (!RenderImage)
            {
                Log.Write("{0}: Map Rendering is disabled in RedrawMap()", GetType().Name);
                return;
            }
            Log.Write("{0}: Rendering Map", GetType().Name);
            if (F != null)
            {
                try
                {
                    I = MapRender.RenderFile(F);
                }
                catch (Exception ex)
                {
                    Log.Write("{0}: Error when rendering bitmap", GetType().Name);
                    Log.Write(ex);
                    DisableImageRendering();
                    return;
                }
                try
                {
                    //Add file info string
                    using (var G = Graphics.FromImage(I))
                    {
                        var Info = string.Format("{0}: {1} {2}",
                                                 Path.GetFileName(FileName),
                                                 DateTime.Now.ToShortDateString(),
                                                 DateTime.Now.ToShortTimeString());
                        using (var F = new Font("Arial", 16))
                        {
                            //Align to the bottom right corner of the image
                            var Pos = G.MeasureString(Info, F);
                            G.DrawString(
                                Info, F,
                                Brushes.Red,
                                (int)(I.Width - Pos.Width),
                                (int)(I.Height - Pos.Height));
                        }
                    }
                    Log.Write("{0}: Setting map image in form", GetType().Name);
                    BackgroundImage.Dispose();
                    BackgroundImage = I;
                }
                catch (Exception ex)
                {
                    Log.Write("{0}: Error when rendering bitmap", GetType().Name);
                    Log.Write(ex);
                    try
                    {
                        I.Dispose();
                    }
                    finally
                    {
                        I = null;
                    }
                    DisableImageRendering();
                }
                if (I != null)
                {
                    //Save image in its own "try" block because if only this fails it's not a rendering error.
                    try
                    {
                        Log.Write("{0}: Saving map image to file", GetType().Name);
                        I.Save(Path.ChangeExtension(FileName, "png"));
                    }
                    catch (Exception ex)
                    {
                        Log.Write("{0}: Unable to save map image to file", GetType().Name);
                        Log.Write(ex);
                    }
                }
            }
            else
            {
                Log.Write("{0}: No file loaded. Drawing empty map", GetType().Name);
                try
                {
                    BackgroundImage.Dispose();
                    BackgroundImage = MapRender.GetMap();
                }
                catch (Exception ex)
                {
                    Log.Write("{0}: Error when rendering bitmap", GetType().Name);
                    Log.Write(ex);
                    DisableImageRendering();
                }
            }
        }