Пример #1
0
 internal static void PatchScript(IWin32Window owner, PatchScript script, PatchProfile profile, SM64Lib.RomManager rommgr)
 {
     try
     {
         TweakBeforeApply?.Invoke();
         var mgr = new PatchingManager();
         mgr.Patch(
             script,
             rommgr,
             owner,
             new Dictionary <string, object>()
         {
             { "romfile", rommgr.RomFile },
             { "rommgr", rommgr },
             { "profilepath", profile?.FileName },
             { "files", profile.EmbeddedFiles },
             { "owner", owner }
         },
             General.GetAdditionalReferencedAssemblied());
         TweakAfterApply?.Invoke();
         MessageBoxEx.Show(owner, "Patched successfully.", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information);
     }
     catch (Exception)
     {
         TweakFailedApply?.Invoke();
         MessageBoxEx.Show(owner, "Error while executing the script. It probably contains errors.", "Script Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
Пример #2
0
 private void SaveSinglePatch(PatchProfile patch)
 {
     if (patch is object)
     {
         var profmgr = new PatchingManager();
         profmgr.Save(patch, Path.Combine(General.MyDataPath, "Tweaks"));
     }
 }
Пример #3
0
 public InfoDumper(SpecialFolders specialFolders, AndroidDebugBridge debugBridge, ModManager modManager, Logger logger, ConfigManager configManager, PatchingManager patchingManager)
 {
     _specialFolders  = specialFolders;
     _debugBridge     = debugBridge;
     _modManager      = modManager;
     _logger          = logger;
     _configManager   = configManager;
     _config          = configManager.GetOrLoadConfig();
     _patchingManager = patchingManager;
 }
        private async Task Reload()
        {
            if (_loggingViewModel != null)
            {
                _loggingViewModel.LoggedText = ""; // Avoid confusing people by not showing existing logs
            }

            ModManager.Reset();
            PatchingManager.ResetInstalledApp();
            await LoadAndHandleErrors();
        }
Пример #5
0
        private void TestScript()
        {
            var             mgr = new PatchingManager();
            var             res = mgr.CompileScript(tempScript, Publics.General.GetAdditionalReferencedAssemblied());
            string          msg = "";
            eTaskDialogIcon icon;
            string          title;

            if (res.Errors.HasErrors)
            {
                title = "Script contains errors";
                icon  = eTaskDialogIcon.Delete;
            }
            else
            {
                title = "Script is OK";
                if (res.Errors.HasWarnings)
                {
                    icon = eTaskDialogIcon.Exclamation;
                }
                else
                {
                    icon = eTaskDialogIcon.Information;
                }
            }

            foreach (CompilerError er in res.Errors)
            {
                if (!string.IsNullOrEmpty(msg))
                {
                    msg += Constants.vbNewLine + Constants.vbNewLine;
                }

                if (er.IsWarning)
                {
                    msg += "WARNING";
                }
                else
                {
                    msg += "ERROR";
                }

                msg += " Code: " + er.ErrorNumber;
                msg += " Line: " + Conversions.ToString(er.Line);
                msg += Constants.vbNewLine + er.ErrorText;
            }

            TaskDialog.Show("Compiler Result", icon, title, msg, eTaskDialogButton.Ok);
        }
Пример #6
0
        public ToolsViewModel(Config config, ProgressViewModel progressView, OperationLocker locker, Window mainWindow, SpecialFolders specialFolders, Logger logger, PatchingManager patchingManager, AndroidDebugBridge debugBridge, QuestPatcherUIService uiService, InfoDumper dumper)
        {
            Config       = config;
            ProgressView = progressView;
            Locker       = locker;

            _mainWindow      = mainWindow;
            _specialFolders  = specialFolders;
            _logger          = logger;
            _patchingManager = patchingManager;
            _debugBridge     = debugBridge;
            _uiService       = uiService;
            _dumper          = dumper;

            _debugBridge.StoppedLogging += (_, _) =>
            {
                _logger.Information("ADB log exited");
                _isAdbLogging = false;
                this.RaisePropertyChanged(nameof(AdbButtonText));
            };
        }
Пример #7
0
        public LoadedViewModel(PatchingViewModel patchingView, ManageModsViewModel manageModsView, LoggingViewModel loggingView, ToolsViewModel toolsView, OtherItemsViewModel otherItemsView, Config config, PatchingManager patchingManager, BrowseImportManager browseManager, Logger logger)
        {
            PatchingView   = patchingView;
            LoggingView    = loggingView;
            ToolsView      = toolsView;
            ManageModsView = manageModsView;
            OtherItemsView = otherItemsView;

            Config           = config;
            _patchingManager = patchingManager;
            _browseManager   = browseManager;
            _logger          = logger;

            _patchingManager.PropertyChanged += (_, args) =>
            {
                if (args.PropertyName == nameof(_patchingManager.InstalledApp) && _patchingManager.InstalledApp != null)
                {
                    this.RaisePropertyChanged(nameof(AppInfo));
                    this.RaisePropertyChanged(nameof(SelectedAppText));
                }
            };
        }
Пример #8
0
        private void ButtonX_Convert_Click(object sender, EventArgs e)
        {
            byte[] bytes;
            var    sb = new StringBuilder();

            ProgBar.Visible         = true;
            ButtonX_Convert.Enabled = false;

            try
            {
                var code = ".org 0x0\n";
                code += fastColoredTextBox_Code.Text;
                bytes = PatchingManager.ConvertAsmToBytes(code);
            }
            catch (Exception)
            {
                bytes = null;
            }

            if (bytes is object)
            {
                foreach (var b in bytes)
                {
                    if (sb.Length != 0)
                    {
                        sb.Append(" ");
                    }
                    sb.Append(b.ToString("X2"));
                }
            }

            textBoxX_Hex.Text = sb.ToString();

            ProgBar.Visible         = false;
            ButtonX_Convert.Enabled = true;
        }
Пример #9
0
        private void LoadTweaks()
        {
            CircularProgress1.Start();
            string pathTweaks = General.MyTweaksPath;
            var    mgr        = new PatchingManager();

            myPatchs.Clear();

            var nullVersion = new Version("0.0.0.0");
            var appVersion  = new Version(Application.ProductVersion);

            foreach (string f in Directory.GetFiles(pathTweaks, "*.xml", SearchOption.AllDirectories).Concat(Directory.GetFiles(pathTweaks, "*.json", SearchOption.AllDirectories)))
            {
                var p = mgr.Read(f);
                if (p.MinVersion <= appVersion && (p.MaxVersion == nullVersion || p.MaxVersion >= appVersion))
                {
                    myPatchs.Add(p);
                }
            }

            myPatchs = myPatchs.OrderBy(n => n.Name).ToList();
            LoadTweakList();
            CircularProgress1.Stop();
        }
Пример #10
0
 public ManageModsViewModel(ModManager modManager, PatchingManager patchingManager, Window mainWindow, OperationLocker locker, ProgressViewModel progressView, BrowseImportManager browseManager)
 {
     ProgressView  = progressView;
     ModsList      = new ModListViewModel("Mods", true, modManager.Mods, modManager, patchingManager, mainWindow, locker, browseManager);
     LibrariesList = new ModListViewModel("Libraries", false, modManager.Libraries, modManager, patchingManager, mainWindow, locker, browseManager);
 }
Пример #11
0
        private void ButtonX_ImportMdl_Click(object sender, EventArgs e)
        {
            ButtonX_ImportMdl.Image = null;
            var pap          = SelectedProfileAndPreset();
            var profile      = pap.profile;
            var preset       = pap.preset;
            int romAddr      = preset.RomAddress; // ValueFromText(TextBoxX_RomAddr.Text)
            int bankAddr     = preset.RamAddress; // ValueFromText(TextBoxX_BankAddr.Text)
            int maxLength    = preset.MaxLength;  // ValueFromText(TextBoxX_MaxLength.Text)
            var pm           = new PatchingManager();
            var scriptparams = new Dictionary <string, object>()
            {
                { "romfile", RomFile },
                { "presetName", preset.Name },
                { "presetDescription", preset.Description },
                { "RomAddress", preset.RomAddress },
                { "RamAddress", preset.RamAddress },
                { "MaxLength", preset.MaxLength },
                { "CollisionPointersArray", preset.CollisionPointers.ToArray() },
                { "GeoPointersArray", preset.GeometryPointers.ToArray() },
                { "ConvertedModelLength", mdl.Length },
                { "ConvertedModel", mdl },
                { "profilepath", profile.FileName },
                { "files", profile.EmbeddedFiles }
            };

            if (maxLength > 0 && mdl.Length > maxLength)
            {
                MessageBoxEx.Show("Model is bigger then the max allowed length!", "Model too big", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            ClearOutput();

            // Execute Script Before
            if (preset.ScriptBefore is object && !string.IsNullOrEmpty(preset.ScriptBefore.Script))
            {
                WriteOutput("Executing Script ...");
                scriptparams.AddOrUpdate("script", preset.ScriptBefore);
                pm.Patch(preset.ScriptBefore, this, scriptparams, General.GetAdditionalReferencedAssemblied());
            }

            int col = -1;
            var geo = Array.Empty <Geopointer>();
            int len = 0;

            ObjectModel.SaveResult sr = null;
            bool iscollisionempty     = mdl.Collision is null;
            bool isf3disempty         = mdl.Fast3DBuffer is null;
            var  fs = new FileStream(_RomFile, FileMode.Open, FileAccess.ReadWrite);
            var  bw = new BinaryWriter(fs);

            // Write to stream
            WriteOutput("Writing Model ...");
            sr = mdl.ToStream(fs, romAddr, romAddr - (bankAddr & 0xFFFFFF), (int)(bankAddr & 0xFF000000));
            if (sr is object)
            {
                geo = sr.GeoPointers.ToArray();
                col = sr.CollisionPointer;
                len = Conversions.ToInteger(sr.Length);
            }

            // Write Collision Pointer
            if (col > -1)
            {
                WriteOutput("Chaning Collision Pointers ...");
                foreach (int cp in SelectedPreset().CollisionPointers)
                {
                    fs.Position = cp;
                    bw.Write(SwapInts.SwapInt32(col));
                }
            }

            // Write Geopointer
            if (geo.Length > 0)
            {
                WriteOutput("Chaning Geometry Pointers ...");
                foreach (int gp in SelectedPreset().GeometryPointers)
                {
                    fs.Position = gp;
                    bw.Write(SwapInts.SwapInt32(geo[0].SegPointer));
                    fs.Position = gp - 4;
                    if (fs.ReadByte() == 0x15)
                    {
                        fs.WriteByte(geo[0].Layer);
                    }
                    else
                    {
                        fs.Position = gp - 8;
                        if (fs.ReadByte() == 0x13)
                        {
                            fs.WriteByte(geo[0].Layer);
                        }
                    }
                }
            }

            fs.Close();
            if (preset.ScriptAfter is object && !string.IsNullOrEmpty(preset.ScriptAfter.Script))
            {
                WriteOutput("Executing Script ...");
                scriptparams.AddOrUpdate("script", preset.ScriptAfter);
                pm.Patch(preset.ScriptAfter, this, scriptparams, General.GetAdditionalReferencedAssemblied());
            }

            if (col > -1)
            {
                WriteOutput($"Collision Pointer:{Constants.vbTab}{sr.CollisionPointer.ToString("X")}");
            }

            foreach (Geopointer g in geo)
            {
                WriteOutput($"DL-Pointer:{Constants.vbTab}{g.SegPointer.ToString("X")} ({g.Layer.ToString()})");
            }
            WriteOutput();
            WriteOutput(DateAndTime.Now.ToShortTimeString() + " - Done");

            // MessageBoxEx.Show("Model has been imported succesfully!", "Model imported", MessageBoxButtons.OK, MessageBoxIcon.Information)
            ButtonX_ImportMdl.Image = My.Resources.Resources.icons8_checkmark_16px_1;
        }