├── 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 |
--------------------------------------------------------------------------------