├── README.md ├── .gitattributes ├── CTREdit ├── CTREdit.suo ├── CTREdit │ ├── Additional │ │ ├── Readme.txt │ │ ├── Character Icons │ │ │ ├── Roo.png │ │ │ ├── Coco.png │ │ │ ├── Crash.png │ │ │ ├── Dingo.png │ │ │ ├── Fake.png │ │ │ ├── Ngin.png │ │ │ ├── Papu.png │ │ │ ├── Penta.png │ │ │ ├── Polar.png │ │ │ ├── Pura.png │ │ │ ├── Tiny.png │ │ │ ├── Tropy.png │ │ │ ├── Cortex.png │ │ │ ├── Komodo.png │ │ │ ├── NoChar.png │ │ │ └── Pinstripe.png │ │ └── Crash Team Racing save.txt │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ └── Resources.resx │ ├── aboutWindow.cs │ ├── CTREdit.csproj │ ├── Plugin.cs │ ├── aboutWindow.resx │ ├── aboutWindow.Designer.cs │ └── mainWindow.cs ├── CTREdit.userprefs └── CTREdit.sln ├── BCLoader ├── BCLoader.suo ├── BCLoader │ ├── Additional │ │ └── Readme.txt │ ├── BCLoader.csproj.user │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── aboutWindow.cs │ ├── BCLoader.csproj │ ├── xmlSettingsEditor.cs │ ├── aboutWindow.resx │ ├── Plugin.cs │ └── aboutWindow.designer.cs ├── BCLoader.userprefs └── BCLoader.sln ├── SpyroEdit ├── SpyroEdit.suo ├── SpyroEdit │ ├── Additional │ │ ├── Readme.txt │ │ └── Spyro the dragon save.txt │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ └── Resources.resx │ ├── aboutWindow.cs │ ├── Plugin.cs │ ├── SpyroEdit.csproj │ ├── aboutWindow.resx │ ├── mainWindow.resx │ ├── aboutWindow.Designer.cs │ ├── mainWindow.cs │ └── mainWindow.Designer.cs ├── SpyroEdit.userprefs └── SpyroEdit.sln ├── MGSEdit (codename Liquid) ├── Liquid.suo ├── Liquid │ ├── Additional │ │ ├── Readme.txt │ │ └── Metal Gear Solid save.txt │ ├── Resources │ │ └── SolidSnake.png │ ├── Liquid.csproj.user │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ └── Resources.resx │ ├── aboutWindow.cs │ ├── Liquid.csproj │ ├── CRC32.cs │ ├── Plugin.cs │ ├── aboutWindow.resx │ ├── mainWindow.resx │ └── aboutWindow.Designer.cs ├── Liquid.userprefs └── Liquid.sln ├── .gitignore └── LICENSE /README.md: -------------------------------------------------------------------------------- 1 | # memcardrex-plugins 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto -------------------------------------------------------------------------------- /CTREdit/CTREdit.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit.suo -------------------------------------------------------------------------------- /BCLoader/BCLoader.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/BCLoader/BCLoader.suo -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/SpyroEdit/SpyroEdit.suo -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Readme.txt -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/MGSEdit (codename Liquid)/Liquid.suo -------------------------------------------------------------------------------- /BCLoader/BCLoader/Additional/Readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/BCLoader/BCLoader/Additional/Readme.txt -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/Additional/Readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/SpyroEdit/SpyroEdit/Additional/Readme.txt -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Roo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Roo.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Coco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Coco.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Crash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Crash.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Dingo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Dingo.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Fake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Fake.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Ngin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Ngin.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Papu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Papu.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Penta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Penta.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Polar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Polar.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Pura.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Pura.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Tiny.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Tiny.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Tropy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Tropy.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Cortex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Cortex.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Komodo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Komodo.png -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/NoChar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/NoChar.png -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Additional/Readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/MGSEdit (codename Liquid)/Liquid/Additional/Readme.txt -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Character Icons/Pinstripe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/CTREdit/CTREdit/Additional/Character Icons/Pinstripe.png -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Resources/SolidSnake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShendoXT/memcardrex-plugins/HEAD/MGSEdit (codename Liquid)/Liquid/Resources/SolidSnake.png -------------------------------------------------------------------------------- /BCLoader/BCLoader/BCLoader.csproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Liquid.csproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid.userprefs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # General 2 | *.DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | 6 | # Icon must end with two \r 7 | Icon 8 | 9 | 10 | # Thumbnails 11 | ._* 12 | 13 | # Files that might appear in the root of a volume 14 | .DocumentRevisions-V100 15 | .fseventsd 16 | .Spotlight-V100 17 | .TemporaryItems 18 | .Trashes 19 | .VolumeIcon.icns 20 | .com.apple.timemachine.donotpresent 21 | 22 | # Directories potentially created on remote AFP share 23 | .AppleDB 24 | .AppleDesktop 25 | Network Trash Folder 26 | Temporary Items 27 | .apdisk 28 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit.userprefs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /CTREdit/CTREdit.userprefs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /BCLoader/BCLoader.userprefs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /CTREdit/CTREdit.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual C# Express 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CTREdit", "CTREdit\CTREdit.csproj", "{B6D95F54-5E20-4189-98CE-7E213EB0E0C4}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /BCLoader/BCLoader.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual C# Express 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BCLoader", "BCLoader\BCLoader.csproj", "{CCAB2A79-C932-4B55-8C7B-EEE9BE32F8C5}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {CCAB2A79-C932-4B55-8C7B-EEE9BE32F8C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {CCAB2A79-C932-4B55-8C7B-EEE9BE32F8C5}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {CCAB2A79-C932-4B55-8C7B-EEE9BE32F8C5}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {CCAB2A79-C932-4B55-8C7B-EEE9BE32F8C5}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpyroEdit", "SpyroEdit\SpyroEdit.csproj", "{B6D95F54-5E20-4189-98CE-7E213EB0E0C4}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual C# Express 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Liquid", "Liquid\Liquid.csproj", "{80174F17-2239-4A47-B7EC-F7C9A34A5885}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {80174F17-2239-4A47-B7EC-F7C9A34A5885}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {80174F17-2239-4A47-B7EC-F7C9A34A5885}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {80174F17-2239-4A47-B7EC-F7C9A34A5885}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {80174F17-2239-4A47-B7EC-F7C9A34A5885}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Shendo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /CTREdit/CTREdit/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("CTREdit")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Shendo")] 12 | [assembly: AssemblyProduct("CTREdit")] 13 | [assembly: AssemblyCopyright("")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("75bd2c99-a9de-464d-8cdb-f69962961196")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("0.2.0.0")] 36 | [assembly: AssemblyFileVersion("0.2.0.0")] 37 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("SpyroEdit")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Shendo")] 12 | [assembly: AssemblyProduct("SpyroEdit")] 13 | [assembly: AssemblyCopyright("")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("75bd2c99-a9de-464d-8cdb-f69962961196")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("0.4.0.0")] 36 | [assembly: AssemblyFileVersion("0.4.0.0")] 37 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("MGSEdit")] 9 | [assembly: AssemblyDescription("Metal Gear Solid save editor")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Shendo")] 12 | [assembly: AssemblyProduct("MGSEdit")] 13 | [assembly: AssemblyCopyright("")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("1228553d-8461-45f9-975a-51200800154d")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("0.1.0.0")] 36 | [assembly: AssemblyFileVersion("0.1.0.0")] 37 | -------------------------------------------------------------------------------- /BCLoader/BCLoader/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("BCLoader")] 9 | [assembly: AssemblyDescription("Loader plugin for Black Chocobo")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Shendo")] 12 | [assembly: AssemblyProduct("BCLoader")] 13 | [assembly: AssemblyCopyright("Copyright © Shendo 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("061fc652-7370-4192-b405-0c8f04029e5f")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("0.2.0.0")] 36 | [assembly: AssemblyFileVersion("0.2.0.0")] 37 | -------------------------------------------------------------------------------- /BCLoader/BCLoader/aboutWindow.cs: -------------------------------------------------------------------------------- 1 | //Generic about window 2 | //Shendo 2009-2012 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.ComponentModel; 7 | using System.Data; 8 | using System.Drawing; 9 | using System.Text; 10 | using System.Windows.Forms; 11 | 12 | namespace Extras 13 | { 14 | public partial class AboutWindow : Form 15 | { 16 | public AboutWindow() 17 | { 18 | InitializeComponent(); 19 | } 20 | 21 | public void initDialog(string applicationName, string applicationVersion, string supportedGames, string copyrightInfo, string additionalInfo) 22 | { 23 | //Set Window title 24 | this.Text = "About"; 25 | 26 | //Display program name 27 | appNameLabel.Text = applicationName; 28 | 29 | //Display program version 30 | appVersionLabel.Text = "Version: " + applicationVersion; 31 | 32 | //Display program compile date 33 | supportedGamesLabel.Text = supportedGames; 34 | 35 | //Display copyright information 36 | copyrightLabel.Text = copyrightInfo; 37 | 38 | //Display other info 39 | infoLabel.Text = additionalInfo; 40 | 41 | //Resize dialog according to the quantity of text 42 | this.Size = new Size(this.Size.Width, 132 + infoLabel.Height); 43 | 44 | //Display a dialog 45 | this.ShowDialog(); 46 | } 47 | 48 | private void OKbutton_Click(object sender, EventArgs e) 49 | { 50 | //Close the form 51 | this.Close(); 52 | } 53 | 54 | private void AboutWindow_Paint(object sender, PaintEventArgs e) 55 | { 56 | //Draw gray rectangle 57 | e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(80,80,80)), 0, 0, this.Width, 52); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /CTREdit/CTREdit/aboutWindow.cs: -------------------------------------------------------------------------------- 1 | //Generic about window 2 | //Shendo 2009-2012 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.ComponentModel; 7 | using System.Data; 8 | using System.Drawing; 9 | using System.Text; 10 | using System.Windows.Forms; 11 | 12 | namespace CTREdit 13 | { 14 | public partial class AboutWindow : Form 15 | { 16 | public AboutWindow() 17 | { 18 | InitializeComponent(); 19 | } 20 | 21 | public void initDialog(string applicationName, string applicationVersion, string supportedGames, string copyrightInfo, string additionalInfo) 22 | { 23 | //Set Window title 24 | this.Text = "About"; 25 | 26 | //Display program name 27 | appNameLabel.Text = applicationName; 28 | 29 | //Display program version 30 | appVersionLabel.Text = "Version: " + applicationVersion; 31 | 32 | //Display program compile date 33 | supportedGamesLabel.Text = "Save editor for " + supportedGames; 34 | 35 | //Display copyright information 36 | copyrightLabel.Text = copyrightInfo; 37 | 38 | //Display other info 39 | infoLabel.Text = additionalInfo; 40 | 41 | //Resize dialog according to the quantity of text 42 | this.Size = new Size(this.Size.Width, 132 + infoLabel.Height); 43 | 44 | //Display a dialog 45 | this.ShowDialog(); 46 | } 47 | 48 | private void OKbutton_Click(object sender, EventArgs e) 49 | { 50 | //Close the form 51 | this.Close(); 52 | } 53 | 54 | private void AboutWindow_Paint(object sender, PaintEventArgs e) 55 | { 56 | //Draw gray rectangle 57 | e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(80,80,80)), 0, 0, this.Width, 52); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/aboutWindow.cs: -------------------------------------------------------------------------------- 1 | //Generic about window 2 | //Shendo 2009-2012 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.ComponentModel; 7 | using System.Data; 8 | using System.Drawing; 9 | using System.Text; 10 | using System.Windows.Forms; 11 | 12 | namespace SpyroEdit 13 | { 14 | public partial class AboutWindow : Form 15 | { 16 | public AboutWindow() 17 | { 18 | InitializeComponent(); 19 | } 20 | 21 | public void initDialog(string applicationName, string applicationVersion, string supportedGames, string copyrightInfo, string additionalInfo) 22 | { 23 | //Set Window title 24 | this.Text = "About"; 25 | 26 | //Display program name 27 | appNameLabel.Text = applicationName; 28 | 29 | //Display program version 30 | appVersionLabel.Text = "Version: " + applicationVersion; 31 | 32 | //Display program compile date 33 | supportedGamesLabel.Text = "Save editor for " + supportedGames; 34 | 35 | //Display copyright information 36 | copyrightLabel.Text = copyrightInfo; 37 | 38 | //Display other info 39 | infoLabel.Text = additionalInfo; 40 | 41 | //Resize dialog according to the quantity of text 42 | this.Size = new Size(this.Size.Width, 132 + infoLabel.Height); 43 | 44 | //Display a dialog 45 | this.ShowDialog(); 46 | } 47 | 48 | private void OKbutton_Click(object sender, EventArgs e) 49 | { 50 | //Close the form 51 | this.Close(); 52 | } 53 | 54 | private void AboutWindow_Paint(object sender, PaintEventArgs e) 55 | { 56 | //Draw gray rectangle 57 | e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(80,80,80)), 0, 0, this.Width, 52); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/aboutWindow.cs: -------------------------------------------------------------------------------- 1 | //Generic about window 2 | //Shendo 2009-2010 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.ComponentModel; 7 | using System.Data; 8 | using System.Drawing; 9 | using System.Text; 10 | using System.Windows.Forms; 11 | 12 | namespace Liquid 13 | { 14 | public partial class AboutWindow : Form 15 | { 16 | public AboutWindow() 17 | { 18 | InitializeComponent(); 19 | } 20 | 21 | public void initDialog(string applicationName, string applicationVersion, string supportedGames, string copyrightInfo, string additionalInfo) 22 | { 23 | //Set Window title 24 | this.Text = "About"; 25 | 26 | //Display program name 27 | appNameLabel.Text = applicationName; 28 | 29 | //Display program version 30 | appVersionLabel.Text = "Version: " + applicationVersion; 31 | 32 | //Display program compile date 33 | supportedGamesLabel.Text = "Save editor for " + supportedGames; 34 | 35 | //Display copyright information 36 | copyrightLabel.Text = copyrightInfo; 37 | 38 | //Display other info 39 | infoLabel.Text = additionalInfo; 40 | 41 | //Resize dialog according to the quantity of text 42 | this.Size = new Size(this.Size.Width, 132 + infoLabel.Height); 43 | 44 | //Display a dialog 45 | this.ShowDialog(); 46 | } 47 | 48 | private void OKbutton_Click(object sender, EventArgs e) 49 | { 50 | //Close the form 51 | this.Close(); 52 | } 53 | 54 | private void AboutWindow_Paint(object sender, PaintEventArgs e) 55 | { 56 | //Draw gray rectangle 57 | e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(80,80,80)), 0, 0, this.Width, 52); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/Additional/Spyro the dragon save.txt: -------------------------------------------------------------------------------- 1 | Spyro the Dragon (All versions) 2 | 3 | Level name Gems Dragons Eggs 4 | Artisans Home 100 4 0 5 | Stone Hill 200 4 1 6 | Dark Hollow 100 3 0 7 | Town Square 200 4 1 8 | Toasty 100 1 0 9 | Sunny Flight 300 0 0 10 | Peace Keepers Home 200 3 1 11 | Dry Canyon 400 4 1 12 | Cliff Town 400 3 1 13 | Ice Cavern 400 5 0 14 | Doctor Shemp 300 1 0 15 | Night Flight 300 0 0 16 | Magic Crafters Home 300 3 2 17 | Alpine Ridge 500 4 1 18 | High Caves 500 3 2 19 | Wizard Peak 500 3 2 20 | BlowHard 400 1 0 21 | Crystal Flight 300 0 0 22 | Beast Makers Home 300 2 0 23 | Terrace Villiage 400 2 0 24 | Misty Bog 500 4 0 25 | Tree Tops 500 3 0 26 | MetalHead 500 1 0 27 | Wild Flight 300 0 0 28 | Dream Weavers Home 300 3 0 29 | Dark Passage 500 5 0 30 | Lofty Castle 400 3 0 31 | Haunted Towers 500 3 0 32 | Jaques 500 2 0 33 | Icy Flight 300 0 0 34 | Gnorc Gnexus 200 2 0 35 | Gnorc Cove 400 2 0 36 | Twilight Harbor 400 2 0 37 | Gnasty Gnorc 500 0 0 38 | Gnasty's Loot 2000 0 0 39 | 40 | Save structure information: 41 | Values are stored in the little endian byte order 42 | 43 | 0x000 - 128 bytes (Save header) 44 | 0x080 - 512 bytes (Save title + icon) 45 | 0x280 - 1536 bytes (Slot 1) 46 | 0x880 - 1536 bytes (Slot 2) 47 | 0xE80 - 1536 bytes (Slot 3) 48 | 49 | Slot structure: 50 | 0x280 - 8 bit (Start location. Read as decimal: World x 10 + Stage) 51 | 0x281 - 8 bit (SFX volume) - Values range from 0 to 10 52 | 0x282 - 8 bit (Music volume) - Values range from 0 to 10 53 | 0x284 - 8 bit (Passive/Active flag) - Passive is 82 and Active is 2. Probably used for something else too 54 | 0x288 - 8 bit (Stereo/Mono flag) - Stereo is 0 and Mono is 1 55 | 0x28B - 8 bit (Lives) - Maximum is 255 but only 2 digits will be visible ingame 56 | 0x2C0 - 8 bit (Unlocked level flags) - Values range from 0 to 1 57 | 0x308 - 35 x 8 bit (Saved dragons) 58 | 0x32C - 35 x 16 bit (Gems) 59 | 0x374 - 16 x 8 bit (Eggs) 60 | 0x38C - 32 x 8 bit (Flags for collected items) 61 | 0x80C - 32 bit (Checksum) - Sum of all previous bytes from beginning of the slot 62 | 63 | Additional information: 64 | Each slot offsets by 0x600 from the previous one. 65 | 66 | Game progress percentage (120 % max): 67 | 70% - Number of gems (14000 max) 68 | 40% - Number of saved dragons (80 max) 69 | 10% - Unknown 70 | 71 | Shendo 2010 -------------------------------------------------------------------------------- /BCLoader/BCLoader/BCLoader.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 8.0.30703 7 | 2.0 8 | {CCAB2A79-C932-4B55-8C7B-EEE9BE32F8C5} 9 | Library 10 | Properties 11 | BCLoader 12 | BCLoader 13 | v2.0 14 | 512 15 | 16 | 17 | 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | TRACE;DEBUG 23 | prompt 24 | 4 25 | 26 | 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | Form 44 | 45 | 46 | aboutWindow.cs 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | aboutWindow.cs 55 | 56 | 57 | 58 | 65 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Additional/Metal Gear Solid save.txt: -------------------------------------------------------------------------------- 1 | Metal Gear Solid info (US version) 2 | 3 | Weapon order: 4 | Socom 5 | FA-MAS 6 | Grenades 7 | Nikita 8 | Stinger 9 | Claymore 10 | C4 11 | Stun grenades 12 | Chaff grenades 13 | PSG-1 14 | 15 | Item order: 16 | Cigarettes 17 | Magnifying scope 18 | Cardboard box A 19 | Cardboard box B 20 | Cardboard box C 21 | Night-vision goggles 22 | Thermal goggles 23 | Gas mask 24 | Body armor 25 | Ketchup 26 | Stealth 27 | Bandana 28 | Camera 29 | Ration 30 | Cold medicine 31 | Diazepam 32 | PAL card key 33 | ID card 34 | Timer bomb 35 | Mine detector 36 | MO disc 37 | Rope 38 | Handkerchief 39 | Suppressor 40 | 41 | Location order: 42 | Dock 43 | Heliport 44 | Tank Hangar 45 | Cell 46 | Medi room 47 | Armory 48 | Armory Sth 49 | Canyon 50 | Nuke Bldg 1 51 | Nuke Bldg. B1 52 | Cmnder room 53 | Nuke Bldg. B2 54 | Lab 55 | Cave 56 | U.Grnd Pssge 57 | Comm Twr A 58 | Roof/Comm Twr 59 | Comm Twr B 60 | Twr Wall A 61 | Walkway 62 | Snowfield 63 | Blast Furnance 64 | Cargo Elev. 65 | Warehouse 66 | Warehouse Nth 67 | U.Grnd Base 1 68 | U.Grnd Base 2 69 | U.Grnd Base 3 70 | Cmnd room 71 | Spply Rte. 72 | Esc Route 73 | 74 | Save identifier: 75 | GHHMMCLI 76 | 77 | G - Magic letter (G - game, V - training data, C - photo) 78 | HH - Hours 79 | MM - Minutes (EZ starts with 0, NM with q) 80 | C - New or cleared game (Starts with @ - New game, H - Disc 2) 81 | L - Location (Starts with A - Dock) 82 | I - Identifier between similar saves (Starts with A) 83 | 84 | This is just for info when loading game. Identifier data is not used in game. 85 | 86 | Save structure information: 87 | Values are stored in the little endian byte order. 88 | 89 | 0x0000 - 128 bytes (Save Header) 90 | 0x0080 - 512 bytes (Save title + icon) 91 | 0x0280 - 2560 bytes (Save data) 92 | 0x0C80 - 2560 bytes (Save data mirror, not used when loading) 93 | 0x1680 - 2560 bytes (Save data mirror, not used when loading) 94 | 95 | 0x0184 - 32 bit (Checksum) - CRC32 96 | 0x0190 - 32 bit (Game time) - Counted in frames (NTSC - 60 fps, PAL - 50 fps) 97 | 0x01BC - 32 bit (Generic flags, unknown at this time) 98 | 0x01C2 - 16 bit (Game difficulty) - 0-Easy, 1-Normal, 2-Hard, 3-Extreme 99 | 0x01C4 - 16 bit (Option flags) - ????R??? ???????? - (When R is active radar is invisible) 100 | 0x01D6 - 16 bit (Current health) - Anything above 1400 causes issues 101 | 0x01D8 - 16 bit (Maximum health) - Anything above 1400 causes issues 102 | 0x01E2 - 10 x 16 bit (Current weapon units) - If the value is positive weapon is in stock 103 | 0x01F6 - 10 x 16 bit (Maximum weapon units) 104 | 0x020A - 23 x 16 bit (Current item units) - If the value is greater then 0 item is in stock 105 | 0x023A - 16 bit (Maximum Rations) 106 | 0x023C - 16 bit (Maximum Cold medicines) 107 | 0x023E - 16 bit (Maximum Diazepams) 108 | 0x0270 - 8 bit (Number of saves) 109 | 0x02DA - 8 bit (Torture flags) ????O??? - (When O is activated Meryl dies) 110 | 111 | Shendo 2011 - 2012 -------------------------------------------------------------------------------- /CTREdit/CTREdit/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.17929 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CTREdit.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CTREdit.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.1 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SpyroEdit.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SpyroEdit.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/Plugin.cs: -------------------------------------------------------------------------------- 1 | //Spyro the dragon save editor 2 | //Shendo 2010 - 2013 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Text; 7 | using SpyroEdit; 8 | using System.Windows.Forms; 9 | 10 | //Plugin must be in the "rexPluginSystem" namespace in order to be recognised by MemcardRex. 11 | namespace rexPluginSystem 12 | { 13 | //All plugins should incorporate this interface in order to comunicate with MemcardRex 1.6+. 14 | public interface rexPluginInterfaceV2 15 | { 16 | string getPluginName(); 17 | string getPluginAuthor(); 18 | string getPluginSupportedGames(); 19 | string[] getSupportedProductCodes(); 20 | byte[] editSaveData(byte[] gameSaveData, string saveProductCode); 21 | void showAboutDialog(); 22 | void showConfigDialog(); 23 | } 24 | 25 | public class rexPlugin : rexPluginInterfaceV2 26 | { 27 | private const string pluginName = "SpyroEdit"; 28 | private const string pluginVersion = "0.4"; 29 | private const string pluginAuthor = "Shendo"; 30 | private const string pluginSupportedGames = "Spyro the Dragon"; 31 | 32 | //Return Plugin's name (name + plugin version is recommended) 33 | public string getPluginName() 34 | { 35 | return pluginName + " " + pluginVersion; 36 | } 37 | 38 | //Return Author's name. 39 | public string getPluginAuthor() 40 | { 41 | return pluginAuthor; 42 | } 43 | 44 | //Return a list of games supported by the plugin 45 | public string getPluginSupportedGames() 46 | { 47 | return pluginSupportedGames; 48 | } 49 | 50 | //Return a string array of product codes compatible with this plugin. 51 | //In order to make a product-code-independent-plugin one member should be "*.*". 52 | public string[] getSupportedProductCodes() 53 | { 54 | //All versions of Spyro the Dragon are supported 55 | return new string[] { "SCUS-94228", "SCES-01438", "SCPS-10083" }; 56 | } 57 | 58 | //A data to process. Edited save data should be returned. 59 | //Array size depends on the number of slots that specific save takes (Save header (128 bytes) + Number of slots * 8192 bytes). 60 | public byte[] editSaveData(byte[] gameSaveData, string saveProductCode) 61 | { 62 | //Make a new instance of the main window 63 | mainWindow mainDialog = new mainWindow(); 64 | 65 | //Initialize main dialog 66 | return mainDialog.initDialog(pluginName + " " + pluginVersion, gameSaveData); 67 | } 68 | 69 | public void showAboutDialog() 70 | { 71 | new AboutWindow().initDialog(pluginName, pluginVersion, pluginSupportedGames, "Author: " + pluginAuthor, "Supported product codes:\nSCUS-94228 - NTSC U/C.\nSCES-01438 - PAL.\nSCPS-10083 - NTSC J." ); 72 | } 73 | 74 | public void showConfigDialog() 75 | { 76 | MessageBox.Show("This plugin has no options you can configure.", pluginName + " " + pluginVersion); 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.269 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Liquid.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Liquid.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | internal static System.Drawing.Bitmap SolidSnake { 64 | get { 65 | object obj = ResourceManager.GetObject("SolidSnake", resourceCulture); 66 | return ((System.Drawing.Bitmap)(obj)); 67 | } 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /CTREdit/CTREdit/CTREdit.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 8.0.30703 7 | 2.0 8 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4} 9 | Library 10 | Properties 11 | CTREdit 12 | CTREdit 13 | v2.0 14 | 512 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Form 43 | 44 | 45 | aboutWindow.cs 46 | 47 | 48 | Form 49 | 50 | 51 | mainWindow.cs 52 | 53 | 54 | 55 | 56 | True 57 | True 58 | Resources.resx 59 | 60 | 61 | 62 | 63 | aboutWindow.cs 64 | 65 | 66 | mainWindow.cs 67 | 68 | 69 | ResXFileCodeGenerator 70 | Resources.Designer.cs 71 | Designer 72 | 73 | 74 | 75 | 82 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/SpyroEdit.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 8.0.30703 7 | 2.0 8 | {B6D95F54-5E20-4189-98CE-7E213EB0E0C4} 9 | Library 10 | Properties 11 | SpyroEdit 12 | SpyroEdit 13 | v2.0 14 | 512 15 | 16 | 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | pdbonly 27 | true 28 | bin\Release\ 29 | TRACE 30 | prompt 31 | 4 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Form 43 | 44 | 45 | aboutWindow.cs 46 | 47 | 48 | Form 49 | 50 | 51 | mainWindow.cs 52 | 53 | 54 | 55 | 56 | True 57 | True 58 | Resources.resx 59 | 60 | 61 | 62 | 63 | aboutWindow.cs 64 | 65 | 66 | mainWindow.cs 67 | 68 | 69 | ResXFileCodeGenerator 70 | Resources.Designer.cs 71 | Designer 72 | 73 | 74 | 75 | 82 | -------------------------------------------------------------------------------- /CTREdit/CTREdit/Plugin.cs: -------------------------------------------------------------------------------- 1 | //Save editor for Crash Team Racing 2 | //Shendo 2013 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Text; 7 | using CTREdit; 8 | using System.Windows.Forms; 9 | 10 | //Plugin must be in the "rexPluginSystem" namespace in order to be recognised by MemcardRex. 11 | namespace rexPluginSystem 12 | { 13 | //All plugins should incorporate this interface in order to comunicate with MemcardRex 1.6+. 14 | public interface rexPluginInterfaceV2 15 | { 16 | string getPluginName(); 17 | string getPluginAuthor(); 18 | string getPluginSupportedGames(); 19 | string[] getSupportedProductCodes(); 20 | byte[] editSaveData(byte[] gameSaveData, string saveProductCode); 21 | void showAboutDialog(); 22 | void showConfigDialog(); 23 | } 24 | 25 | public class rexPlugin : rexPluginInterfaceV2 26 | { 27 | private const string pluginName = "CTREdit"; 28 | private const string pluginVersion = "0.2"; 29 | private const string pluginAuthor = "Shendo"; 30 | private const string pluginSupportedGames = "Crash Team Racing"; 31 | 32 | //Return Plugin's name (name + plugin version is recommended) 33 | public string getPluginName() 34 | { 35 | return pluginName + " " + pluginVersion; 36 | } 37 | 38 | //Return Author's name. 39 | public string getPluginAuthor() 40 | { 41 | return pluginAuthor; 42 | } 43 | 44 | //Return a list of games supported by the plugin 45 | public string getPluginSupportedGames() 46 | { 47 | return pluginSupportedGames; 48 | } 49 | 50 | //Return a string array of product codes compatible with this plugin. 51 | //In order to make a product-code-independent-plugin one member should be "*.*". 52 | public string[] getSupportedProductCodes() 53 | { 54 | //All versions of CTR are supported 55 | return new string[] { "SCUS-94426", "SCES-02105", "SCPS-10118" }; 56 | } 57 | 58 | //A data to process. Edited save data should be returned. 59 | //Array size depends on the number of slots that specific save takes (Save header (128 bytes) + Number of slots * 8192 bytes). 60 | public byte[] editSaveData(byte[] gameSaveData, string saveProductCode) 61 | { 62 | bool japaneseVersion = false; 63 | 64 | //Check if this is the Japanese version of the game 65 | if (saveProductCode == "SCPS-10118") japaneseVersion = true; 66 | 67 | //Make a new instance of the main window 68 | mainWindow mainDialog = new mainWindow(); 69 | 70 | //Initialize main dialog 71 | return mainDialog.initDialog(pluginName + " " + pluginVersion, gameSaveData, japaneseVersion); 72 | } 73 | 74 | public void showAboutDialog() 75 | { 76 | new AboutWindow().initDialog(pluginName, pluginVersion, pluginSupportedGames, "Author: " + pluginAuthor, 77 | "Supported product codes:\nSCUS-94426 - NTSC U/C.\nSCES-02105 - PAL.\nSCPS-10118 - NTSC J.\n\nThanks to:\n" + 78 | "pSX Author - his pSX emulator with debugger\nallowed me to crack the save checksum." + 79 | "\n\nAll trademarks and copyrights are the\nproperty of their respective owners."); 80 | } 81 | 82 | public void showConfigDialog() 83 | { 84 | MessageBox.Show("This plugin has no options you can configure.", pluginName + " " + pluginVersion); 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Liquid.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 8.0.30703 7 | 2.0 8 | {80174F17-2239-4A47-B7EC-F7C9A34A5885} 9 | Library 10 | Properties 11 | Liquid 12 | Liquid 13 | v2.0 14 | 512 15 | 16 | 17 | 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | Form 44 | 45 | 46 | aboutWindow.cs 47 | 48 | 49 | 50 | Form 51 | 52 | 53 | mainWindow.cs 54 | 55 | 56 | 57 | 58 | True 59 | True 60 | Resources.resx 61 | 62 | 63 | 64 | 65 | aboutWindow.cs 66 | 67 | 68 | mainWindow.cs 69 | 70 | 71 | ResXFileCodeGenerator 72 | Resources.Designer.cs 73 | 74 | 75 | 76 | 77 | 78 | 79 | 86 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/CRC32.cs: -------------------------------------------------------------------------------- 1 | //Public domain CRC32 calculator 2 | //Damien Guard 3 | 4 | using System; 5 | using System.Security.Cryptography; 6 | 7 | namespace Liquid 8 | { 9 | public class Crc32 : HashAlgorithm 10 | { 11 | public const UInt32 DefaultPolynomial = 0xedb88320; 12 | public const UInt32 DefaultSeed = 0xffffffff; 13 | 14 | private UInt32 hash; 15 | private UInt32 seed; 16 | private UInt32[] table; 17 | private static UInt32[] defaultTable; 18 | 19 | public Crc32() 20 | { 21 | table = InitializeTable(DefaultPolynomial); 22 | seed = DefaultSeed; 23 | Initialize(); 24 | } 25 | 26 | public Crc32(UInt32 polynomial, UInt32 seed) 27 | { 28 | table = InitializeTable(polynomial); 29 | this.seed = seed; 30 | Initialize(); 31 | } 32 | 33 | public override void Initialize() 34 | { 35 | hash = seed; 36 | } 37 | 38 | protected override void HashCore(byte[] buffer, int start, int length) 39 | { 40 | hash = CalculateHash(table, hash, buffer, start, length); 41 | } 42 | 43 | protected override byte[] HashFinal() 44 | { 45 | byte[] hashBuffer = UInt32ToBigEndianBytes(~hash); 46 | this.HashValue = hashBuffer; 47 | return hashBuffer; 48 | } 49 | 50 | public override int HashSize 51 | { 52 | get { return 32; } 53 | } 54 | 55 | public static UInt32 Compute(byte[] buffer) 56 | { 57 | return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length); 58 | } 59 | 60 | public static UInt32 Compute(UInt32 seed, byte[] buffer) 61 | { 62 | return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length); 63 | } 64 | 65 | public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer) 66 | { 67 | return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length); 68 | } 69 | 70 | private static UInt32[] InitializeTable(UInt32 polynomial) 71 | { 72 | if (polynomial == DefaultPolynomial && defaultTable != null) 73 | return defaultTable; 74 | 75 | UInt32[] createTable = new UInt32[256]; 76 | for (int i = 0; i < 256; i++) 77 | { 78 | UInt32 entry = (UInt32)i; 79 | for (int j = 0; j < 8; j++) 80 | if ((entry & 1) == 1) 81 | entry = (entry >> 1) ^ polynomial; 82 | else 83 | entry = entry >> 1; 84 | createTable[i] = entry; 85 | } 86 | 87 | if (polynomial == DefaultPolynomial) 88 | defaultTable = createTable; 89 | 90 | return createTable; 91 | } 92 | 93 | private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size) 94 | { 95 | UInt32 crc = seed; 96 | for (int i = start; i < size; i++) 97 | unchecked 98 | { 99 | crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff]; 100 | } 101 | return crc; 102 | } 103 | 104 | private byte[] UInt32ToBigEndianBytes(UInt32 x) 105 | { 106 | return new byte[] { 107 | (byte)((x >> 24) & 0xff), 108 | (byte)((x >> 16) & 0xff), 109 | (byte)((x >> 8) & 0xff), 110 | (byte)(x & 0xff) 111 | }; 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /BCLoader/BCLoader/xmlSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | //XML Writer/Reader class for MemcardRex 2 | //Shendo 2012 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Text; 7 | using System.Xml; 8 | 9 | namespace rexPluginSystem 10 | { 11 | class xmlSettingsEditor 12 | { 13 | //Writer and reader declarations 14 | XmlTextWriter xmlWriter = null; 15 | XmlTextReader xmlReader = null; 16 | 17 | //List of all the XML elements and values 18 | List xmlElements = new List(); 19 | List xmlValues = new List(); 20 | 21 | //In order to read an XML file this function needs to be called 22 | public void openXmlReader(string fileName) 23 | { 24 | xmlReader = new XmlTextReader(fileName); 25 | 26 | //Read every node in the XML file 27 | while (xmlReader.Read()) 28 | { 29 | switch (xmlReader.NodeType) 30 | { 31 | case XmlNodeType.Element: 32 | xmlElements.Add(xmlReader.Name); 33 | break; 34 | 35 | case XmlNodeType.Text: 36 | xmlValues.Add(xmlReader.Value); 37 | break; 38 | } 39 | } 40 | 41 | //Cleanly close the file 42 | xmlReader.Close(); 43 | } 44 | 45 | //Read a key and a value from the XML file 46 | public string readXmlEntry(string key) 47 | { 48 | string returnString = null; 49 | 50 | //Check if the key element exists 51 | if (xmlElements.Contains(key)) 52 | { 53 | returnString = xmlValues[xmlElements.IndexOf(key) - 1]; 54 | } 55 | 56 | return returnString; 57 | } 58 | 59 | //Read a key and an int value from the XML file 60 | public int readXmlEntryInt(string key, int minValue, int maxValue) 61 | { 62 | int returnInt = 0; 63 | string returnString = null; 64 | 65 | //Check if the key element exists 66 | if (xmlElements.Contains(key)) 67 | { 68 | returnString = xmlValues[xmlElements.IndexOf(key) - 1]; 69 | } 70 | 71 | if (int.TryParse(returnString, out returnInt)) 72 | { 73 | //Check if the value is lower then the minimum given value 74 | if (returnInt < minValue) returnInt = minValue; 75 | 76 | //Check if the value exceeds the maximum given value 77 | if (returnInt > maxValue) returnInt = maxValue; 78 | } 79 | 80 | return returnInt; 81 | } 82 | 83 | //In order to write to XML file this function needs to be called 84 | public void openXmlWriter(string fileName, string applicationComment) 85 | { 86 | xmlWriter = new XmlTextWriter(fileName, Encoding.UTF8); 87 | 88 | xmlWriter.WriteStartDocument(); 89 | xmlWriter.WriteComment(applicationComment); 90 | xmlWriter.WriteStartElement("Settings"); 91 | } 92 | 93 | //Write a value in the associated key 94 | public void writeXmlEntry(string key, string value) 95 | { 96 | xmlWriter.WriteStartElement(key); 97 | xmlWriter.WriteString(value); 98 | xmlWriter.WriteEndElement(); 99 | } 100 | 101 | //When program is done writing to XML file clean close is needed 102 | public void closeXmlWriter() 103 | { 104 | xmlWriter.WriteEndElement(); 105 | xmlWriter.WriteEndDocument(); 106 | xmlWriter.Close(); 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Plugin.cs: -------------------------------------------------------------------------------- 1 | //MGSEdit (codename Liquid), a Metal Gear Solid save editor 2 | //Shendo 2010 - 2012 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Text; 7 | using Liquid; 8 | using System.Windows.Forms; 9 | 10 | //Plugin must be in the "rexPluginSystem" namespace in order to be recognised by MemcardRex. 11 | namespace rexPluginSystem 12 | { 13 | //All plugins should incorporate this interface in order to comunicate with MemcardRex 1.6+. 14 | public interface rexPluginInterfaceV2 15 | { 16 | string getPluginName(); 17 | string getPluginAuthor(); 18 | string getPluginSupportedGames(); 19 | string[] getSupportedProductCodes(); 20 | byte[] editSaveData(byte[] gameSaveData, string saveProductCode); 21 | void showAboutDialog(); 22 | void showConfigDialog(); 23 | } 24 | 25 | public class rexPlugin : rexPluginInterfaceV2 26 | { 27 | private const string pluginName = "MGSEdit"; 28 | private const string pluginVersion = "0.1"; 29 | private const string pluginAuthor = "Shendo"; 30 | private const string pluginSupportedGames = "Metal Gear Solid"; 31 | 32 | //Return Plugin's name (name + plugin version is recommended). 33 | public string getPluginName() 34 | { 35 | return pluginName + " " + pluginVersion; 36 | } 37 | 38 | //Return Author's name 39 | public string getPluginAuthor() 40 | { 41 | return pluginAuthor; 42 | } 43 | 44 | //Return a string of supported games 45 | public string getPluginSupportedGames() 46 | { 47 | return pluginSupportedGames; 48 | } 49 | 50 | //Return a string array of product codes compatible with this plugin. 51 | //In order to make a product-code-independent-plugin one member should be "*.*". 52 | public string[] getSupportedProductCodes() 53 | { 54 | //American and European versions are supported 55 | return new string[] { "SLUS-00594", "SLES-01370" }; 56 | } 57 | 58 | //A data to process. Edited save data should be returned. 59 | //Array size depends on the number of slots that specific save takes (Save header (128 bytes) + Number of slots * 8192 bytes). 60 | public byte[] editSaveData(byte[] gameSaveData, string saveProductCode) 61 | { 62 | //Default fps 63 | uint gameFPS = 60; 64 | 65 | //Check if this is a PAL game 66 | if (saveProductCode == "SLES-01370") gameFPS = 50; 67 | 68 | //Check if this is a game data, photo or something else 69 | switch(gameSaveData[22]) 70 | { 71 | default: //Unsupported 72 | MessageBox.Show("The selected save is not a MGS game data.", pluginName + " " + pluginVersion, MessageBoxButtons.OK, MessageBoxIcon.Information); 73 | return null; 74 | 75 | case 67: //Photo 76 | MessageBox.Show("Photos cannot be edited by this plugin.", pluginName + " " + pluginVersion, MessageBoxButtons.OK, MessageBoxIcon.Information); 77 | return null; 78 | 79 | case 71: //Game data 80 | //Make a new instance of the main window 81 | mainWindow mainDialog = new mainWindow(); 82 | 83 | //Initialize main dialog 84 | return mainDialog.initDialog(pluginName + " " + pluginVersion, gameSaveData, gameFPS); 85 | 86 | case 86: //VR training data 87 | MessageBox.Show("Training data cannot be edited by this plugin.", pluginName + " " + pluginVersion, MessageBoxButtons.OK, MessageBoxIcon.Information); 88 | return null; 89 | } 90 | } 91 | 92 | //Show dialog with extended information about the plugin 93 | public void showAboutDialog() 94 | { 95 | new AboutWindow().initDialog(pluginName, pluginVersion,pluginSupportedGames,"Author: " + pluginAuthor, 96 | "Supported product codes:\nSLUS-00594 - NTSC U/C.\nSLES-01370 - PAL.\n\nThanks to:\n" + 97 | "Damien Guard - public domain C# CRC32 code," + 98 | "\n[pec] authors - their awesome tool helped a lot." + 99 | "\n\nAll trademarks and copyrights are the\nproperty of their respective owners."); 100 | } 101 | 102 | //Show configuration dialog if plugin contains configurable options 103 | public void showConfigDialog() 104 | { 105 | MessageBox.Show("This plugin has no options you can configure.", pluginName + " " + pluginVersion); 106 | } 107 | } 108 | } -------------------------------------------------------------------------------- /CTREdit/CTREdit/aboutWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /BCLoader/BCLoader/aboutWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/aboutWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/mainWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /CTREdit/CTREdit/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/aboutWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/mainWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | -------------------------------------------------------------------------------- /BCLoader/BCLoader/Plugin.cs: -------------------------------------------------------------------------------- 1 | //MemcardRex plugin interface 2 | //Shendo 2010 - 2012 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Text; 7 | using System.Windows.Forms; 8 | using System.IO; 9 | using System.Diagnostics; 10 | using Extras; 11 | 12 | //Plugin must be in the "rexPluginSystem" namespace in order to be recognised by MemcardRex. 13 | namespace rexPluginSystem 14 | { 15 | //All plugins should incorporate this interface in order to comunicate with MemcardRex 1.6+. 16 | public interface rexPluginInterfaceV2 17 | { 18 | string getPluginName(); 19 | string getPluginAuthor(); 20 | string getPluginSupportedGames(); 21 | string[] getSupportedProductCodes(); 22 | byte[] editSaveData(byte[] gameSaveData, string saveProductCode); 23 | void showAboutDialog(); 24 | void showConfigDialog(); 25 | } 26 | 27 | public class rexPlugin : rexPluginInterfaceV2 28 | { 29 | private const string pluginName = "BCLoader"; 30 | private const string pluginVersion = "0.2"; 31 | private const string pluginAuthor = "Shendo"; 32 | private const string pluginSupportedGames = "Final Fantasy VII"; 33 | 34 | string BCLocation = null; 35 | string TempLocation = System.IO.Path.GetTempPath(); 36 | string SaveFileName = null; 37 | xmlSettingsEditor XMLSettings = new xmlSettingsEditor(); 38 | 39 | AboutWindow aboutWindow = new AboutWindow(); 40 | 41 | //Return Plugin's name (name + plugin version is recommended) 42 | public string getPluginName() 43 | { 44 | return pluginName + " " + pluginVersion; 45 | } 46 | 47 | //Return Author's name. 48 | public string getPluginAuthor() 49 | { 50 | return pluginAuthor; 51 | } 52 | 53 | //Return a list of games supported by the plugin 54 | public string getPluginSupportedGames() 55 | { 56 | return pluginSupportedGames; 57 | } 58 | 59 | //Return a string array of product codes compatible with this plugin. 60 | //In order to make a product-code-independent-plugin one member should be "*.*". 61 | public string[] getSupportedProductCodes() 62 | { 63 | return new string[] { "SCUS-94163", "SCES-00867", "SCES-00868", "SCES-00869", "SCES-00900", "SLPS-00700", "SLPS-01057" }; 64 | } 65 | 66 | //A data to process. Edited save data should be returned. 67 | //Array size depends on the number of slots that specific save takes (Save header (128 bytes) + Number of slots * 8192 bytes). 68 | public byte[] editSaveData(byte[] gameSaveData, string saveProductCode) 69 | { 70 | byte[] rawSaveData = new byte[8192]; 71 | byte[] rawSaveName = new byte[21]; 72 | 73 | //Load BCLocation from XML file 74 | if (File.Exists("Plugins/BCLoaderSettings.xml")) 75 | { 76 | XMLSettings.openXmlReader("Plugins/BCLoaderSettings.xml"); 77 | BCLocation = XMLSettings.readXmlEntry("BlackChocoboPath"); 78 | } 79 | 80 | //Check if the plugin is configured 81 | if (BCLocation == null) 82 | { 83 | MessageBox.Show("Black Chocobo's path is not set. Open plugin manager to configure it.", pluginName + " " + pluginVersion); 84 | return null; 85 | } 86 | 87 | //Copy RAW data from MCS save 88 | Array.Copy(gameSaveData, 128, rawSaveData, 0, 8192); 89 | 90 | //Copy RAW save name from MCS save 91 | Array.Copy(gameSaveData, 10, rawSaveName, 0, 20); 92 | 93 | //Set save name 94 | SaveFileName = Encoding.Default.GetString(rawSaveName); 95 | 96 | //Filter illegal characters from the name 97 | foreach (char illegalChar in Path.GetInvalidPathChars()) 98 | { 99 | SaveFileName = SaveFileName.Replace(illegalChar.ToString(), ""); 100 | } 101 | 102 | //Create a file in a TEMP directory 103 | File.WriteAllBytes(TempLocation + SaveFileName, rawSaveData); 104 | 105 | //Launch Black Chocobo and wait for it to finish (pass file name as argument) 106 | using (Process proc = Process.Start(BCLocation, TempLocation + SaveFileName)) 107 | { 108 | proc.WaitForExit(); 109 | } 110 | 111 | //Load edited save to array 112 | rawSaveData = File.ReadAllBytes(TempLocation + SaveFileName); 113 | 114 | //Inject edited RAW save data 115 | Array.Copy(rawSaveData, 0, gameSaveData, 128, 8192); 116 | 117 | //Return edited data 118 | return gameSaveData; 119 | } 120 | 121 | public void showAboutDialog() 122 | { 123 | new AboutWindow().initDialog(pluginName, pluginVersion, "Loader plugin for Black Chocobo", "Author: " + pluginAuthor, 124 | "Supported product codes:\nSCUS-94163 - NTSC U/C." + 125 | "\nSCES-00867 - PAL.\nSCES-00868 - PAL.\nSCES-00869 - PAL.\nSCES-00900 - PAL." + 126 | "\nSLPS-00700 - NTSC J.\nSLPS-01057 - NTSC J.\n\n" + 127 | pluginName + " is a loader plugin for Final Fantasy VII save\neditor called Black Chocobo.\n" + 128 | "\nTo select Black Chocobo's exe location\npress the Config button."); 129 | } 130 | 131 | 132 | //Select Black Chocobo's location 133 | public void showConfigDialog() 134 | { 135 | OpenFileDialog OpenFileDLG = new OpenFileDialog(); 136 | 137 | OpenFileDLG.Title = "Select executable"; 138 | OpenFileDLG.Filter = "Black Chocobo|Black_Chocobo.exe"; 139 | 140 | if (OpenFileDLG.ShowDialog() != DialogResult.OK) return; 141 | 142 | //Set the location to a variable 143 | BCLocation = OpenFileDLG.FileName; 144 | 145 | //Save the location to an XML file 146 | XMLSettings.openXmlWriter("Plugins/BCLoaderSettings.xml",pluginName + " " + pluginVersion + " config file"); 147 | XMLSettings.writeXmlEntry("BlackChocoboPath", BCLocation); 148 | XMLSettings.closeXmlWriter(); 149 | } 150 | } 151 | } -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\Resources\SolidSnake.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | -------------------------------------------------------------------------------- /CTREdit/CTREdit/Additional/Crash Team Racing save.txt: -------------------------------------------------------------------------------- 1 | Crash Team Racing info (US version) 2 | 3 | Character indexes: 4 | 0x0 - Crash Bandicoot 5 | 0x1 - Dr. Neo Cortex 6 | 0x2 - Tiny Tiger 7 | 0x3 - Coco Bandicoot 8 | 0x4 - N. Gin 9 | 0x5 - Dingodile 10 | 0x6 - Polar 11 | 0x7 - Pura 12 | 0x8 - Pinstripe 13 | 0x9 - Papu Papu 14 | 0xA - Ripper Roo 15 | 0xB - Komodo Joe 16 | 0xC - Dr. N. Tropy 17 | 0xD - Penta Penguin 18 | 0xE - Fake Crash 19 | 0xF - Nitrous Oxide (game locks up) 20 | 21 | Unsupported indexes (0xF and up) lead to game crashing. 22 | If the index is 0xFFFF save is not active. 23 | 24 | Save structure information: 25 | Values are stored in the little endian byte order. 26 | 27 | 0x0000 - 128 bytes (Save Header) 28 | 0x0080 - 256 bytes (Save title + icon) 29 | 0x0180 - 80 bytes (1st save slot) 30 | 0x01D0 - 80 bytes (2nd save slot) 31 | 0x0220 - 80 bytes (3rd save slot) 32 | 0x0270 - 80 bytes (4th save slot) 33 | 34 | 0x0184 - 8 bit (Colectables flags 1) 35 | bit 1 - Unknown 36 | bit 2 - Unknown 37 | bit 3 - Unknown 38 | bit 4 - Unknown 39 | bit 5 - Unknown 40 | bit 6 - Unknown 41 | bit 7 - Dingo Canyon (trophy) 42 | bit 8 - Dragon Mines (trophy) 43 | 44 | 0x0185 - 8 bit (Colectables flags 2) 45 | bit 1 - Blizzard Bluff (trophy) 46 | bit 2 - Crash Cove (trophy) 47 | bit 3 - Tiger Temple (trophy) 48 | bit 4 - Papu's Pyramid (trophy) 49 | bit 5 - Roo's Tubes (trophy) 50 | bit 6 - Hot Air Skyway (trophy) 51 | bit 7 - Sewer Speedway (trophy) 52 | bit 8 - Mystery Caves (trophy) 53 | 54 | 0x0186 - 8 bit (Colectables flags 3) 55 | bit 1 - Cortex Castle (trophy) 56 | bit 2 - N. Gin Labs (trophy) 57 | bit 3 - Polar Pass (trophy) 58 | bit 4 - Oxide Station (trophy) 59 | bit 5 - Coco Park (trophy) 60 | bit 6 - Tiny Arena (trophy) 61 | bit 7 - Dingo Canyon (blue relic) 62 | bit 8 - Dragon Mines (blue relic) 63 | 64 | 0x0187 - 8 bit (Colectables flags 4) 65 | bit 1 - Blizzard Bluff (blue relic) 66 | bit 2 - Crash Cove (blue relic) 67 | bit 3 - Tiger Temple (blue relic) 68 | bit 4 - Papu's Pyramid (blue relic) 69 | bit 5 - Roo's Tubes (blue relic) 70 | bit 6 - Hot Air Skyway (blue relic) 71 | bit 7 - Sewer Speedway (blue relic) 72 | bit 8 - Mystery Caves (blue relic) 73 | 74 | 0x0188 - 8 bit (Colectables flags 5) 75 | bit 1 - Cortex Castle (blue relic) 76 | bit 2 - N. Gin Labs (blue relic) 77 | bit 3 - Polar Pass (blue relic) 78 | bit 4 - Oxide Station (blue relic) 79 | bit 5 - Coco Park (blue relic) 80 | bit 6 - Tiny Arena (blue relic) 81 | bit 7 - Slide Coliseum (blue relic) 82 | bit 8 - Turbo Track (blue relic) 83 | 84 | 0x0189 - 8 bit (Colectables flags 6) 85 | bit 1 - Dingo Canyon (gold relic) 86 | bit 2 - Dragon Mines (gold relic) 87 | bit 3 - Blizzard Bluff (gold relic) 88 | bit 4 - Crash Cove (gold relic) 89 | bit 5 - Tiger Temple (gold relic) 90 | bit 6 - Papu's Pyramid (gold relic) 91 | bit 7 - Roo's Tubes (gold relic) 92 | bit 8 - Hot Air Skyway (gold relic) 93 | 94 | 0x018A - 8 bit (Colectables flags 7) 95 | bit 1 - Sewer Speedway (gold relic) 96 | bit 2 - Mystery Caves (gold relic) 97 | bit 3 - Cortex Castle (gold relic) 98 | bit 4 - N. Gin Labs (gold relic) 99 | bit 5 - Polar Pass (gold relic) 100 | bit 6 - Oxide Station (gold relic) 101 | bit 7 - Coco Park (gold relic) 102 | bit 8 - Tiny Arena (gold relic) 103 | 104 | 0x018B - 8 bit (Colectables flags 8) 105 | bit 1 - Slide Coliseum (gold relic) 106 | bit 2 - Turbo Track (gold relic) 107 | bit 3 - Dingo Canyon (platinum relic) 108 | bit 4 - Dragon Mines (platinum relic) 109 | bit 5 - Blizzard Bluff (platinum relic) 110 | bit 6 - Crash Cove (platinum relic) 111 | bit 7 - Tiger Temple (platinum relic) 112 | bit 8 - Papu's Pyramid (platinum relic) 113 | 114 | 0x018C - 8 bit (Colectables flags 9) 115 | bit 1 - Roo's Tubes (platinum relic) 116 | bit 2 - Hot Air Skyway (platinum relic) 117 | bit 3 - Sewer Speedway (platinum relic) 118 | bit 4 - Mystery Caves (platinum relic) 119 | bit 5 - Cortex Castle (platinum relic) 120 | bit 6 - N. Gin Labs (platinum relic) 121 | bit 7 - Polar Pass (platinum relic) 122 | bit 8 - Oxide Station (platinum relic) 123 | 124 | 0x018D - 8 bit (Colectables flags 10) 125 | bit 1 - Coco Park (platinum relic) 126 | bit 2 - Tiny Arena (platinum relic) 127 | bit 3 - Slide Coliseum (platinum relic) 128 | bit 4 - Turbo Track (platinum relic) 129 | bit 5 - Dingo Canyon (CTR token) 130 | bit 6 - Dragon Mines (CTR token) 131 | bit 7 - Blizzard Bluff (CTR token) 132 | bit 8 - Crash Cove (CTR token) 133 | 134 | 0x018E - 8 bit (Colectables flags 11) 135 | bit 1 - Tiger Temple (CTR token) 136 | bit 2 - Papu's Pyramid (CTR token) 137 | bit 3 - Roo's Tubes (CTR token) 138 | bit 4 - Hot Air Skyway (CTR token) 139 | bit 5 - Sewer Speedway (CTR token) 140 | bit 6 - Mystery Caves (CTR token) 141 | bit 7 - Cortex Castle (CTR token) 142 | bit 8 - N. Gin Labs (CTR token) 143 | 144 | 0x018F - 8 bit (Colectables flags 12) 145 | bit 1 - Polar Pass (CTR token) 146 | bit 2 - Oxide Station (CTR token) 147 | bit 3 - Coco Park (CTR token) 148 | bit 4 - Tiny Arena (CTR token) 149 | bit 5 - Unknown 150 | bit 6 - Unknown 151 | bit 7 - Ripper Roo (boss) 152 | bit 8 - Papu Papu (boss) 153 | 154 | 0x019C - 9 bytes (User name, standard ASCII, 8 letters + null char) 155 | 0x01AE - 16 bit (Game character) 156 | 157 | 0x02C8 - 8 bit (Character unlockables 1) 158 | bit 1 - Unknown 159 | bit 2 - Unknown 160 | bit 3 - Parking Lot (Battle arena) 161 | bit 4 - The North Bowl (Battle arena) 162 | bit 5 - Lab Basement (Battle arena) 163 | bit 6 - Dr. N. Tropy 164 | bit 7 - Penta Penguin 165 | bit 8 - Ripper Roo 166 | 167 | 0x02C9 - 8 bit (Character unlockables 2) 168 | bit 1 - Papu Papu 169 | bit 2 - Komodo Joe 170 | bit 3 - Pinstripe 171 | bit 4 - Fake Crash 172 | bit 5 - Unknown 173 | bit 6 - Unknown 174 | bit 7 - Unknown 175 | bit 8 - Unknown 176 | 177 | 0x02CC - 8 bit (General unlockables) 178 | bit 1 - Unknown 179 | bit 2 - Unknown 180 | bit 3 - Unknown 181 | bit 4 - Unknown 182 | bit 5 - Scrapbook mode 183 | bit 6 - Unknown 184 | bit 7 - Unknown 185 | bit 8 - Unknown 186 | 187 | 0x17FE - 16 bit (Checksum, big endian) 188 | 189 | Checksum calculation: 190 | 191 | private uint GetChecksumCTR(byte[] InputData) 192 | { 193 | //Simulated PS1 registers 194 | uint r2 = 0; 195 | uint r3 = 0; 196 | uint r4 = 0; 197 | uint r5 = 0; 198 | uint r6 = 0; 199 | uint r7 = 0; 200 | 201 | //Checksum calculation 202 | for (uint i = 0; i < 5760; i++) 203 | { 204 | r5 = InputData[i + 0x180]; 205 | r3 = 0x7; 206 | r7 = 0x10000; 207 | r6 = r7; 208 | r6 = r6 | 0x1021; 209 | 210 | //Erase old checksum 211 | InputData[0x17FE] = 0x00; 212 | InputData[0x17FF] = 0x00; 213 | 214 | while (r3 < 0xFFFF) 215 | { 216 | r4 = r4 << 0x1; 217 | r2 = r5 >> (int)r3; 218 | r2 = r2 & 0x1; 219 | r4 = r4 | r2; 220 | r2 = r4 & r7; 221 | 222 | if (r2 != 0) r4 = r4 ^ r6; 223 | 224 | r3 = (r3 + 0xFFFF) & 0xFFFF; 225 | } 226 | } 227 | 228 | return r4; 229 | } 230 | 231 | Shendo 2013. -------------------------------------------------------------------------------- /CTREdit/CTREdit/aboutWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace CTREdit 2 | { 3 | partial class AboutWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.infoLabel = new System.Windows.Forms.Label(); 32 | this.OKbutton = new System.Windows.Forms.Button(); 33 | this.appNameLabel = new System.Windows.Forms.Label(); 34 | this.appVersionLabel = new System.Windows.Forms.Label(); 35 | this.copyrightLabel = new System.Windows.Forms.Label(); 36 | this.supportedGamesLabel = new System.Windows.Forms.Label(); 37 | this.SuspendLayout(); 38 | // 39 | // infoLabel 40 | // 41 | this.infoLabel.AutoSize = true; 42 | this.infoLabel.ForeColor = System.Drawing.Color.Black; 43 | this.infoLabel.Location = new System.Drawing.Point(8, 60); 44 | this.infoLabel.Name = "infoLabel"; 45 | this.infoLabel.Size = new System.Drawing.Size(115, 13); 46 | this.infoLabel.TabIndex = 1; 47 | this.infoLabel.Text = "infoLabelPlaceholder"; 48 | // 49 | // OKbutton 50 | // 51 | this.OKbutton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 52 | this.OKbutton.FlatStyle = System.Windows.Forms.FlatStyle.System; 53 | this.OKbutton.Location = new System.Drawing.Point(230, 120); 54 | this.OKbutton.Name = "OKbutton"; 55 | this.OKbutton.Size = new System.Drawing.Size(76, 24); 56 | this.OKbutton.TabIndex = 0; 57 | this.OKbutton.Text = "OK"; 58 | this.OKbutton.UseVisualStyleBackColor = true; 59 | this.OKbutton.Click += new System.EventHandler(this.OKbutton_Click); 60 | // 61 | // appNameLabel 62 | // 63 | this.appNameLabel.BackColor = System.Drawing.Color.Transparent; 64 | this.appNameLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 65 | this.appNameLabel.ForeColor = System.Drawing.Color.White; 66 | this.appNameLabel.Location = new System.Drawing.Point(6, 8); 67 | this.appNameLabel.Margin = new System.Windows.Forms.Padding(0); 68 | this.appNameLabel.Name = "appNameLabel"; 69 | this.appNameLabel.Size = new System.Drawing.Size(298, 20); 70 | this.appNameLabel.TabIndex = 3; 71 | // 72 | // appVersionLabel 73 | // 74 | this.appVersionLabel.BackColor = System.Drawing.Color.Transparent; 75 | this.appVersionLabel.ForeColor = System.Drawing.Color.White; 76 | this.appVersionLabel.Location = new System.Drawing.Point(8, 32); 77 | this.appVersionLabel.Name = "appVersionLabel"; 78 | this.appVersionLabel.Size = new System.Drawing.Size(88, 16); 79 | this.appVersionLabel.TabIndex = 4; 80 | // 81 | // copyrightLabel 82 | // 83 | this.copyrightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 84 | this.copyrightLabel.Location = new System.Drawing.Point(8, 124); 85 | this.copyrightLabel.Name = "copyrightLabel"; 86 | this.copyrightLabel.Size = new System.Drawing.Size(212, 16); 87 | this.copyrightLabel.TabIndex = 1; 88 | // 89 | // supportedGamesLabel 90 | // 91 | this.supportedGamesLabel.BackColor = System.Drawing.Color.Transparent; 92 | this.supportedGamesLabel.ForeColor = System.Drawing.Color.White; 93 | this.supportedGamesLabel.Location = new System.Drawing.Point(100, 32); 94 | this.supportedGamesLabel.Name = "supportedGamesLabel"; 95 | this.supportedGamesLabel.Size = new System.Drawing.Size(204, 16); 96 | this.supportedGamesLabel.TabIndex = 6; 97 | this.supportedGamesLabel.TextAlign = System.Drawing.ContentAlignment.TopRight; 98 | // 99 | // AboutWindow 100 | // 101 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 102 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 103 | this.BackColor = System.Drawing.Color.White; 104 | this.ClientSize = new System.Drawing.Size(308, 147); 105 | this.Controls.Add(this.OKbutton); 106 | this.Controls.Add(this.copyrightLabel); 107 | this.Controls.Add(this.supportedGamesLabel); 108 | this.Controls.Add(this.appVersionLabel); 109 | this.Controls.Add(this.appNameLabel); 110 | this.Controls.Add(this.infoLabel); 111 | this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 112 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 113 | this.MaximizeBox = false; 114 | this.MinimizeBox = false; 115 | this.Name = "AboutWindow"; 116 | this.ShowInTaskbar = false; 117 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 118 | this.Text = "aboutWindow"; 119 | this.Paint += new System.Windows.Forms.PaintEventHandler(this.AboutWindow_Paint); 120 | this.ResumeLayout(false); 121 | this.PerformLayout(); 122 | 123 | } 124 | 125 | #endregion 126 | 127 | private System.Windows.Forms.Label infoLabel; 128 | private System.Windows.Forms.Button OKbutton; 129 | private System.Windows.Forms.Label appNameLabel; 130 | private System.Windows.Forms.Label appVersionLabel; 131 | private System.Windows.Forms.Label copyrightLabel; 132 | private System.Windows.Forms.Label supportedGamesLabel; 133 | } 134 | } -------------------------------------------------------------------------------- /BCLoader/BCLoader/aboutWindow.designer.cs: -------------------------------------------------------------------------------- 1 | namespace Extras 2 | { 3 | partial class AboutWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.infoLabel = new System.Windows.Forms.Label(); 32 | this.OKbutton = new System.Windows.Forms.Button(); 33 | this.appNameLabel = new System.Windows.Forms.Label(); 34 | this.appVersionLabel = new System.Windows.Forms.Label(); 35 | this.copyrightLabel = new System.Windows.Forms.Label(); 36 | this.supportedGamesLabel = new System.Windows.Forms.Label(); 37 | this.SuspendLayout(); 38 | // 39 | // infoLabel 40 | // 41 | this.infoLabel.AutoSize = true; 42 | this.infoLabel.ForeColor = System.Drawing.Color.Black; 43 | this.infoLabel.Location = new System.Drawing.Point(8, 60); 44 | this.infoLabel.Name = "infoLabel"; 45 | this.infoLabel.Size = new System.Drawing.Size(115, 13); 46 | this.infoLabel.TabIndex = 1; 47 | this.infoLabel.Text = "infoLabelPlaceholder"; 48 | // 49 | // OKbutton 50 | // 51 | this.OKbutton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 52 | this.OKbutton.FlatStyle = System.Windows.Forms.FlatStyle.System; 53 | this.OKbutton.Location = new System.Drawing.Point(230, 120); 54 | this.OKbutton.Name = "OKbutton"; 55 | this.OKbutton.Size = new System.Drawing.Size(76, 24); 56 | this.OKbutton.TabIndex = 0; 57 | this.OKbutton.Text = "OK"; 58 | this.OKbutton.UseVisualStyleBackColor = true; 59 | this.OKbutton.Click += new System.EventHandler(this.OKbutton_Click); 60 | // 61 | // appNameLabel 62 | // 63 | this.appNameLabel.BackColor = System.Drawing.Color.Transparent; 64 | this.appNameLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 65 | this.appNameLabel.ForeColor = System.Drawing.Color.White; 66 | this.appNameLabel.Location = new System.Drawing.Point(6, 8); 67 | this.appNameLabel.Margin = new System.Windows.Forms.Padding(0); 68 | this.appNameLabel.Name = "appNameLabel"; 69 | this.appNameLabel.Size = new System.Drawing.Size(298, 20); 70 | this.appNameLabel.TabIndex = 3; 71 | // 72 | // appVersionLabel 73 | // 74 | this.appVersionLabel.BackColor = System.Drawing.Color.Transparent; 75 | this.appVersionLabel.ForeColor = System.Drawing.Color.White; 76 | this.appVersionLabel.Location = new System.Drawing.Point(8, 32); 77 | this.appVersionLabel.Name = "appVersionLabel"; 78 | this.appVersionLabel.Size = new System.Drawing.Size(88, 16); 79 | this.appVersionLabel.TabIndex = 4; 80 | // 81 | // copyrightLabel 82 | // 83 | this.copyrightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 84 | this.copyrightLabel.Location = new System.Drawing.Point(8, 124); 85 | this.copyrightLabel.Name = "copyrightLabel"; 86 | this.copyrightLabel.Size = new System.Drawing.Size(212, 16); 87 | this.copyrightLabel.TabIndex = 1; 88 | // 89 | // supportedGamesLabel 90 | // 91 | this.supportedGamesLabel.BackColor = System.Drawing.Color.Transparent; 92 | this.supportedGamesLabel.ForeColor = System.Drawing.Color.White; 93 | this.supportedGamesLabel.Location = new System.Drawing.Point(100, 32); 94 | this.supportedGamesLabel.Name = "supportedGamesLabel"; 95 | this.supportedGamesLabel.Size = new System.Drawing.Size(204, 16); 96 | this.supportedGamesLabel.TabIndex = 6; 97 | this.supportedGamesLabel.TextAlign = System.Drawing.ContentAlignment.TopRight; 98 | // 99 | // AboutWindow 100 | // 101 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 102 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 103 | this.BackColor = System.Drawing.Color.White; 104 | this.ClientSize = new System.Drawing.Size(308, 147); 105 | this.Controls.Add(this.OKbutton); 106 | this.Controls.Add(this.copyrightLabel); 107 | this.Controls.Add(this.supportedGamesLabel); 108 | this.Controls.Add(this.appVersionLabel); 109 | this.Controls.Add(this.appNameLabel); 110 | this.Controls.Add(this.infoLabel); 111 | this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 112 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 113 | this.MaximizeBox = false; 114 | this.MinimizeBox = false; 115 | this.Name = "AboutWindow"; 116 | this.ShowInTaskbar = false; 117 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 118 | this.Text = "aboutWindow"; 119 | this.Paint += new System.Windows.Forms.PaintEventHandler(this.AboutWindow_Paint); 120 | this.ResumeLayout(false); 121 | this.PerformLayout(); 122 | 123 | } 124 | 125 | #endregion 126 | 127 | private System.Windows.Forms.Label infoLabel; 128 | private System.Windows.Forms.Button OKbutton; 129 | private System.Windows.Forms.Label appNameLabel; 130 | private System.Windows.Forms.Label appVersionLabel; 131 | private System.Windows.Forms.Label copyrightLabel; 132 | private System.Windows.Forms.Label supportedGamesLabel; 133 | } 134 | } -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/aboutWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SpyroEdit 2 | { 3 | partial class AboutWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.infoLabel = new System.Windows.Forms.Label(); 32 | this.OKbutton = new System.Windows.Forms.Button(); 33 | this.appNameLabel = new System.Windows.Forms.Label(); 34 | this.appVersionLabel = new System.Windows.Forms.Label(); 35 | this.copyrightLabel = new System.Windows.Forms.Label(); 36 | this.supportedGamesLabel = new System.Windows.Forms.Label(); 37 | this.SuspendLayout(); 38 | // 39 | // infoLabel 40 | // 41 | this.infoLabel.AutoSize = true; 42 | this.infoLabel.ForeColor = System.Drawing.Color.Black; 43 | this.infoLabel.Location = new System.Drawing.Point(8, 60); 44 | this.infoLabel.Name = "infoLabel"; 45 | this.infoLabel.Size = new System.Drawing.Size(115, 13); 46 | this.infoLabel.TabIndex = 1; 47 | this.infoLabel.Text = "infoLabelPlaceholder"; 48 | // 49 | // OKbutton 50 | // 51 | this.OKbutton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 52 | this.OKbutton.FlatStyle = System.Windows.Forms.FlatStyle.System; 53 | this.OKbutton.Location = new System.Drawing.Point(230, 120); 54 | this.OKbutton.Name = "OKbutton"; 55 | this.OKbutton.Size = new System.Drawing.Size(76, 24); 56 | this.OKbutton.TabIndex = 0; 57 | this.OKbutton.Text = "OK"; 58 | this.OKbutton.UseVisualStyleBackColor = true; 59 | this.OKbutton.Click += new System.EventHandler(this.OKbutton_Click); 60 | // 61 | // appNameLabel 62 | // 63 | this.appNameLabel.BackColor = System.Drawing.Color.Transparent; 64 | this.appNameLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 65 | this.appNameLabel.ForeColor = System.Drawing.Color.White; 66 | this.appNameLabel.Location = new System.Drawing.Point(6, 8); 67 | this.appNameLabel.Margin = new System.Windows.Forms.Padding(0); 68 | this.appNameLabel.Name = "appNameLabel"; 69 | this.appNameLabel.Size = new System.Drawing.Size(298, 20); 70 | this.appNameLabel.TabIndex = 3; 71 | // 72 | // appVersionLabel 73 | // 74 | this.appVersionLabel.BackColor = System.Drawing.Color.Transparent; 75 | this.appVersionLabel.ForeColor = System.Drawing.Color.White; 76 | this.appVersionLabel.Location = new System.Drawing.Point(8, 32); 77 | this.appVersionLabel.Name = "appVersionLabel"; 78 | this.appVersionLabel.Size = new System.Drawing.Size(88, 16); 79 | this.appVersionLabel.TabIndex = 4; 80 | // 81 | // copyrightLabel 82 | // 83 | this.copyrightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 84 | this.copyrightLabel.Location = new System.Drawing.Point(8, 124); 85 | this.copyrightLabel.Name = "copyrightLabel"; 86 | this.copyrightLabel.Size = new System.Drawing.Size(212, 16); 87 | this.copyrightLabel.TabIndex = 1; 88 | // 89 | // supportedGamesLabel 90 | // 91 | this.supportedGamesLabel.BackColor = System.Drawing.Color.Transparent; 92 | this.supportedGamesLabel.ForeColor = System.Drawing.Color.White; 93 | this.supportedGamesLabel.Location = new System.Drawing.Point(100, 32); 94 | this.supportedGamesLabel.Name = "supportedGamesLabel"; 95 | this.supportedGamesLabel.Size = new System.Drawing.Size(204, 16); 96 | this.supportedGamesLabel.TabIndex = 6; 97 | this.supportedGamesLabel.TextAlign = System.Drawing.ContentAlignment.TopRight; 98 | // 99 | // AboutWindow 100 | // 101 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 102 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 103 | this.BackColor = System.Drawing.Color.White; 104 | this.ClientSize = new System.Drawing.Size(308, 147); 105 | this.Controls.Add(this.OKbutton); 106 | this.Controls.Add(this.copyrightLabel); 107 | this.Controls.Add(this.supportedGamesLabel); 108 | this.Controls.Add(this.appVersionLabel); 109 | this.Controls.Add(this.appNameLabel); 110 | this.Controls.Add(this.infoLabel); 111 | this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 112 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 113 | this.MaximizeBox = false; 114 | this.MinimizeBox = false; 115 | this.Name = "AboutWindow"; 116 | this.ShowInTaskbar = false; 117 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 118 | this.Text = "aboutWindow"; 119 | this.Paint += new System.Windows.Forms.PaintEventHandler(this.AboutWindow_Paint); 120 | this.ResumeLayout(false); 121 | this.PerformLayout(); 122 | 123 | } 124 | 125 | #endregion 126 | 127 | private System.Windows.Forms.Label infoLabel; 128 | private System.Windows.Forms.Button OKbutton; 129 | private System.Windows.Forms.Label appNameLabel; 130 | private System.Windows.Forms.Label appVersionLabel; 131 | private System.Windows.Forms.Label copyrightLabel; 132 | private System.Windows.Forms.Label supportedGamesLabel; 133 | } 134 | } -------------------------------------------------------------------------------- /MGSEdit (codename Liquid)/Liquid/aboutWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace Liquid 2 | { 3 | partial class AboutWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.infoLabel = new System.Windows.Forms.Label(); 32 | this.OKbutton = new System.Windows.Forms.Button(); 33 | this.appNameLabel = new System.Windows.Forms.Label(); 34 | this.appVersionLabel = new System.Windows.Forms.Label(); 35 | this.copyrightLabel = new System.Windows.Forms.Label(); 36 | this.supportedGamesLabel = new System.Windows.Forms.Label(); 37 | this.SuspendLayout(); 38 | // 39 | // infoLabel 40 | // 41 | this.infoLabel.AutoSize = true; 42 | this.infoLabel.ForeColor = System.Drawing.Color.Black; 43 | this.infoLabel.Location = new System.Drawing.Point(8, 60); 44 | this.infoLabel.Name = "infoLabel"; 45 | this.infoLabel.Size = new System.Drawing.Size(115, 13); 46 | this.infoLabel.TabIndex = 1; 47 | this.infoLabel.Text = "infoLabelPlaceholder"; 48 | // 49 | // OKbutton 50 | // 51 | this.OKbutton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 52 | this.OKbutton.FlatStyle = System.Windows.Forms.FlatStyle.System; 53 | this.OKbutton.Location = new System.Drawing.Point(229, 120); 54 | this.OKbutton.Name = "OKbutton"; 55 | this.OKbutton.Size = new System.Drawing.Size(76, 24); 56 | this.OKbutton.TabIndex = 0; 57 | this.OKbutton.Text = "OK"; 58 | this.OKbutton.UseVisualStyleBackColor = true; 59 | this.OKbutton.Click += new System.EventHandler(this.OKbutton_Click); 60 | // 61 | // appNameLabel 62 | // 63 | this.appNameLabel.BackColor = System.Drawing.Color.Transparent; 64 | this.appNameLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 65 | this.appNameLabel.ForeColor = System.Drawing.Color.White; 66 | this.appNameLabel.Location = new System.Drawing.Point(6, 8); 67 | this.appNameLabel.Margin = new System.Windows.Forms.Padding(0); 68 | this.appNameLabel.Name = "appNameLabel"; 69 | this.appNameLabel.Size = new System.Drawing.Size(298, 20); 70 | this.appNameLabel.TabIndex = 3; 71 | // 72 | // appVersionLabel 73 | // 74 | this.appVersionLabel.BackColor = System.Drawing.Color.Transparent; 75 | this.appVersionLabel.ForeColor = System.Drawing.Color.White; 76 | this.appVersionLabel.Location = new System.Drawing.Point(8, 32); 77 | this.appVersionLabel.Name = "appVersionLabel"; 78 | this.appVersionLabel.Size = new System.Drawing.Size(88, 16); 79 | this.appVersionLabel.TabIndex = 4; 80 | // 81 | // copyrightLabel 82 | // 83 | this.copyrightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 84 | this.copyrightLabel.Location = new System.Drawing.Point(8, 124); 85 | this.copyrightLabel.Name = "copyrightLabel"; 86 | this.copyrightLabel.Size = new System.Drawing.Size(212, 16); 87 | this.copyrightLabel.TabIndex = 1; 88 | // 89 | // supportedGamesLabel 90 | // 91 | this.supportedGamesLabel.BackColor = System.Drawing.Color.Transparent; 92 | this.supportedGamesLabel.ForeColor = System.Drawing.Color.White; 93 | this.supportedGamesLabel.Location = new System.Drawing.Point(100, 32); 94 | this.supportedGamesLabel.Name = "supportedGamesLabel"; 95 | this.supportedGamesLabel.Size = new System.Drawing.Size(204, 16); 96 | this.supportedGamesLabel.TabIndex = 6; 97 | this.supportedGamesLabel.TextAlign = System.Drawing.ContentAlignment.TopRight; 98 | // 99 | // AboutWindow 100 | // 101 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 102 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 103 | this.BackColor = System.Drawing.Color.White; 104 | this.ClientSize = new System.Drawing.Size(308, 147); 105 | this.Controls.Add(this.OKbutton); 106 | this.Controls.Add(this.copyrightLabel); 107 | this.Controls.Add(this.supportedGamesLabel); 108 | this.Controls.Add(this.appVersionLabel); 109 | this.Controls.Add(this.appNameLabel); 110 | this.Controls.Add(this.infoLabel); 111 | this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); 112 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 113 | this.MaximizeBox = false; 114 | this.MinimizeBox = false; 115 | this.Name = "AboutWindow"; 116 | this.ShowInTaskbar = false; 117 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 118 | this.Text = "aboutWindow"; 119 | this.Paint += new System.Windows.Forms.PaintEventHandler(this.AboutWindow_Paint); 120 | this.ResumeLayout(false); 121 | this.PerformLayout(); 122 | 123 | } 124 | 125 | #endregion 126 | 127 | private System.Windows.Forms.Label infoLabel; 128 | private System.Windows.Forms.Button OKbutton; 129 | private System.Windows.Forms.Label appNameLabel; 130 | private System.Windows.Forms.Label appVersionLabel; 131 | private System.Windows.Forms.Label copyrightLabel; 132 | private System.Windows.Forms.Label supportedGamesLabel; 133 | } 134 | } -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/mainWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Text; 7 | using System.Windows.Forms; 8 | 9 | namespace SpyroEdit 10 | { 11 | public partial class mainWindow : Form 12 | { 13 | //Flag for the return value 14 | private bool confirmedFlag = false; 15 | 16 | //A flag for the first run 17 | private bool firstRun = true; 18 | 19 | //Currently edited slot 20 | private int currentSaveSlot = 0; 21 | 22 | //Currently edited level 23 | private int currentLevel = 0; 24 | 25 | //A data to edit 26 | private byte[] saveData = null; 27 | 28 | //Egg information for first 16 levels 29 | private byte[] eggInfo = { 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 2, 1, 2, 2 }; 30 | 31 | public mainWindow() 32 | { 33 | InitializeComponent(); 34 | } 35 | 36 | //Set up dialog and fetch data 37 | public byte[] initDialog(string windowTitle, byte[] gameSaveData) 38 | { 39 | this.Text = windowTitle; 40 | saveData = gameSaveData; 41 | loadData(currentSaveSlot, currentLevel); 42 | loadLocation(currentSaveSlot); 43 | 44 | //Init default values 45 | firstRun = true; 46 | SlotCombo.SelectedIndex = 0; 47 | levelListbox.SelectedIndex = currentLevel; 48 | 49 | this.ShowDialog(); 50 | 51 | //Check what kind of data should be returned to host application (MemcardRex) 52 | if (confirmedFlag == true) return saveData; else return null; 53 | } 54 | 55 | //Update slot (save old data, load new data) 56 | private void updateSlot(int slotValue) 57 | { 58 | //Save old data 59 | if (firstRun == false) updateData(currentSaveSlot, currentLevel); 60 | 61 | //Update current slot 62 | currentSaveSlot = slotValue; 63 | 64 | //Load new data 65 | loadData(currentSaveSlot, currentLevel); 66 | 67 | //Load player location 68 | loadLocation(currentSaveSlot); 69 | 70 | //This is no longer first run 71 | firstRun = false; 72 | } 73 | 74 | //Load data from the save 75 | private void loadData(int slotNumber, int levelNumber) 76 | { 77 | byte tempEggInfo = 0; 78 | 79 | //Load gems, dragons, lives and eggs 80 | livesNumeric.Value = saveData[0x28B + (slotNumber * 0x600)]; 81 | dragonsNumeric.Value = saveData[0x308 + (slotNumber * 0x600) + levelNumber]; 82 | gemsNumeric.Value = saveData[0x32C + (slotNumber * 0x600) + (levelNumber * 2)] | (saveData[0x32C + (slotNumber * 0x600) + (levelNumber * 2) + 1]<<8); 83 | 84 | //Disable and clear egg checkbox 85 | eggsCheckBox.Checked = false; 86 | eggsCheckBox.Enabled = false; 87 | 88 | //Clear unlocked checkbox 89 | unlockedCheckBox.Checked = false; 90 | 91 | //Check if selected level is unlocked 92 | if (saveData[0x2C0 + currentLevel + (slotNumber * 0x600)] == 1) 93 | unlockedCheckBox.Checked = true; 94 | 95 | if (currentLevel < 16) 96 | { 97 | tempEggInfo = saveData[0x374 + currentLevel + (slotNumber * 0x600)]; 98 | 99 | //Enable checkbox for levels with eggs 100 | if (eggInfo[currentLevel] > 0) 101 | { 102 | eggsCheckBox.Enabled = true; 103 | 104 | //Check checkbox if eggs are collected 105 | if (tempEggInfo == eggInfo[currentLevel]) 106 | { 107 | eggsCheckBox.Checked = true; 108 | } 109 | } 110 | } 111 | } 112 | 113 | //Place data in the save 114 | private void updateData(int slotNumber, int levelNumber) 115 | { 116 | //Store lives and dragons (8 bit) 117 | saveData[0x28B + (slotNumber * 0x600)] = (byte)livesNumeric.Value; 118 | saveData[0x308 + (slotNumber * 0x600) + levelNumber] = (byte)dragonsNumeric.Value; 119 | 120 | //Store gems in little-endian byte order (16 bit) 121 | saveData[0x32C + (slotNumber * 0x600) + (levelNumber * 2)] = (byte)((uint)gemsNumeric.Value & 0xFF); 122 | saveData[0x32C + (slotNumber * 0x600) + (levelNumber * 2) + 1] = (byte)(((uint)gemsNumeric.Value & 0xFF00)>>8); 123 | 124 | calcChecksum(slotNumber); 125 | } 126 | 127 | //Display player location 128 | private void loadLocation(int slotNumber) 129 | { 130 | int stageIndex = 0; 131 | 132 | //In case of a failure 133 | locationLabelName.Text = "Unknown"; 134 | 135 | //Load location name 136 | if (saveData[0x280 + (slotNumber * 0x600)] >= 10) 137 | { 138 | stageIndex = ((saveData[0x280 + (slotNumber * 0x600)] - 10) / 10) * 6; //World index 139 | stageIndex += ((saveData[0x280 + (slotNumber * 0x600)] - 10) % 10); //Stage index 140 | 141 | if (stageIndex < levelListbox.Items.Count) 142 | { 143 | locationLabelName.Text = levelListbox.Items[stageIndex].ToString(); 144 | } 145 | } 146 | } 147 | 148 | //Apply a new location 149 | private void setLocation(int slotNumber) 150 | { 151 | byte outputValue = 10; //Default location (Artisans Home) 152 | 153 | outputValue = (byte)(((levelListbox.SelectedIndex / 6)*10)+10); //World index 154 | outputValue += (byte)(levelListbox.SelectedIndex % 6); //Stage index 155 | 156 | //Place data 157 | saveData[0x280 + (slotNumber * 0x600)] = outputValue; 158 | 159 | //Reload data 160 | loadLocation(currentSaveSlot); 161 | } 162 | 163 | //Calculate checksum for the currently selected slot 164 | private void calcChecksum(int slotNumber) 165 | { 166 | int saveChecksum = 0; 167 | 168 | for (int i = 0; i < 1420; i++) 169 | { 170 | saveChecksum += saveData[0x280 + (slotNumber * 0x600) + i]; 171 | } 172 | 173 | //Store checksum in little-endian byte order 174 | saveData[0x80C + (slotNumber * 0x600)] = (byte)(saveChecksum & 0xFF); 175 | saveData[0x80D + (slotNumber * 0x600)] = (byte)((saveChecksum & 0xFF00) >> 8); 176 | saveData[0x80E + (slotNumber * 0x600)] = (byte)((saveChecksum & 0xFF0000) >> 16); 177 | saveData[0x80F + (slotNumber * 0x600)] = (byte)((saveChecksum & 0xFF000000) >> 24); 178 | } 179 | 180 | private void cancelButton_Click(object sender, EventArgs e) 181 | { 182 | this.Close(); 183 | } 184 | 185 | private void okButton_Click(object sender, EventArgs e) 186 | { 187 | //Update save data 188 | updateData(currentSaveSlot, currentLevel); 189 | 190 | //Edited data should be return after pressing OK button 191 | confirmedFlag = true; 192 | this.Close(); 193 | } 194 | 195 | private void levelListbox_SelectedIndexChanged(object sender, EventArgs e) 196 | { 197 | //Update current save data 198 | updateData(currentSaveSlot, currentLevel); 199 | 200 | //Set the new active level 201 | currentLevel = levelListbox.SelectedIndex; 202 | 203 | //Load new data 204 | loadData(currentSaveSlot, currentLevel); 205 | } 206 | 207 | private void setLocationButton_Click(object sender, EventArgs e) 208 | { 209 | //Apply selected location 210 | setLocation(currentSaveSlot); 211 | } 212 | 213 | private void eggsCheckBox_Click(object sender, EventArgs e) 214 | { 215 | if (eggsCheckBox.Checked == true) 216 | { 217 | //Update flag 218 | saveData[0x374 + currentLevel + (currentSaveSlot * 0x600)] = eggInfo[currentLevel]; 219 | } 220 | else 221 | { 222 | //Clear flag 223 | saveData[0x374 + currentLevel + (currentSaveSlot * 0x600)] = 0; 224 | } 225 | } 226 | 227 | private void unlockedCheckBox_Click(object sender, EventArgs e) 228 | { 229 | if (unlockedCheckBox.Checked == true) 230 | { 231 | //Unlock level 232 | saveData[0x2C0 + currentLevel + (currentSaveSlot * 0x600)] = 1; 233 | } 234 | else 235 | { 236 | //Lock level 237 | saveData[0x2C0 + currentLevel + (currentSaveSlot * 0x600)] = 0; 238 | } 239 | } 240 | 241 | private void mainWindow_Paint(object sender, PaintEventArgs e) 242 | { 243 | //Draw gray rectangle 244 | e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(80, 80, 80)), 0, 0, this.Width, 30); 245 | } 246 | 247 | private void SlotCombo_SelectedIndexChanged(object sender, EventArgs e) 248 | { 249 | //Set current save slot 250 | updateSlot(SlotCombo.SelectedIndex); 251 | } 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /SpyroEdit/SpyroEdit/mainWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SpyroEdit 2 | { 3 | partial class mainWindow 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.okButton = new System.Windows.Forms.Button(); 32 | this.cancelButton = new System.Windows.Forms.Button(); 33 | this.livesLabel = new System.Windows.Forms.Label(); 34 | this.livesNumeric = new System.Windows.Forms.NumericUpDown(); 35 | this.dragonsLabel = new System.Windows.Forms.Label(); 36 | this.dragonsNumeric = new System.Windows.Forms.NumericUpDown(); 37 | this.levelListbox = new System.Windows.Forms.ListBox(); 38 | this.gemsNumeric = new System.Windows.Forms.NumericUpDown(); 39 | this.gemsLabel = new System.Windows.Forms.Label(); 40 | this.locationLabel = new System.Windows.Forms.Label(); 41 | this.setLocationButton = new System.Windows.Forms.Button(); 42 | this.locationLabelName = new System.Windows.Forms.Label(); 43 | this.eggsCheckBox = new System.Windows.Forms.CheckBox(); 44 | this.unlockedCheckBox = new System.Windows.Forms.CheckBox(); 45 | this.SlotCombo = new System.Windows.Forms.ComboBox(); 46 | ((System.ComponentModel.ISupportInitialize)(this.livesNumeric)).BeginInit(); 47 | ((System.ComponentModel.ISupportInitialize)(this.dragonsNumeric)).BeginInit(); 48 | ((System.ComponentModel.ISupportInitialize)(this.gemsNumeric)).BeginInit(); 49 | this.SuspendLayout(); 50 | // 51 | // okButton 52 | // 53 | this.okButton.Location = new System.Drawing.Point(184, 236); 54 | this.okButton.Name = "okButton"; 55 | this.okButton.Size = new System.Drawing.Size(75, 23); 56 | this.okButton.TabIndex = 99; 57 | this.okButton.Text = "OK"; 58 | this.okButton.UseVisualStyleBackColor = true; 59 | this.okButton.Click += new System.EventHandler(this.okButton_Click); 60 | // 61 | // cancelButton 62 | // 63 | this.cancelButton.Location = new System.Drawing.Point(264, 236); 64 | this.cancelButton.Name = "cancelButton"; 65 | this.cancelButton.Size = new System.Drawing.Size(75, 23); 66 | this.cancelButton.TabIndex = 0; 67 | this.cancelButton.Text = "Cancel"; 68 | this.cancelButton.UseVisualStyleBackColor = true; 69 | this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); 70 | // 71 | // livesLabel 72 | // 73 | this.livesLabel.Location = new System.Drawing.Point(188, 96); 74 | this.livesLabel.Name = "livesLabel"; 75 | this.livesLabel.Size = new System.Drawing.Size(68, 13); 76 | this.livesLabel.TabIndex = 4; 77 | this.livesLabel.Text = "Lives:"; 78 | this.livesLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 79 | // 80 | // livesNumeric 81 | // 82 | this.livesNumeric.Location = new System.Drawing.Point(260, 92); 83 | this.livesNumeric.Maximum = new decimal(new int[] { 84 | 255, 85 | 0, 86 | 0, 87 | 0}); 88 | this.livesNumeric.Name = "livesNumeric"; 89 | this.livesNumeric.Size = new System.Drawing.Size(76, 20); 90 | this.livesNumeric.TabIndex = 6; 91 | // 92 | // dragonsLabel 93 | // 94 | this.dragonsLabel.Location = new System.Drawing.Point(184, 216); 95 | this.dragonsLabel.Name = "dragonsLabel"; 96 | this.dragonsLabel.Size = new System.Drawing.Size(68, 13); 97 | this.dragonsLabel.TabIndex = 6; 98 | this.dragonsLabel.Text = "Dragons:"; 99 | this.dragonsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 100 | // 101 | // dragonsNumeric 102 | // 103 | this.dragonsNumeric.Location = new System.Drawing.Point(260, 212); 104 | this.dragonsNumeric.Maximum = new decimal(new int[] { 105 | 255, 106 | 0, 107 | 0, 108 | 0}); 109 | this.dragonsNumeric.Name = "dragonsNumeric"; 110 | this.dragonsNumeric.Size = new System.Drawing.Size(76, 20); 111 | this.dragonsNumeric.TabIndex = 10; 112 | // 113 | // levelListbox 114 | // 115 | this.levelListbox.FormattingEnabled = true; 116 | this.levelListbox.Items.AddRange(new object[] { 117 | "Artisans Home", 118 | "Stone Hill", 119 | "Dark Hollow", 120 | "Town Square", 121 | "Toasty", 122 | "Sunny Flight", 123 | "Peace Keepers Home", 124 | "Dry Canyon", 125 | "Cliff Town", 126 | "Ice Cavern", 127 | "Doctor Shemp", 128 | "Night Flight", 129 | "Magic Crafters Home", 130 | "Alpine Ridge", 131 | "High Caves", 132 | "Wizard Peak", 133 | "Blowhard", 134 | "Crystal Flight", 135 | "Beast Makers Home", 136 | "Terrace Village", 137 | "Misty Bog", 138 | "Tree Tops", 139 | "Metalhead", 140 | "Wild Flight", 141 | "Dream Weavers Home", 142 | "Dark Passage", 143 | "Lofty Castle", 144 | "Haunted Towers", 145 | "Jaques", 146 | "Icy Flight", 147 | "Gnorc Gnexus", 148 | "Gnorc Cove", 149 | "Twilight Harbor", 150 | "Gnasty Gnorc", 151 | "Gnasty\'s Loot"}); 152 | this.levelListbox.Location = new System.Drawing.Point(4, 32); 153 | this.levelListbox.Name = "levelListbox"; 154 | this.levelListbox.Size = new System.Drawing.Size(176, 199); 155 | this.levelListbox.TabIndex = 4; 156 | this.levelListbox.SelectedIndexChanged += new System.EventHandler(this.levelListbox_SelectedIndexChanged); 157 | // 158 | // gemsNumeric 159 | // 160 | this.gemsNumeric.Location = new System.Drawing.Point(260, 188); 161 | this.gemsNumeric.Maximum = new decimal(new int[] { 162 | 65535, 163 | 0, 164 | 0, 165 | 0}); 166 | this.gemsNumeric.Name = "gemsNumeric"; 167 | this.gemsNumeric.Size = new System.Drawing.Size(76, 20); 168 | this.gemsNumeric.TabIndex = 9; 169 | // 170 | // gemsLabel 171 | // 172 | this.gemsLabel.Location = new System.Drawing.Point(184, 193); 173 | this.gemsLabel.Name = "gemsLabel"; 174 | this.gemsLabel.Size = new System.Drawing.Size(68, 13); 175 | this.gemsLabel.TabIndex = 13; 176 | this.gemsLabel.Text = "Gems:"; 177 | this.gemsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 178 | // 179 | // locationLabel 180 | // 181 | this.locationLabel.AutoSize = true; 182 | this.locationLabel.Location = new System.Drawing.Point(184, 32); 183 | this.locationLabel.Name = "locationLabel"; 184 | this.locationLabel.Size = new System.Drawing.Size(79, 13); 185 | this.locationLabel.TabIndex = 15; 186 | this.locationLabel.Text = "Player location:"; 187 | // 188 | // setLocationButton 189 | // 190 | this.setLocationButton.Location = new System.Drawing.Point(184, 64); 191 | this.setLocationButton.Name = "setLocationButton"; 192 | this.setLocationButton.Size = new System.Drawing.Size(152, 23); 193 | this.setLocationButton.TabIndex = 5; 194 | this.setLocationButton.Text = "Apply selected level"; 195 | this.setLocationButton.UseVisualStyleBackColor = true; 196 | this.setLocationButton.Click += new System.EventHandler(this.setLocationButton_Click); 197 | // 198 | // locationLabelName 199 | // 200 | this.locationLabelName.AutoSize = true; 201 | this.locationLabelName.Location = new System.Drawing.Point(184, 48); 202 | this.locationLabelName.Name = "locationLabelName"; 203 | this.locationLabelName.Size = new System.Drawing.Size(53, 13); 204 | this.locationLabelName.TabIndex = 18; 205 | this.locationLabelName.Text = "Unknown"; 206 | // 207 | // eggsCheckBox 208 | // 209 | this.eggsCheckBox.AutoSize = true; 210 | this.eggsCheckBox.Location = new System.Drawing.Point(192, 164); 211 | this.eggsCheckBox.Name = "eggsCheckBox"; 212 | this.eggsCheckBox.Size = new System.Drawing.Size(102, 17); 213 | this.eggsCheckBox.TabIndex = 8; 214 | this.eggsCheckBox.Text = "Collected egg(s)"; 215 | this.eggsCheckBox.UseVisualStyleBackColor = false; 216 | this.eggsCheckBox.Click += new System.EventHandler(this.eggsCheckBox_Click); 217 | // 218 | // unlockedCheckBox 219 | // 220 | this.unlockedCheckBox.AutoSize = true; 221 | this.unlockedCheckBox.Location = new System.Drawing.Point(192, 140); 222 | this.unlockedCheckBox.Name = "unlockedCheckBox"; 223 | this.unlockedCheckBox.Size = new System.Drawing.Size(99, 17); 224 | this.unlockedCheckBox.TabIndex = 7; 225 | this.unlockedCheckBox.Text = "Level unlocked"; 226 | this.unlockedCheckBox.UseVisualStyleBackColor = false; 227 | this.unlockedCheckBox.Click += new System.EventHandler(this.unlockedCheckBox_Click); 228 | // 229 | // SlotCombo 230 | // 231 | this.SlotCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 232 | this.SlotCombo.FormattingEnabled = true; 233 | this.SlotCombo.Items.AddRange(new object[] { 234 | "Save slot 1", 235 | "Save slot 2", 236 | "Save slot 3"}); 237 | this.SlotCombo.Location = new System.Drawing.Point(4, 5); 238 | this.SlotCombo.Name = "SlotCombo"; 239 | this.SlotCombo.Size = new System.Drawing.Size(176, 21); 240 | this.SlotCombo.TabIndex = 1; 241 | this.SlotCombo.SelectedIndexChanged += new System.EventHandler(this.SlotCombo_SelectedIndexChanged); 242 | // 243 | // mainWindow 244 | // 245 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 246 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 247 | this.ClientSize = new System.Drawing.Size(341, 261); 248 | this.Controls.Add(this.SlotCombo); 249 | this.Controls.Add(this.dragonsLabel); 250 | this.Controls.Add(this.gemsLabel); 251 | this.Controls.Add(this.unlockedCheckBox); 252 | this.Controls.Add(this.eggsCheckBox); 253 | this.Controls.Add(this.levelListbox); 254 | this.Controls.Add(this.locationLabelName); 255 | this.Controls.Add(this.setLocationButton); 256 | this.Controls.Add(this.locationLabel); 257 | this.Controls.Add(this.gemsNumeric); 258 | this.Controls.Add(this.livesLabel); 259 | this.Controls.Add(this.livesNumeric); 260 | this.Controls.Add(this.dragonsNumeric); 261 | this.Controls.Add(this.cancelButton); 262 | this.Controls.Add(this.okButton); 263 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 264 | this.MaximizeBox = false; 265 | this.MinimizeBox = false; 266 | this.Name = "mainWindow"; 267 | this.ShowInTaskbar = false; 268 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 269 | this.Text = "mainWindow"; 270 | this.Paint += new System.Windows.Forms.PaintEventHandler(this.mainWindow_Paint); 271 | ((System.ComponentModel.ISupportInitialize)(this.livesNumeric)).EndInit(); 272 | ((System.ComponentModel.ISupportInitialize)(this.dragonsNumeric)).EndInit(); 273 | ((System.ComponentModel.ISupportInitialize)(this.gemsNumeric)).EndInit(); 274 | this.ResumeLayout(false); 275 | this.PerformLayout(); 276 | 277 | } 278 | 279 | #endregion 280 | 281 | private System.Windows.Forms.Button okButton; 282 | private System.Windows.Forms.Button cancelButton; 283 | private System.Windows.Forms.Label livesLabel; 284 | private System.Windows.Forms.NumericUpDown livesNumeric; 285 | private System.Windows.Forms.Label dragonsLabel; 286 | private System.Windows.Forms.NumericUpDown dragonsNumeric; 287 | private System.Windows.Forms.ListBox levelListbox; 288 | private System.Windows.Forms.NumericUpDown gemsNumeric; 289 | private System.Windows.Forms.Label gemsLabel; 290 | private System.Windows.Forms.Label locationLabel; 291 | private System.Windows.Forms.Button setLocationButton; 292 | private System.Windows.Forms.Label locationLabelName; 293 | private System.Windows.Forms.CheckBox eggsCheckBox; 294 | private System.Windows.Forms.CheckBox unlockedCheckBox; 295 | private System.Windows.Forms.ComboBox SlotCombo; 296 | } 297 | } -------------------------------------------------------------------------------- /CTREdit/CTREdit/mainWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Text; 7 | using System.Windows.Forms; 8 | 9 | namespace CTREdit 10 | { 11 | public partial class mainWindow : Form 12 | { 13 | //Save data for editing 14 | byte[] saveData = null; 15 | 16 | //Editor flags 17 | bool pressedOK = false; 18 | bool japaneseVersion = false; 19 | 20 | //Editor data 21 | private struct saveSlot 22 | { 23 | public uint currentCharacter; 24 | public string playerName; 25 | } 26 | 27 | //Name of all the stages found in the game 28 | string[] levelName = {"Crash Cove", "Roo's Tubes", "Sewer Speedway", "Mystery Caves", "Ripper Roo (boss)", "Skull Rock", 29 | "Dingo Canyon", "Tiger Temple", "Papu's Pyramid", "Coco Park", "Papu Papu (boss)", "Rampage Ruins", 30 | "Dragon Mines", "Blizzard Bluff", "Polar Pass", "Tiny Arena", "Komodo Joe (boss)", "Rocky Road", 31 | "Hot Air Skyway", "Cortex Castle", "N. Gin Labs", "Oxide Station", "Pinstripe (boss)", "Nitro Court", 32 | "Slide Coliseum", "Turbo Track", "Nitrous Oxide (boss)", "Dummy", "Dummy", "Dummy"}; 33 | 34 | enum levelTypes {regularLevel, bossLevel, battleLevel, timeLevel}; 35 | 36 | //Single stage 37 | private struct singleStage 38 | { 39 | public int levelType; 40 | public int levelWorldIndex; 41 | public string stageName; 42 | public bool trophyCollected; 43 | public bool tokenCollected; 44 | public bool keyCollected; 45 | public bool blueRelicCollected; 46 | public bool goldRelicCollected; 47 | public bool platinumRelicCollected; 48 | } 49 | 50 | singleStage[] allStages; 51 | 52 | byte characterUnlockables1 = 0; 53 | byte characterUnlockables2 = 0; 54 | byte generalUnlockables = 0; 55 | 56 | //All save slots (4 total) 57 | saveSlot[] saveSlots = new saveSlot[4]; 58 | int currentSlot = 0; 59 | 60 | public mainWindow() 61 | { 62 | InitializeComponent(); 63 | } 64 | 65 | //Set up dialog and fetch data 66 | public byte[] initDialog(string windowTitle, byte[] gameSaveData, bool isJapanese) 67 | { 68 | //Set window title 69 | this.Text = windowTitle; 70 | 71 | //Pass reference for save data 72 | saveData = gameSaveData; 73 | japaneseVersion = isJapanese; 74 | 75 | //Set default values 76 | currentSlot = 0; 77 | 78 | //Create levels 79 | createLevels(); 80 | worldListbox.SelectedIndex = 0; 81 | 82 | //Load data 83 | loadToContainer(); 84 | loadToEditor(); 85 | 86 | updateSlotInfo(); 87 | 88 | //Show plugin's main dialog 89 | this.ShowDialog(); 90 | 91 | //Save data 92 | saveFromEditor(); 93 | saveFromContainer(); 94 | calculateChecksum(); 95 | 96 | //Check if edited save data should be returned 97 | if (pressedOK == true) return saveData; else return null; 98 | } 99 | 100 | //Create all the levels in the game 101 | private void createLevels() 102 | { 103 | //Create array of levels 104 | allStages = new singleStage[levelName.Length]; 105 | 106 | //Cycle through each world 107 | for (int curWorld = 0; curWorld < 4; curWorld++) 108 | { 109 | //Cycle through each stage in the world 110 | for (int curLevel = 0; curLevel < 6; curLevel++) 111 | { 112 | allStages[curLevel + (6 * curWorld)].levelType = (int)levelTypes.regularLevel; //All levels are set to regular by default 113 | 114 | if (curLevel == 4) allStages[curLevel + (6 * curWorld)].levelType = (int)levelTypes.bossLevel; //Boss levels 115 | if (curLevel == 5) allStages[curLevel + (6 * curWorld)].levelType = (int)levelTypes.battleLevel; //Battle arena 116 | 117 | allStages[curLevel + (6 * curWorld)].levelWorldIndex = curWorld; 118 | allStages[curLevel + (6 * curWorld)].stageName = levelName[curLevel + (6 * curWorld)]; 119 | allStages[curLevel + (6 * curWorld)].trophyCollected = false; 120 | allStages[curLevel + (6 * curWorld)].tokenCollected = false; 121 | allStages[curLevel + (6 * curWorld)].keyCollected = false; 122 | allStages[curLevel + (6 * curWorld)].blueRelicCollected = false; 123 | allStages[curLevel + (6 * curWorld)].goldRelicCollected = false; 124 | allStages[curLevel + (6 * curWorld)].platinumRelicCollected = false; 125 | } 126 | } 127 | 128 | //Fix for special levels 129 | allStages[24].levelType = (int)levelTypes.timeLevel; //Slide Colliseum 130 | allStages[25].levelType = (int)levelTypes.timeLevel; //Turbo track 131 | allStages[26].levelType = (int)levelTypes.bossLevel; //Nitrous Oxide 132 | } 133 | 134 | //Update current slot textbox 135 | private void updateSlotInfo() 136 | { 137 | slotTextBox.Text = "Save slot " + (currentSlot + 1).ToString(); 138 | } 139 | 140 | //Decode save data and load it into container variables 141 | private void loadToContainer() 142 | { 143 | //Load data for each slot 144 | for (int i = 0; i < 4; i++) 145 | { 146 | saveSlots[i].currentCharacter = get16BitFromSaveData(0x1AE + (i * 0x50)); 147 | 148 | if (japaneseVersion == false) saveSlots[i].playerName = Encoding.UTF8.GetString(saveData, 0x19C + (i * 0x50), 9); 149 | else saveSlots[i].playerName = Encoding.Unicode.GetString(saveData, 0x19C + (i * 0x50), 18); 150 | } 151 | 152 | //Non slot related data 153 | generalUnlockables = saveData[0x2CC]; 154 | characterUnlockables1 = saveData[0x2C8]; 155 | characterUnlockables2 = saveData[0x2C9]; 156 | } 157 | 158 | //Encode save data to original format 159 | private void saveFromContainer() 160 | { 161 | byte[] tempbyteArray = null; 162 | 163 | //Save data for each slot 164 | for (int i = 0; i < 4; i++) 165 | { 166 | set16BitToSaveData(saveSlots[i].currentCharacter, 0x1AE + (i * 0x50)); 167 | 168 | if (japaneseVersion == false) //America, Europe 169 | { 170 | Array.Clear(saveData, 0x19C + (i * 0x50), 9); 171 | tempbyteArray = Encoding.UTF8.GetBytes(saveSlots[i].playerName); 172 | } 173 | else 174 | { 175 | Array.Clear(saveData, 0x19C + (i * 0x50), 18); 176 | tempbyteArray = Encoding.Unicode.GetBytes(saveSlots[i].playerName); 177 | } 178 | 179 | //Import player name in the save data 180 | for (int j = 0; j < tempbyteArray.Length; j++) 181 | { 182 | saveData[0x19C + (i * 0x50) + j] = tempbyteArray[j]; 183 | } 184 | } 185 | 186 | //Non slot related data 187 | saveData[0x2CC] = generalUnlockables; 188 | saveData[0x2C8] = characterUnlockables1; 189 | saveData[0x2C9] = characterUnlockables2; 190 | } 191 | 192 | //Load data from container to GUI 193 | private void loadToEditor() 194 | { 195 | //Check if the current slot is active 196 | if (saveSlots[currentSlot].currentCharacter > 0xF) characterCombo.SelectedIndex = 0; 197 | else characterCombo.SelectedIndex =(int)(saveSlots[currentSlot].currentCharacter + 1); 198 | 199 | //Player name 200 | nameTextBox.Text = saveSlots[currentSlot].playerName; 201 | 202 | //Scrapbook mode 203 | if((generalUnlockables & 0x10) > 0) scrapbookCheckBox.Checked = true; else scrapbookCheckBox.Checked = false; 204 | 205 | //Unlockable characters 206 | if ((characterUnlockables1 & 0x20) > 0) TropyCheckBox.Checked = true; else TropyCheckBox.Checked = false; 207 | if ((characterUnlockables1 & 0x40) > 0) PentaCheckBox.Checked = true; else PentaCheckBox.Checked = false; 208 | if ((characterUnlockables1 & 0x80) > 0) RooCheckBox.Checked = true; else RooCheckBox.Checked = false; 209 | 210 | if ((characterUnlockables2 & 0x1) > 0) PapuCheckBox.Checked = true; else PapuCheckBox.Checked = false; 211 | if ((characterUnlockables2 & 0x2) > 0) KomodoCheckBox.Checked = true; else KomodoCheckBox.Checked = false; 212 | if ((characterUnlockables2 & 0x4) > 0) PinstripeCheckBox.Checked = true; else PinstripeCheckBox.Checked = false; 213 | if ((characterUnlockables2 & 0x8) > 0) FakeCheckBox.Checked = true; else FakeCheckBox.Checked = false; 214 | 215 | //Unlockable arenas 216 | if ((characterUnlockables1 & 0x4) > 0) parkingCheckbox.Checked = true; else parkingCheckbox.Checked = false; 217 | if ((characterUnlockables1 & 0x8) > 0) northCheckbox.Checked = true; else northCheckbox.Checked = false; 218 | if ((characterUnlockables1 & 0x10) > 0) basementCheckbox.Checked = true; else basementCheckbox.Checked = false; 219 | } 220 | 221 | //Save data from editor to container 222 | private void saveFromEditor() 223 | { 224 | //Check if the current selection is "inactive" or character 225 | if (characterCombo.SelectedIndex == 0) saveSlots[currentSlot].currentCharacter = 0xFFFF; 226 | else saveSlots[currentSlot].currentCharacter = (uint)(characterCombo.SelectedIndex - 1); 227 | 228 | //Player name 229 | saveSlots[currentSlot].playerName = nameTextBox.Text; 230 | 231 | //Scrapbook mode 232 | if (scrapbookCheckBox.Checked == true) generalUnlockables |= 0x10; else generalUnlockables &= (0x10 ^ 0xFF); 233 | 234 | //Unlockable characters 235 | if (TropyCheckBox.Checked == true) characterUnlockables1 |= 0x20; else characterUnlockables1 &= (0x20 ^ 0xFF); 236 | if (PentaCheckBox.Checked == true) characterUnlockables1 |= 0x40; else characterUnlockables1 &= (0x40 ^ 0xFF); 237 | if (RooCheckBox.Checked == true) characterUnlockables1 |= 0x80; else characterUnlockables1 &= (0x80 ^ 0xFF); 238 | 239 | if (PapuCheckBox.Checked == true) characterUnlockables2 |= 0x1; else characterUnlockables2 &= (0x1 ^ 0xFF); 240 | if (KomodoCheckBox.Checked == true) characterUnlockables2 |= 0x2; else characterUnlockables2 &= (0x2 ^ 0xFF); 241 | if (PinstripeCheckBox.Checked == true) characterUnlockables2 |= 0x4; else characterUnlockables2 &= (0x4 ^ 0xFF); 242 | if (FakeCheckBox.Checked == true) characterUnlockables2 |= 0x8; else characterUnlockables2 &= (0x8 ^ 0xFF); 243 | 244 | //Unlockable arenas 245 | if (parkingCheckbox.Checked == true) characterUnlockables1 |= 0x4; else characterUnlockables1 &= (0x4 ^ 0xFF); 246 | if (northCheckbox.Checked == true) characterUnlockables1 |= 0x8; else characterUnlockables1 &= (0x8 ^ 0xFF); 247 | if (basementCheckbox.Checked == true) characterUnlockables1 |= 0x10; else characterUnlockables1 &= (0x10 ^ 0xFF); 248 | } 249 | 250 | //Set 16 bit unsigned value to memory 251 | private void set16BitToSaveData(uint saveValue, int byteOffset) 252 | { 253 | saveData[byteOffset] = (byte)(saveValue & 0xFF); 254 | saveData[byteOffset + 1] = (byte)(saveValue >> 8); 255 | } 256 | 257 | //Get 16 bit unsigned value from memory 258 | private uint get16BitFromSaveData(int byteOffset) 259 | { 260 | uint tempData = 0; 261 | 262 | //Get data from the memory 263 | tempData = saveData[byteOffset]; 264 | tempData |= (uint)(saveData[byteOffset + 1] << 8); 265 | 266 | //Return data 267 | return tempData; 268 | } 269 | 270 | //Calculate save checksum (in MIPS assembly form, heh :P) 271 | private void calculateChecksum() 272 | { 273 | //Simulated PS1 registers 274 | uint r2 = 0; 275 | uint r3 = 0; 276 | uint r4 = 0; 277 | uint r5 = 0; 278 | uint r6 = 0; 279 | uint r7 = 0; 280 | 281 | //Checksum calculation 282 | for (uint i = 0; i < 5760; i++) 283 | { 284 | //r2 = 0x800992e4 + i; 285 | r5 = saveData[i + 0x180]; 286 | r3 = 0x7; 287 | r7 = 0x10000; 288 | r6 = r7; 289 | r6 = r6 | 0x1021; 290 | 291 | //Erase old checksum 292 | saveData[0x17FE] = 0x00; 293 | saveData[0x17FF] = 0x00; 294 | 295 | while (r3 < 0xFFFF) 296 | { 297 | r4 = r4 << 0x1; 298 | r2 = r5 >> (int)r3; 299 | r2 = r2 & 0x1; 300 | r4 = r4 | r2; 301 | r2 = r4 & r7; 302 | 303 | if (r2 != 0) r4 = r4 ^ r6; 304 | 305 | r3 = (r3 + 0xFFFF) & 0xFFFF; 306 | } 307 | } 308 | 309 | //Set new checksum 310 | saveData[0x17FE] = (byte)(r4 >> 8); 311 | saveData[0x17FF] = (byte)(r4 & 0xFF); 312 | } 313 | 314 | //Change the current save slot by the given value 315 | private void changeSlot(int deltaValue) 316 | { 317 | //Check if the current slot should be changed 318 | if (deltaValue == -1 & currentSlot == 0) return; 319 | if (deltaValue == 1 & currentSlot == 3) return; 320 | 321 | //Save current data 322 | saveFromEditor(); 323 | 324 | //Change slot 325 | currentSlot += deltaValue; 326 | updateSlotInfo(); 327 | 328 | //Load new data 329 | loadToEditor(); 330 | } 331 | 332 | //Load the appropriate stages for the selected world 333 | private void worldListbox_SelectedIndexChanged(object sender, EventArgs e) 334 | { 335 | stagesListbox.Items.Clear(); 336 | 337 | for (int i = 0; i < 6; i++) 338 | { 339 | stagesListbox.Items.Add(levelName[i + (6 * worldListbox.SelectedIndex)]); 340 | 341 | //Check if it's the last world, it has only 3 stages 342 | if (worldListbox.SelectedIndex > 3 && i > 1) break; 343 | } 344 | 345 | //Select first stage 346 | stagesListbox.SelectedIndex = 0; 347 | } 348 | 349 | private void cancelButton_Click(object sender, EventArgs e) 350 | { 351 | this.Close(); 352 | } 353 | 354 | private void okButton_Click(object sender, EventArgs e) 355 | { 356 | pressedOK = true; 357 | this.Close(); 358 | } 359 | 360 | private void mainWindow_Paint(object sender, PaintEventArgs e) 361 | { 362 | //Draw gray rectangle 363 | e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(80, 80, 80)), 0, 0, this.Width, 30); 364 | } 365 | 366 | private void characterCombo_SelectedIndexChanged(object sender, EventArgs e) 367 | { 368 | //Set character icon according to the selected character 369 | characterPictureBox.Image = characterImageList.Images[characterCombo.SelectedIndex]; 370 | } 371 | 372 | private void previousButton_Click(object sender, EventArgs e) 373 | { 374 | //Go to previous slot 375 | changeSlot(-1); 376 | } 377 | 378 | private void nextButton_Click(object sender, EventArgs e) 379 | { 380 | //Go to next slot 381 | changeSlot(1); 382 | } 383 | 384 | //Enable/disable checkboxes for each level 385 | private void stagesListbox_SelectedIndexChanged(object sender, EventArgs e) 386 | { 387 | //Disable all checkboxes by default 388 | trophyCheckbox.Enabled = false; 389 | tokenCheckbox.Enabled = false; 390 | keyCheckbox.Enabled = false; 391 | blueRelicCheckbox.Enabled = false; 392 | goldRelicCheckbox.Enabled = false; 393 | platinumRelicCheckbox.Enabled = false; 394 | 395 | //Enable appropriate checkbox 396 | switch (allStages[(worldListbox.SelectedIndex * 6) + stagesListbox.SelectedIndex].levelType) 397 | { 398 | case (int)levelTypes.regularLevel: 399 | trophyCheckbox.Enabled = true; 400 | tokenCheckbox.Enabled = true; 401 | blueRelicCheckbox.Enabled = true; 402 | goldRelicCheckbox.Enabled = true; 403 | platinumRelicCheckbox.Enabled = true; 404 | break; 405 | 406 | case (int)levelTypes.bossLevel: 407 | keyCheckbox.Enabled = true; 408 | break; 409 | 410 | case (int)levelTypes.battleLevel: 411 | tokenCheckbox.Enabled = true; 412 | break; 413 | 414 | case (int)levelTypes.timeLevel: 415 | blueRelicCheckbox.Enabled = true; 416 | goldRelicCheckbox.Enabled = true; 417 | platinumRelicCheckbox.Enabled = true; 418 | break; 419 | } 420 | 421 | } 422 | } 423 | } 424 | --------------------------------------------------------------------------------