예제 #1
0
        private static Dictionary <string, bool> IsPIFFUser             = new Dictionary <string, bool>(); //if a piff is User, all other piffs for that file are ignored.

        public static void Init(string basePath)
        {
            string[] paths = Directory.GetFiles(basePath, "*.piff", SearchOption.AllDirectories);
            for (int i = 0; i < paths.Length; i++)
            {
                string entry    = paths[i].Replace('\\', '/');
                bool   user     = entry.Contains("User/");
                string filename = Path.GetFileName(entry);

                PIFF    piff;
                IffFile piffFile;
                try
                {
                    piffFile = new IffFile(entry);
                    piff     = piffFile.List <PIFF>()[0];
                }
                catch (Exception)
                {
                    continue;
                }

                if (IsPIFFUser.ContainsKey(piff.SourceIff))
                {
                    var old = IsPIFFUser[piff.SourceIff];
                    if (old != user)
                    {
                        if (user)
                        {
                            //remove old piffs, as they have been overwritten by this user piff.
                            PIFFsByName[piff.SourceIff].Clear();
                            IsPIFFUser[piff.SourceIff] = true;
                        }
                        else
                        {
                            continue;  //a user piff exists. ignore these ones.
                        }
                    }
                }
                else
                {
                    IsPIFFUser.Add(piff.SourceIff, user);
                }

                if (!PIFFsByName.ContainsKey(piff.SourceIff))
                {
                    PIFFsByName.Add(piff.SourceIff, new List <IffFile>());
                }
                PIFFsByName[piff.SourceIff].Add(piffFile);
            }

            string[] otfs = Directory.GetFiles(basePath, "*.otf", SearchOption.AllDirectories);

            foreach (var otf in otfs)
            {
                string entry = otf.Replace('\\', '/');
                OtfRewrite[Path.GetFileName(entry)] = entry;
            }
        }
예제 #2
0
        private static Dictionary <string, bool> IsPIFFUser; //if a piff is User, all other piffs for that file are ignored.

        public static void Init(string basePath)
        {
            PIFFsByName = new Dictionary <string, List <IffFile> >();
            IsPIFFUser  = new Dictionary <string, bool>();

            //Directory.CreateDirectory(basePath);
            if (Directory.Exists("Content/Patch"))
            {
                string[] paths = Directory.GetFiles(basePath, "*.piff", SearchOption.AllDirectories);
                for (int i = 0; i < paths.Length; i++)
                {
                    string entry    = paths[i].Replace('\\', '/');
                    bool   user     = entry.Contains("User/");
                    string filename = Path.GetFileName(entry);

                    IffFile piffFile = new IffFile(entry);
                    PIFF    piff     = piffFile.List <PIFF>()[0];

                    if (IsPIFFUser.ContainsKey(piff.SourceIff))
                    {
                        var old = IsPIFFUser[piff.SourceIff];
                        if (old != user)
                        {
                            if (user)
                            {
                                //remove old piffs, as they have been overwritten by this user piff.
                                PIFFsByName[piff.SourceIff].Clear();
                                IsPIFFUser[piff.SourceIff] = true;
                            }
                            else
                            {
                                continue; //a user piff exists. ignore these ones.
                            }
                        }
                    }
                    else
                    {
                        IsPIFFUser.Add(piff.SourceIff, user);
                    }

                    if (!PIFFsByName.ContainsKey(piff.SourceIff))
                    {
                        PIFFsByName.Add(piff.SourceIff, new List <IffFile>());
                    }
                    PIFFsByName[piff.SourceIff].Add(piffFile);
                }
            }
        }
