Пример #1
0
        public static async Task ApplyChanges(Configuration configuration, CharacterModification[] data)
        {
            var tempFolder = FileWriterUtility.CreateTempFolder();

            // Start with a blank canvas
            RemoveAllChanges(configuration);

            if (data.Length == 0)
            {
                return;
            }

            try
            {
                await ExtractFiles(configuration, tempFolder);

                var json = GenerateCharacterJson(data);

                var virtualreaderFile           = Path.Combine(tempFolder, "presentation", "virtualreaderpc_data.lua");
                var virtualreaderDecompiledFile = Path.Combine(tempFolder, "virtualreaderpc_data_decomp.lua");
                var igpLocksFile = Path.Combine(tempFolder, "igp", "locks__lua.chd");

                await UnluacUtility.Decompile(virtualreaderFile, virtualreaderDecompiledFile);

                // Write any data as required to the virtualreader file, make sure to offset by bytesWritten if needed
                int bytesWritten = 0;
                FileWriterUtility.WriteToFile(virtualreaderDecompiledFile, json, 0x0000A5C6, true, out bytesWritten);

                foreach (var character in data.Where(c => !string.IsNullOrEmpty(c.ReplacementCharacter)))
                {
                    var offset = FindReplacementOffset(igpLocksFile, character.ReplacementCharacter);
                    FileWriterUtility.WriteToFile(igpLocksFile, character.Config.PresentationData.Name, offset, false, out bytesWritten);
                }
            }
            catch (Exception ex)
            {
                Directory.Delete(tempFolder, true);
                return;
            }

            CopyFiles(configuration, tempFolder);
            Directory.Delete(tempFolder, true);
        }
Пример #2
0
        private async Task <InstallationStatus> ApplyChangesInternal(GameModification[] mods, bool ignoreWarnings, bool reverting)
        {
            tempFolder    = CreateTempFolder();
            reservedFiles = GetReservedFiles();
            autoMappings  = GetAutoMappings();
            fileWriter    = new FileWriterUtility();

            // Start with a blank canvas
            RemoveAllChanges(configuration);

            if (mods.Length == 0)
            {
                return(InstallationStatus.Success);
            }

            try
            {
                modActions = GetModActions(mods);

                // Write any data as required to the virtualreader file, make sure to offset by bytesWritten if needed

                foreach (var action in modActions.extractActions)
                {
                    await QuickBMSExtract(action, tempFolder, action.action.UseAutoMapping);
                }

                foreach (var action in modActions.decompileActions)
                {
                    await UnluacDecompile(action, tempFolder);
                }

                var actionStatus = PerformActions(modActions);

                if (actionStatus != InstallationStatus.Success)
                {
                    return(actionStatus);
                }
            }
            catch (Exception ex)
            {
                Logging.LogMessage(ex.ToString(), Logging.LogSeverity.Error);

                if (Directory.Exists(tempFolder))
                {
                    Directory.Delete(tempFolder, true);
                }

                if (reverting)
                {
                    // If we error out during revert, delete everything (something has gone badly wrong)
                    RemoveAllChanges(configuration);
                    return(InstallationStatus.FatalError);
                }
                else
                {
                    // Revert back to the previous install state
                    await ApplyChangesInternal(mods.Take(mods.Count() - 1).ToArray(), true, true);

                    return(InstallationStatus.RolledBackError);
                }
            }
            finally
            {
                if (Directory.Exists(tempFolder))
                {
                    Directory.Delete(tempFolder, true);
                }
            }

            return(InstallationStatus.Success);
        }
Пример #3
0
        public static bool HasEditCollision(GameModification currentMod, string file, IWriteContent content, FileWriterUtility fileWriter, List <FileModification> modifications, out ModCollision collision)
        {
            var actions = new ActionCollection(file, currentMod.Config.ModID, modifications);

            if (actions.moveAction != null)
            {
                return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Moved, actions.moveAction.ModID, ModCollisionSeverity.Clash, out collision));
            }

            if (actions.replaceAction != null)
            {
                return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Replaced, actions.replaceAction.ModID, ModCollisionSeverity.Clash, out collision));
            }

            if (actions.editAction != null && !fileWriter.CanWrite(file, content))
            {
                return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Edited, actions.editAction.ModID, ModCollisionSeverity.Clash, out collision));
            }

            if (actions.deleteAction != null)
            {
                return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Deleted, actions.deleteAction.ModID, ModCollisionSeverity.Clash, out collision));
            }

            collision = null;
            return(false);
        }