Пример #1
0
 private void openToolStripMenuItem_Click(object sender, EventArgs e)
 {
     using (OpenFileDialog fd = new OpenFileDialog()
     {
         DefaultExt = "ini", Filter = "INI Files|*.ini"
     })
         if (fd.ShowDialog(this) == DialogResult.OK)
         {
             IniData ini = IniSerializer.Deserialize <IniData>(fd.FileName);
             filename = Path.Combine(Path.GetDirectoryName(fd.FileName),
                                     ini.Files.First((item) => item.Value.Type == "stageselectlist").Value.Filename);
             levels = new List <StageSelectLevel>(StageSelectLevelList.Load(filename));
             string resdir = Path.Combine(Path.GetDirectoryName(fd.FileName), ini.SystemFolder);
             using (Device d3ddevice = new Device(0, DeviceType.Hardware, dummyPanel.Handle, CreateFlags.SoftwareVertexProcessing, new PresentParameters[] { new PresentParameters()
                                                                                                                                                             {
                                                                                                                                                                 Windowed = true, SwapEffect = SwapEffect.Discard, EnableAutoDepthStencil = true, AutoDepthStencilFormat = DepthFormat.D24X8
                                                                                                                                                             } }))
             {
                 using (Stream str = new MemoryStream(
                            new PAKFile(Path.Combine(resdir, @"SOC\stageMapBG.pak")).Files.Find(
                                (a) => a.Name.Equals(@"stagemapbg\stagemap.dds")).Data))
                     bgtex = LoadDDS(str, d3ddevice);
                 if (File.Exists(Path.Combine(resdir, @"PRS\stageMap.pak")))
                 {
                     List <PAKFile.File> files = new PAKFile(Path.Combine(resdir, @"PRS\stageMap.pak")).Files;
                     byte[] inf = files.Find((a) => a.Name.Equals(@"stagemap\stagemap.inf")).Data;
                     uitexs = new Bitmap[inf.Length / 0x3C];
                     for (int i = 0; i < uitexs.Length; i++)
                     {
                         using (Stream str = new MemoryStream(files.Find(
                                                                  (a) => a.Name.Equals(@"stagemap\" + Encoding.ASCII.GetString(inf, i * 0x3C, 0x1c).TrimEnd('\0') + ".dds")).Data))
                             uitexs[i] = LoadDDS(str, d3ddevice);
                     }
                 }
                 else
                 {
                     uitexs = TextureArchive.GetTextures(Path.Combine(resdir, "stageMap.prs")).Select((tex) => tex.Image).ToArray();
                 }
             }
             saveToolStripMenuItem.Enabled = panel1.Enabled = panel2.Enabled = true;
             selected                = 0;
             level.SelectedIndex     = (int)levels[selected].Level;
             character.SelectedIndex = (int)levels[selected].Character;
             column.Value            = levels[selected].Column;
             row.Value               = levels[selected].Row;
             DrawLevel();
         }
 }
Пример #2
0
 private void openToolStripMenuItem_Click(object sender, EventArgs e)
 {
     using (OpenFileDialog fd = new OpenFileDialog()
     {
         DefaultExt = "ini", Filter = "INI Files|*.ini"
     })
         if (fd.ShowDialog(this) == DialogResult.OK)
         {
             IniData ini = IniSerializer.Deserialize <IniData>(fd.FileName);
             filename = Path.Combine(Path.GetDirectoryName(fd.FileName),
                                     ini.Files.First((item) => item.Value.Type == "stageselectlist").Value.Filename);
             levels = new List <StageSelectLevel>(StageSelectLevelList.Load(filename));
             string resdir = Path.Combine(Path.GetDirectoryName(fd.FileName), ini.SystemFolder);
             using (MemoryStream str = new MemoryStream(
                        new PAKFile(Path.Combine(resdir, @"SOC\stageMapBG.pak")).Entries.Find(
                            (a) => a.Name.Equals(@"stagemapbg\stagemap.dds")).Data))
                 bgtex = LoadDDS(str);
             if (File.Exists(Path.Combine(resdir, @"PRS\stageMap.pak")))
             {
                 PAKFile pakf = new PAKFile(Path.Combine(resdir, @"PRS\stageMap.pak"));
                 byte[]  inf  = pakf.Entries.Find((a) => a.Name.Equals(@"stagemap\stagemap.inf")).Data;
                 uitexs = new Bitmap[inf.Length / 0x3C];
                 for (int i = 0; i < uitexs.Length; i++)
                 {
                     using (MemoryStream str = new MemoryStream(pakf.Entries.Find(
                                                                    (a) => a.Name.Equals(@"stagemap\" + Encoding.ASCII.GetString(inf, i * 0x3C, 0x1c).TrimEnd('\0') + ".dds")).Data))
                         uitexs[i] = LoadDDS(str);
                 }
             }
             else
             {
                 uitexs = TextureArchive.GetTextures(Path.Combine(resdir, "stageMap.prs")).Select((tex) => tex.Image).ToArray();
             }
             saveToolStripMenuItem.Enabled = panel1.Enabled = panel2.Enabled = true;
             selected                = 0;
             level.SelectedIndex     = (int)levels[selected].Level;
             character.SelectedIndex = (int)levels[selected].Character;
             column.Value            = levels[selected].Column;
             row.Value               = levels[selected].Row;
             DrawLevel();
         }
 }
Пример #3
0
        private void loadTexturesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog a = new OpenFileDialog()
            {
                DefaultExt = "pvm", Filter = "Texture Files|*.pvm;*.gvm;*.prs"
            })
            {
                if (a.ShowDialog() == DialogResult.OK)
                {
                    TextureInfo = TextureArchive.GetTextures(a.FileName);

                    TexturePackName = Path.GetFileNameWithoutExtension(a.FileName);
                    Textures        = new Texture[TextureInfo.Length];
                    for (int j = 0; j < TextureInfo.Length; j++)
                    {
                        Textures[j] = new Texture(d3ddevice, TextureInfo[j].Image, Usage.None, Pool.Managed);
                    }

                    DrawLevel();
                }
            }
        }
Пример #4
0
        private void LoadFile(string filename)
        {
            loaded              = false;
            UseWaitCursor       = true;
            Enabled             = false;
            LevelData.leveltexs = null;
            cam = new EditorCamera(EditorOptions.RenderDrawDistance);
            if (LandTable.CheckLevelFile(filename))
            {
                LevelData.geo = LandTable.LoadFromFile(filename);
            }
            else
            {
                byte[] file = File.ReadAllBytes(filename);
                if (Path.GetExtension(filename).Equals(".prs", StringComparison.OrdinalIgnoreCase))
                {
                    file = FraGag.Compression.Prs.Decompress(file);
                }
                using (LevelFileDialog dlg = new LevelFileDialog())
                {
                    dlg.ShowDialog(this);
                    LevelData.geo = new LandTable(file, (int)dlg.NumericUpDown1.Value, (uint)dlg.numericUpDown2.Value, (LandTableFormat)dlg.comboBox2.SelectedIndex);
                }
            }
            LevelData.ClearLevelItems();

            for (int i = 0; i < LevelData.geo.COL.Count; i++)
            {
                LevelData.AddLevelItem((new LevelItem(LevelData.geo.COL[i], i, selectedItems)));
            }

            LevelData.TextureBitmaps = new Dictionary <string, BMPInfo[]>();
            LevelData.Textures       = new Dictionary <string, Texture[]>();
            using (OpenFileDialog a = new OpenFileDialog()
            {
                DefaultExt = "pvm", Filter = "Texture Files|*.pvm;*.gvm;*.prs"
            })
            {
                if (!string.IsNullOrEmpty(LevelData.geo.TextureFileName))
                {
                    a.FileName = LevelData.geo.TextureFileName + ".pvm";
                }
                else
                {
                    a.FileName = string.Empty;
                }
                if (a.ShowDialog(this) == DialogResult.OK)
                {
                    BMPInfo[] TexBmps = TextureArchive.GetTextures(a.FileName);
                    Texture[] texs    = new Texture[TexBmps.Length];
                    for (int j = 0; j < TexBmps.Length; j++)
                    {
                        texs[j] = TexBmps[j].Image.ToTexture(d3ddevice);
                    }
                    string texname = Path.GetFileNameWithoutExtension(a.FileName);
                    if (!LevelData.TextureBitmaps.ContainsKey(texname))
                    {
                        LevelData.TextureBitmaps.Add(texname, TexBmps);
                    }
                    if (!LevelData.Textures.ContainsKey(texname))
                    {
                        LevelData.Textures.Add(texname, texs);
                    }
                    LevelData.leveltexs = texname;
                }
            }
            loaded                           = true;
            transformGizmo                   = new TransformGizmo();
            gizmoSpaceComboBox.Enabled       = false;
            gizmoSpaceComboBox.SelectedIndex = 0;

            clearLevelToolStripMenuItem.Enabled         = LevelData.geo != null;
            calculateAllBoundsToolStripMenuItem.Enabled = LevelData.geo != null;
            statsToolStripMenuItem.Enabled  = LevelData.geo != null;
            selectedItems.SelectionChanged += SelectionChanged;
            UseWaitCursor = false;
            Enabled       = editInfoToolStripMenuItem.Enabled = saveToolStripMenuItem.Enabled = exportToolStripMenuItem.Enabled = importToolStripMenuItem.Enabled = true;

            DrawLevel();
        }
Пример #5
0
        private void LoadFile(string filename)
        {
            loaded = false;
            Environment.CurrentDirectory = Path.GetDirectoryName(filename);
            timer1.Stop();
            scenenum  = 0;
            animframe = -1;
            @event    = new Event(filename);
            meshes    = new List <List <Mesh[]> >();
            bigmeshes = new List <Mesh[]>();
            foreach (EventScene scene in @event.Scenes)
            {
                List <Mesh[]> scenemeshes = new List <Mesh[]>();
                foreach (EventEntity entity in scene.Entities)
                {
                    if (entity.Model != null)
                    {
                        if (entity.Model.HasWeight)
                        {
                            scenemeshes.Add(entity.Model.ProcessWeightedModel().ToArray());
                        }
                        else
                        {
                            entity.Model.ProcessVertexData();
                            NJS_OBJECT[] models  = entity.Model.GetObjects();
                            Mesh[]       entmesh = new Mesh[models.Length];
                            for (int i = 0; i < models.Length; i++)
                            {
                                if (models[i].Attach != null)
                                {
                                    try { entmesh[i] = models[i].Attach.CreateD3DMesh(); }
                                    catch { }
                                }
                            }
                            scenemeshes.Add(entmesh);
                        }
                    }
                    else if (entity.GCModel != null)
                    {
                        entity.GCModel.ProcessVertexData();
                        NJS_OBJECT[] models  = entity.GCModel.GetObjects();
                        Mesh[]       entmesh = new Mesh[models.Length];
                        for (int i = 0; i < models.Length; i++)
                        {
                            if (models[i].Attach != null)
                            {
                                try { entmesh[i] = models[i].Attach.CreateD3DMesh(); }
                                catch { }
                            }
                        }
                        scenemeshes.Add(entmesh);
                    }
                    else
                    {
                        scenemeshes.Add(null);
                    }
                }
                meshes.Add(scenemeshes);
                if (scene.Big?.Model != null)
                {
                    if (scene.Big.Model.HasWeight)
                    {
                        bigmeshes.Add(scene.Big.Model.ProcessWeightedModel().ToArray());
                    }
                    else
                    {
                        scene.Big.Model.ProcessVertexData();
                        NJS_OBJECT[] models  = scene.Big.Model.GetObjects();
                        Mesh[]       entmesh = new Mesh[models.Length];
                        for (int i = 0; i < models.Length; i++)
                        {
                            if (models[i].Attach != null)
                            {
                                try { entmesh[i] = models[i].Attach.CreateD3DMesh(); }
                                catch { }
                            }
                        }
                        bigmeshes.Add(entmesh);
                    }
                }
                else
                {
                    bigmeshes.Add(null);
                }
            }

            TexturePackName = Path.GetFileNameWithoutExtension(filename) + "texture.prs";
            TextureInfo     = TextureArchive.GetTextures(TexturePackName);

            Textures = new Texture[TextureInfo.Length];
            for (int j = 0; j < TextureInfo.Length; j++)
            {
                Textures[j] = TextureInfo[j].Image.ToTexture(d3ddevice);
            }

            loaded         = true;
            selectedObject = null;
            SelectedItemChanged();

            currentFileName = filename;
        }
Пример #6
0
        static void Main(string[] args)
        {
            Environment.CurrentDirectory = @"C:\SONICADVENTUREDX\Projects\ECPort";

            List <BMPInfo> textures  = new List <BMPInfo>(TextureArchive.GetTextures(@"C:\SONICADVENTUREDX\system\BEACH01.PVM"));
            LandTable      landTable = LandTable.LoadFromFile(@"Levels\Emerald Coast\Act 1\LandTable.sa1lvl");

            texmap = new Dictionary <int, int>();
            BMPInfo[] newtexs = TextureArchive.GetTextures(@"C:\SONICADVENTUREDX\system\BEACH03.PVM");
            for (int i = 0; i < newtexs.Length; i++)
            {
                BMPInfo found = textures.FirstOrDefault(a => a.Name.Equals(newtexs[i].Name));
                if (found == null)
                {
                    texmap[i] = textures.Count;
                    textures.Add(newtexs[i]);
                }
                else
                {
                    texmap[i] = textures.IndexOf(found);
                }
            }
            foreach (COL col in LandTable.LoadFromFile(@"Levels\Emerald Coast\Act 3\LandTable.sa1lvl").COL)
            {
                foreach (NJS_MATERIAL mat in ((BasicAttach)col.Model.Attach).Material)
                {
                    mat.TextureID = texmap[mat.TextureID];
                }
                landTable.COL.Add(col);
            }
            texmap  = new Dictionary <int, int>();
            newtexs = TextureArchive.GetTextures(@"C:\SONICADVENTUREDX\system\BEACH02.PVM");
            for (int i = 0; i < newtexs.Length; i++)
            {
                BMPInfo found = textures.FirstOrDefault(a => a.Name.Equals(newtexs[i].Name));
                if (found == null)
                {
                    texmap[i] = textures.Count;
                    textures.Add(newtexs[i]);
                }
                else
                {
                    texmap[i] = textures.IndexOf(found);
                }
            }
            foreach (COL col in LandTable.LoadFromFile(@"Levels\Emerald Coast\Act 2\LandTable.sa1lvl").COL)
            {
                col.Bounds.Center.Z  -= 2000;
                col.Model.Position.Z -= 2000;
                foreach (NJS_MATERIAL mat in ((BasicAttach)col.Model.Attach).Material)
                {
                    mat.TextureID = texmap[mat.TextureID];
                }
                landTable.COL.Add(col);
            }

            texmap  = new Dictionary <int, int>();
            newtexs = TextureArchive.GetTextures(@"C:\SONICADVENTUREDX\system\OBJ_BEACH.PVM");
            for (int i = 0; i < newtexs.Length; i++)
            {
                BMPInfo found = textures.FirstOrDefault(a => a.Name.Equals(newtexs[i].Name));
                if (found == null)
                {
                    texmap[i] = textures.Count;
                    textures.Add(newtexs[i]);
                }
                else
                {
                    texmap[i] = textures.IndexOf(found);
                }
            }

            PAKFile     pak       = new PAKFile();
            List <byte> inf       = new List <byte>();
            string      filenoext = "beach01";
            string      longdir   = "..\\..\\..\\sonic2\\resource\\gd_pc\\prs\\" + filenoext;

            using (System.Windows.Forms.Panel panel = new System.Windows.Forms.Panel())
                using (Direct3D d3d = new Direct3D())
                    using (Device dev = new Device(d3d, 0, DeviceType.Hardware, panel.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters(640, 480)))
                    {
                        for (int i = 0; i < textures.Count; i++)
                        {
                            using (Texture tex = textures[i].Image.ToTexture(dev))
                                using (DataStream str = Surface.ToStream(tex.GetSurfaceLevel(0), ImageFileFormat.Dds))
                                    using (MemoryStream ms = new MemoryStream())
                                    {
                                        str.CopyTo(ms);
                                        pak.Files.Add(new PAKFile.File(filenoext + '\\' + Path.ChangeExtension(textures[i].Name, ".dds"), longdir + '\\' + Path.ChangeExtension(textures[i].Name, ".dds"), ms.ToArray()));
                                    }
                            int infsz = inf.Count;
                            inf.AddRange(Encoding.ASCII.GetBytes(Path.ChangeExtension(textures[i].Name, null)));
                            inf.AddRange(new byte[0x1C - (inf.Count - infsz)]);
                            inf.AddRange(BitConverter.GetBytes(i + 200));
                            inf.AddRange(BitConverter.GetBytes(0));
                            inf.AddRange(BitConverter.GetBytes(0));
                            inf.AddRange(BitConverter.GetBytes(0));
                            inf.AddRange(BitConverter.GetBytes(textures[i].Image.Width));
                            inf.AddRange(BitConverter.GetBytes(textures[i].Image.Height));
                            inf.AddRange(BitConverter.GetBytes(0));
                            inf.AddRange(BitConverter.GetBytes(0x80000000));
                        }
                    }
            pak.Files.Insert(0, new PAKFile.File(filenoext + '\\' + filenoext + ".inf", longdir + '\\' + filenoext + ".inf", inf.ToArray()));
            pak.Save(@"C:\Program Files (x86)\Steam\steamapps\common\Sonic Adventure 2\mods\Emerald Coast\gd_PC\PRS\beach01.pak");

            List <COL> newcollist = new List <COL>();
            Dictionary <string, Attach> visitedAttaches = new Dictionary <string, Attach>();

            foreach (COL col in landTable.COL.Where((col) => col.Model != null && col.Model.Attach != null))
            {
                ConvertCOL(newcollist, visitedAttaches, col);
            }
            landTable.COL = newcollist;

            Console.WriteLine("Loading Object Definitions:");
            Console.WriteLine("Parsing...");

            LevelData.ObjDefs = new List <ObjectDefinition>();
            Dictionary <string, ObjectData> objdefini =
                IniSerializer.Deserialize <Dictionary <string, ObjectData> >("objdefs.ini");

            List <ObjectData> objectErrors = new List <ObjectData>();

            ObjectListEntry[] objlstini = ObjectList.Load(@"Levels\Emerald Coast\Object List.ini", false);
            Directory.CreateDirectory("dllcache").Attributes |= FileAttributes.Hidden;

            List <KeyValuePair <string, string> > compileErrors = new List <KeyValuePair <string, string> >();

            for (int ID = 0; ID < objlstini.Length; ID++)
            {
                string codeaddr = objlstini[ID].CodeString;

                if (!objdefini.ContainsKey(codeaddr))
                {
                    codeaddr = "0";
                }

                ObjectData       defgroup = objdefini[codeaddr];
                ObjectDefinition def;

                if (!string.IsNullOrEmpty(defgroup.CodeFile))
                {
                    Console.WriteLine("Compiling: " + defgroup.CodeFile);


                    def = CompileObjectDefinition(defgroup, out bool errorOccured, out string errorText);

                    if (errorOccured)
                    {
                        KeyValuePair <string, string> errorValue = new KeyValuePair <string, string>(
                            defgroup.CodeFile, errorText);

                        compileErrors.Add(errorValue);
                    }
                }
                else
                {
                    def = new DefaultObjectDefinition();
                }

                LevelData.ObjDefs.Add(def);

                // The only reason .Model is checked for null is for objects that don't yet have any
                // models defined for them. It would be annoying seeing that error all the time!
                if (string.IsNullOrEmpty(defgroup.CodeFile) && !string.IsNullOrEmpty(defgroup.Model))
                {
                    Console.WriteLine("Loading: " + defgroup.Model);
                    // Otherwise, if the model file doesn't exist and/or no texture file is defined,
                    // load the "default object" instead ("?").
                    if (!File.Exists(defgroup.Model))
                    {
                        ObjectData error = new ObjectData {
                            Name = defgroup.Name, Model = defgroup.Model, Texture = defgroup.Texture
                        };
                        objectErrors.Add(error);
                        defgroup.Model = null;
                    }
                }

                def.Init(defgroup, objlstini[ID].Name);
                def.SetInternalName(objlstini[ID].Name);
            }

            // Checks if there have been any errors added to the error list and does its thing
            // This thing is a mess. If anyone can think of a cleaner way to do this, be my guest.
            if (objectErrors.Count > 0)
            {
                int           count        = objectErrors.Count;
                List <string> errorStrings = new List <string> {
                    "The following objects failed to load:"
                };

                foreach (ObjectData o in objectErrors)
                {
                    bool texEmpty  = string.IsNullOrEmpty(o.Texture);
                    bool texExists = (!string.IsNullOrEmpty(o.Texture) && LevelData.Textures.ContainsKey(o.Texture));
                    errorStrings.Add("");
                    errorStrings.Add("Object:\t\t" + o.Name);
                    errorStrings.Add("\tModel:");
                    errorStrings.Add("\t\tName:\t" + o.Model);
                    errorStrings.Add("\t\tExists:\t" + File.Exists(o.Model));
                    errorStrings.Add("\tTexture:");
                    errorStrings.Add("\t\tName:\t" + ((texEmpty) ? "(N/A)" : o.Texture));
                    errorStrings.Add("\t\tExists:\t" + texExists);
                }

                // TODO: Proper logging. Who knows where this file may end up
                File.WriteAllLines("SADXLVL2.log", errorStrings.ToArray());
            }

            // Loading SET Layout
            Console.WriteLine("Loading SET items", "Initializing...");

            List <SETItem> setlist = new List <SETItem>();

            SonicRetro.SAModel.SAEditorCommon.UI.EditorItemSelection selection = new SonicRetro.SAModel.SAEditorCommon.UI.EditorItemSelection();
            if (LevelData.ObjDefs.Count > 0)
            {
                string setstr = @"C:\SONICADVENTUREDX\Projects\ECPort\system\SET0100S.BIN";
                if (File.Exists(setstr))
                {
                    Console.WriteLine("SET: " + setstr.Replace(Environment.CurrentDirectory, ""));

                    setlist = SETItem.Load(setstr, selection);
                }
                setstr = @"C:\SONICADVENTUREDX\Projects\ECPort\system\SET0102B.BIN";
                if (File.Exists(setstr))
                {
                    Console.WriteLine("SET: " + setstr.Replace(Environment.CurrentDirectory, ""));

                    setlist.AddRange(SETItem.Load(setstr, selection));
                }
                setstr = @"C:\SONICADVENTUREDX\Projects\ECPort\system\SET0101S.BIN";
                if (File.Exists(setstr))
                {
                    Console.WriteLine("SET: " + setstr.Replace(Environment.CurrentDirectory, ""));

                    List <SETItem> newlist = SETItem.Load(setstr, selection);
                    foreach (SETItem item in newlist)
                    {
                        item.Position.Z -= 2000;
                    }
                    setlist.AddRange(newlist);
                }
            }

            MatrixStack         transform = new MatrixStack();
            List <SETItem>      add       = new List <SETItem>();
            List <SETItem>      del       = new List <SETItem>();
            List <PalmtreeData> trees     = new List <PalmtreeData>();

            foreach (SETItem item in setlist)
            {
                switch (item.ID)
                {
                case 0xD:                         // item box
                    item.ID      = 0xA;
                    item.Scale.X = itemboxmap[(int)item.Scale.X];
                    break;

                case 0x15:                         // ring group to rings
                    for (int i = 0; i < Math.Min(item.Scale.X + 1, 8); i++)
                    {
                        if (item.Scale.Z == 1)                                 // circle
                        {
                            double  v4 = i * 360.0;
                            Vector3 v7 = new Vector3(
                                ObjectHelper.NJSin((int)(v4 / item.Scale.X * 65536.0 * 0.002777777777777778)) * item.Scale.Y,
                                0,
                                ObjectHelper.NJCos((int)(v4 / item.Scale.X * 65536.0 * 0.002777777777777778)) * item.Scale.Y);
                            transform.Push();
                            transform.NJTranslate(item.Position);
                            transform.NJRotateObject(item.Rotation);
                            Vector3 pos = Vector3.TransformCoordinate(v7, transform.Top);
                            transform.Pop();
                            add.Add(new SETItem(0, selection)
                            {
                                Position = pos.ToVertex()
                            });
                        }
                        else                                 // line
                        {
                            transform.Push();
                            transform.NJTranslate(item.Position);
                            transform.NJRotateObject(item.Rotation);
                            double v5;
                            if (i % 2 == 1)
                            {
                                v5 = i * item.Scale.Y * -0.5;
                            }
                            else
                            {
                                v5 = Math.Ceiling(i * 0.5) * item.Scale.Y;
                            }
                            Vector3 pos = Vector3.TransformCoordinate(new Vector3(0, 0, (float)v5), transform.Top);
                            transform.Pop();
                            add.Add(new SETItem(0, selection)
                            {
                                Position = pos.ToVertex()
                            });
                        }
                    }
                    del.Add(item);
                    break;

                case 0x1A:                         // tikal -> omochao
                    item.ID          = 0x19;
                    item.Position.Y += 3;
                    break;

                case 0x1D:                         // kiki
                    item.ID       = 0x5B;
                    item.Rotation = new Rotation();
                    item.Scale    = new Vertex();
                    break;

                case 0x1F:                         // sweep ->beetle
                    item.ID       = 0x38;
                    item.Rotation = new Rotation();
                    item.Scale    = new Vertex(1, 0, 0);
                    break;

                case 0x28:                         // launch ramp
                    item.ID       = 6;
                    item.Scale.X /= 2.75f;
                    item.Scale.Z  = 0.799999952316284f;
                    break;

                case 0x4F:                         // updraft
                    item.ID      = 0x35;
                    item.Scale.X = Math.Max(Math.Min(item.Scale.X, 200), 10) / 2;
                    item.Scale.Y = Math.Max(Math.Min(item.Scale.Y, 200), 10) / 2;
                    item.Scale.Z = Math.Max(Math.Min(item.Scale.Z, 200), 10) / 2;
                    break;

                case 0x52:                         // item box air
                    item.ID      = 0xB;
                    item.Scale.X = itemboxmap[(int)item.Scale.X];
                    break;

                // palm trees
                case 32:
                case 33:
                case 34:
                case 35:
                    trees.Add(new PalmtreeData((byte)(item.ID - 32), item.Position, item.Rotation));
                    del.Add(item);
                    break;

                // nonsolid objects
                case 47:
                case 48:
                case 49:
                case 50:
                case 51:
                case 52:
                case 59:
                case 62:
                case 63:
                case 64:
                case 70:
                    ConvertSETItem(newcollist, item, false, setlist.IndexOf(item));
                    del.Add(item);
                    break;

                // solid objects
                case 36:
                case 37:
                case 39:
                case 41:
                case 42:
                case 43:
                case 44:
                case 45:
                case 46:
                case 54:
                case 58:
                case 66:
                case 71:
                case 72:
                case 73:
                case 74:
                    ConvertSETItem(newcollist, item, true, setlist.IndexOf(item));
                    del.Add(item);
                    break;

                case 81:                         // goal
                    item.ID          = 0xE;
                    item.Position.Y += 30;
                    break;

                default:
                    if (idmap.ContainsKey(item.ID))
                    {
                        item.ID = idmap[item.ID];
                    }
                    else
                    {
                        del.Add(item);
                    }
                    break;
                }
            }
            setlist.AddRange(add);
            foreach (SETItem item in del)
            {
                setlist.Remove(item);
            }
            setlist.Add(new SETItem(0x55, selection)
            {
                Position = new Vertex(6158.6f, -88f, 2384.97f), Scale = new Vertex(3, 0, 0)
            });
            {
                COL col = new COL()
                {
                    Model = new ModelFile(@"E:\Bridge Model.sa1mdl").Model, SurfaceFlags = SurfaceFlags.Visible
                };
                col.Model.Position = new Vertex(2803, -1, 365);
                foreach (NJS_MATERIAL mat in ((BasicAttach)col.Model.Attach).Material)
                {
                    mat.TextureID = texmap[mat.TextureID];
                }
                col.Model.ProcessVertexData();
                col.CalculateBounds();
                ConvertCOL(newcollist, new Dictionary <string, Attach>(), col);
                col = new COL()
                {
                    Model = new ModelFile(@"E:\Bridge Model COL.sa1mdl").Model, SurfaceFlags = SurfaceFlags.Solid
                };
                col.Model.Position = new Vertex(2803, -1, 365);
                col.Model.ProcessVertexData();
                col.CalculateBounds();
                newcollist.Add(col);
                col = new COL()
                {
                    Model = new ModelFile(@"E:\BridgeSegment0.sa1mdl").Model, SurfaceFlags = SurfaceFlags.Solid
                };
                col.Model.ProcessVertexData();
                col.CalculateBounds();
                newcollist.Add(col);
                col = new COL()
                {
                    Model = new ModelFile(@"E:\BridgeSegment1.sa1mdl").Model, SurfaceFlags = SurfaceFlags.Solid
                };
                col.Model.ProcessVertexData();
                col.CalculateBounds();
                newcollist.Add(col);
                col = new COL()
                {
                    Model = new ModelFile(@"E:\BridgeSegment2.sa1mdl").Model, SurfaceFlags = SurfaceFlags.Solid
                };
                col.Model.ProcessVertexData();
                col.CalculateBounds();
                newcollist.Add(col);
                col = new COL()
                {
                    Model = new ModelFile(@"E:\BridgeSegment3.sa1mdl").Model, SurfaceFlags = SurfaceFlags.Solid
                };
                col.Model.ProcessVertexData();
                col.CalculateBounds();
                newcollist.Add(col);
            }
            landTable.SaveToFile(@"C:\Program Files (x86)\Steam\steamapps\common\Sonic Adventure 2\mods\Emerald Coast\LandTable.sa2lvl", LandTableFormat.SA2);
            ByteConverter.BigEndian = true;
            SETItem.Save(setlist, @"C:\Program Files (x86)\Steam\steamapps\common\Sonic Adventure 2\mods\Emerald Coast\gd_PC\set0013_s.bin");
            for (int i = 0; i < 4; i++)
            {
                ModelFile modelFile = new ModelFile($@"C:\SONICADVENTUREDX\Projects\Test\Objects\Levels\Emerald Coast\YASI{i}.sa1mdl");
                foreach (BasicAttach attach in modelFile.Model.GetObjects().Where(a => a.Attach != null).Select(a => a.Attach))
                {
                    foreach (NJS_MATERIAL mat in attach.Material)
                    {
                        mat.TextureID = texmap[mat.TextureID];
                    }
                }
                modelFile.SaveToFile($@"C:\Program Files (x86)\Steam\steamapps\common\Sonic Adventure 2\mods\Emerald Coast\YASI{i}.sa1mdl");
            }
            using (StreamWriter sw = File.CreateText(@"E:\Documents\Visual Studio 2017\Projects\LevelTest\LevelTest\pt.c"))
                sw.WriteLine(string.Join(",\r\n", trees));
        }
Пример #7
0
        void openFile(string projFileString)
        {
            if (projFileString != null)
            {
                Templates.ProjectTemplate projFile = ProjectFunctions.openProjectFileString(projFileString);
                if (projFile.GameInfo.GameName == "SA2PC")
                {
                    string projFolder = projFile.GameInfo.ProjectFolder;
                    string gameFolder = "";
                    if (projFile.GameInfo.GameDataFolder != null)
                    {
                        gameFolder = Path.Combine(ProjectFunctions.GetGamePath(projFile.GameInfo.GameName), projFile.GameInfo.GameDataFolder);
                    }
                    else
                    {
                        gameFolder = Path.Combine(ProjectFunctions.GetGamePath(projFile.GameInfo.GameName), "resource", "gd_PC");
                    }

                    if (File.Exists(Path.Combine(projFolder, "ADVERTISE_data.ini")))
                    {
                        IniData ini = IniSerializer.Deserialize <IniData>(Path.Combine(projFolder, "ADVERTISE_data.ini"));
                        filename = Path.Combine(projFolder, ini.Files.First((item) => item.Value.Type == "stageselectlist").Value.Filename);
                        levels   = new List <StageSelectLevel>(StageSelectLevelList.Load(filename));
                        string socFilePath = "";
                        string prsFilePath = "";

                        if (projFile.GameInfo.GameName == "SA2PC")
                        {
                            if (File.Exists(Path.Combine(projFolder, "gd_PC", "SOC", "stageMapBG.pak")))
                            {
                                socFilePath = Path.Combine(projFolder, "gd_PC", "SOC", "stageMapBG.pak");
                            }
                            else
                            {
                                socFilePath = Path.Combine(gameFolder, "SOC", "stageMapBG.pak");
                            }

                            if (File.Exists(Path.Combine(projFolder, "gd_PC", "PRS", "stageMap.pak")))
                            {
                                prsFilePath = Path.Combine(projFolder, "gd_PC", "PRS", "stageMap.pak");
                            }
                            else
                            {
                                prsFilePath = Path.Combine(gameFolder, "PRS", "stageMap.pak");
                            }
                        }
                        else
                        {
                            socFilePath = Path.Combine(gameFolder, "stageMapBG.prs");
                            prsFilePath = Path.Combine(gameFolder, "stageMap.prs");
                        }

                        PAKFile socpak = new PAKFile(socFilePath);
                        using (MemoryStream str = new MemoryStream(socpak.Entries.Find((a) => a.Name.Equals("stagemap.dds")).Data))
                            bgtex = LoadDDS(str);

                        if (File.Exists(prsFilePath))
                        {
                            PAKFile pakf = new PAKFile(prsFilePath);
                            byte[]  inf  = pakf.Entries.Find((a) => a.Name.Equals("stagemap.inf")).Data;
                            uitexs = new Bitmap[inf.Length / 0x3C];
                            for (int i = 0; i < uitexs.Length; i++)
                            {
                                using (MemoryStream str = new MemoryStream(pakf.Entries.Find(
                                                                               (a) => a.Name.Equals(Encoding.ASCII.GetString(inf, i * 0x3C, 0x1c).TrimEnd('\0') + ".dds")).Data))
                                    uitexs[i] = LoadDDS(str);
                            }
                        }
                        else
                        {
                            uitexs = TextureArchive.GetTextures(prsFilePath, out bool hasNames).Select((tex) => tex.Image).ToArray();
                        }
                        saveToolStripMenuItem.Enabled = panel1.Enabled = panel2.Enabled = true;
                        selected                = 0;
                        level.SelectedIndex     = (int)levels[selected].Level;
                        character.SelectedIndex = (int)levels[selected].Character;
                        column.Value            = levels[selected].Column;
                        row.Value               = levels[selected].Row;
                        DrawLevel();
                    }
                }
                else
                {
                    MessageBox.Show("The opened project file is not ", "Incorrect File", MessageBoxButtons.OK);
                }
            }
            Program.sapFile = "";
        }