예제 #3
0
        public void Patch(IffFile piffFile)
        {
            if (RuntimeInfo.State == IffRuntimeState.ReadOnly)
            {
                RuntimeInfo.State = IffRuntimeState.PIFFPatch;
            }
            var piff = piffFile.List <PIFF>()[0];

            //patch existing chunks using the PIFF chunk
            //also delete chunks marked for deletion

            var moveChunks = new List <IffChunk>();
            var newIDs     = new List <ushort>();

            foreach (var e in piff.Entries)
            {
                var type = CHUNK_TYPES[e.Type];

                Dictionary <ushort, object> chunks = null;
                ByChunkId.TryGetValue(type, out chunks);
                if (chunks == null)
                {
                    continue;
                }
                object objC = null;
                chunks.TryGetValue(e.ChunkID, out objC);
                if (objC == null)
                {
                    continue;
                }

                var chunk = (IffChunk)objC;
                if (e.Delete)
                {
                    FullRemoveChunk(chunk); //removed by PIFF
                }
                else
                {
                    chunk.ChunkData = e.Apply(chunk.ChunkData);
                    if (e.ChunkLabel != "")
                    {
                        chunk.ChunkLabel = e.ChunkLabel;
                    }
                    chunk.RuntimeInfo = ChunkRuntimeState.Patched;

                    if (e.ChunkID != e.NewChunkID)
                    {
                        moveChunks.Add(chunk);
                        newIDs.Add(e.NewChunkID);
                    }
                }
            }

            for (int i = 0; i < moveChunks.Count; i++)
            {
                MoveAndSwap(moveChunks[i], newIDs[i]);
            }

            //add chunks present in the piff to the original file
            foreach (var typeG in piffFile.ByChunkType)
            {
                if (typeG.Key == typeof(PIFF))
                {
                    continue;
                }
                foreach (var res in typeG.Value)
                {
                    var chunk = (IffChunk)res;
                    chunk.AddedByPatch = true;
                    if (!ByChunkId.ContainsKey(chunk.GetType()) || !ByChunkId[chunk.GetType()].ContainsKey(chunk.ChunkID))
                    {
                        this.AddChunk(chunk);
                    }
                }
            }
        }
예제 #4
0
        public static void Init(string basePath)
        {
            if (!Directory.Exists(basePath))
            {
                return;
            }
            string[] paths = Directory.GetFiles(basePath, "*.piff", SearchOption.AllDirectories);
            for (int i = 0; i < paths.Length; i++)
            {
                string entry    = paths[i].Replace('\\', '/');
                bool   user     = entry.Contains("User/");
                string filename = Path.GetFileName(entry);

                PIFF    piff;
                IffFile piffFile;
                try
                {
                    piffFile = new IffFile(entry);
                    piff     = piffFile.List <PIFF>()[0];
                }
                catch (Exception)
                {
                    continue;
                }

                if (IsPIFFUser.ContainsKey(piff.SourceIff))
                {
                    var old = IsPIFFUser[piff.SourceIff];
                    if (old != user)
                    {
                        if (user)
                        {
                            //remove old piffs, as they have been overwritten by this user piff.
                            PIFFsByName[piff.SourceIff].Clear();
                            IsPIFFUser[piff.SourceIff] = true;
                        }
                        else
                        {
                            continue;  //a user piff exists. ignore these ones.
                        }
                    }
                }
                else
                {
                    IsPIFFUser.Add(piff.SourceIff, user);
                }

                if (!PIFFsByName.ContainsKey(piff.SourceIff))
                {
                    PIFFsByName.Add(piff.SourceIff, new List <IffFile>());
                }
                PIFFsByName[piff.SourceIff].Add(piffFile);
            }

            string[] otfs = Directory.GetFiles(basePath, "*.otf", SearchOption.AllDirectories);

            foreach (var otf in otfs)
            {
                string entry = otf.Replace('\\', '/');
                OtfRewrite[Path.GetFileName(entry)] = entry;
            }

            foreach (var piffs in PIFFsByName)
            {
                foreach (var piff in piffs.Value)
                {
                    var addedOBJD = piff.List <OBJD>();
                    if (addedOBJD != null)
                    {
                        OBJDAdded.Add(piffs.Key);
                        continue;
                    }

                    var pChunk = piff.List <PIFF>()?.FirstOrDefault();
                    if (pChunk != null && pChunk.Entries.Any(x => x.Type == "OBJD"))
                    {
                        OBJDAdded.Add(piffs.Key);
                        continue;
                    }
                }
            }
        }