| @ -0,0 +1,63 @@ | |||
| ############################################################################### | |||
| # Set default behavior to automatically normalize line endings. | |||
| ############################################################################### | |||
| * text=auto | |||
| ############################################################################### | |||
| # Set default behavior for command prompt diff. | |||
| # | |||
| # This is need for earlier builds of msysgit that does not have it on by | |||
| # default for csharp files. | |||
| # Note: This is only used by command line | |||
| ############################################################################### | |||
| #*.cs diff=csharp | |||
| ############################################################################### | |||
| # Set the merge driver for project and solution files | |||
| # | |||
| # Merging from the command prompt will add diff markers to the files if there | |||
| # are conflicts (Merging from VS is not affected by the settings below, in VS | |||
| # the diff markers are never inserted). Diff markers may cause the following | |||
| # file extensions to fail to load in VS. An alternative would be to treat | |||
| # these files as binary and thus will always conflict and require user | |||
| # intervention with every merge. To do so, just uncomment the entries below | |||
| ############################################################################### | |||
| #*.sln merge=binary | |||
| #*.csproj merge=binary | |||
| #*.vbproj merge=binary | |||
| #*.vcxproj merge=binary | |||
| #*.vcproj merge=binary | |||
| #*.dbproj merge=binary | |||
| #*.fsproj merge=binary | |||
| #*.lsproj merge=binary | |||
| #*.wixproj merge=binary | |||
| #*.modelproj merge=binary | |||
| #*.sqlproj merge=binary | |||
| #*.wwaproj merge=binary | |||
| ############################################################################### | |||
| # behavior for image files | |||
| # | |||
| # image files are treated as binary by default. | |||
| ############################################################################### | |||
| #*.jpg binary | |||
| #*.png binary | |||
| #*.gif binary | |||
| ############################################################################### | |||
| # diff behavior for common document formats | |||
| # | |||
| # Convert binary document formats to text before diffing them. This feature | |||
| # is only available from the command line. Turn it on by uncommenting the | |||
| # entries below. | |||
| ############################################################################### | |||
| #*.doc diff=astextplain | |||
| #*.DOC diff=astextplain | |||
| #*.docx diff=astextplain | |||
| #*.DOCX diff=astextplain | |||
| #*.dot diff=astextplain | |||
| #*.DOT diff=astextplain | |||
| #*.pdf diff=astextplain | |||
| #*.PDF diff=astextplain | |||
| #*.rtf diff=astextplain | |||
| #*.RTF diff=astextplain | |||
| @ -0,0 +1,245 @@ | |||
| ## Ignore Visual Studio temporary files, build results, and | |||
| ## files generated by popular Visual Studio add-ons. | |||
| # User-specific files | |||
| *.suo | |||
| *.user | |||
| *.userosscache | |||
| *.sln.docstates | |||
| # User-specific files (MonoDevelop/Xamarin Studio) | |||
| *.userprefs | |||
| # Build results | |||
| [Dd]ebug/ | |||
| [Dd]ebugPublic/ | |||
| [Rr]elease/ | |||
| [Rr]eleases/ | |||
| [Xx]64/ | |||
| [Xx]86/ | |||
| [Bb]uild/ | |||
| bld/ | |||
| [Bb]in/ | |||
| [Oo]bj/ | |||
| # Visual Studio 2015 cache/options directory | |||
| .vs/ | |||
| # Uncomment if you have tasks that create the project's static files in wwwroot | |||
| #wwwroot/ | |||
| # MSTest test Results | |||
| [Tt]est[Rr]esult*/ | |||
| [Bb]uild[Ll]og.* | |||
| # NUNIT | |||
| *.VisualState.xml | |||
| TestResult.xml | |||
| # Build Results of an ATL Project | |||
| [Dd]ebugPS/ | |||
| [Rr]eleasePS/ | |||
| dlldata.c | |||
| # DNX | |||
| project.lock.json | |||
| artifacts/ | |||
| *_i.c | |||
| *_p.c | |||
| *_i.h | |||
| *.ilk | |||
| *.meta | |||
| *.obj | |||
| *.pch | |||
| *.pdb | |||
| *.pgc | |||
| *.pgd | |||
| *.rsp | |||
| *.sbr | |||
| *.tlb | |||
| *.tli | |||
| *.tlh | |||
| *.tmp | |||
| *.tmp_proj | |||
| *.log | |||
| *.vspscc | |||
| *.vssscc | |||
| .builds | |||
| *.pidb | |||
| *.svclog | |||
| *.scc | |||
| # Chutzpah Test files | |||
| _Chutzpah* | |||
| # Visual C++ cache files | |||
| ipch/ | |||
| *.aps | |||
| *.ncb | |||
| *.opendb | |||
| *.opensdf | |||
| *.sdf | |||
| *.cachefile | |||
| *.VC.db | |||
| # Visual Studio profiler | |||
| *.psess | |||
| *.vsp | |||
| *.vspx | |||
| *.sap | |||
| # TFS 2012 Local Workspace | |||
| $tf/ | |||
| # Guidance Automation Toolkit | |||
| *.gpState | |||
| # ReSharper is a .NET coding add-in | |||
| _ReSharper*/ | |||
| *.[Rr]e[Ss]harper | |||
| *.DotSettings.user | |||
| # JustCode is a .NET coding add-in | |||
| .JustCode | |||
| # TeamCity is a build add-in | |||
| _TeamCity* | |||
| # DotCover is a Code Coverage Tool | |||
| *.dotCover | |||
| # NCrunch | |||
| _NCrunch_* | |||
| .*crunch*.local.xml | |||
| nCrunchTemp_* | |||
| # MightyMoose | |||
| *.mm.* | |||
| AutoTest.Net/ | |||
| # Web workbench (sass) | |||
| .sass-cache/ | |||
| # Installshield output folder | |||
| [Ee]xpress/ | |||
| # DocProject is a documentation generator add-in | |||
| DocProject/buildhelp/ | |||
| DocProject/Help/*.HxT | |||
| DocProject/Help/*.HxC | |||
| DocProject/Help/*.hhc | |||
| DocProject/Help/*.hhk | |||
| DocProject/Help/*.hhp | |||
| DocProject/Help/Html2 | |||
| DocProject/Help/html | |||
| # Click-Once directory | |||
| publish/ | |||
| # Publish Web Output | |||
| *.[Pp]ublish.xml | |||
| *.azurePubxml | |||
| # TODO: Un-comment the next line if you do not want to checkin | |||
| # your web deploy settings because they may include unencrypted | |||
| # passwords | |||
| #*.pubxml | |||
| *.publishproj | |||
| # NuGet Packages | |||
| *.nupkg | |||
| # The packages folder can be ignored because of Package Restore | |||
| **/packages/* | |||
| # except build/, which is used as an MSBuild target. | |||
| !**/packages/build/ | |||
| # Uncomment if necessary however generally it will be regenerated when needed | |||
| #!**/packages/repositories.config | |||
| # NuGet v3's project.json files produces more ignoreable files | |||
| *.nuget.props | |||
| *.nuget.targets | |||
| # Microsoft Azure Build Output | |||
| csx/ | |||
| *.build.csdef | |||
| # Microsoft Azure Emulator | |||
| ecf/ | |||
| rcf/ | |||
| # Microsoft Azure ApplicationInsights config file | |||
| ApplicationInsights.config | |||
| # Windows Store app package directory | |||
| AppPackages/ | |||
| BundleArtifacts/ | |||
| # Visual Studio cache files | |||
| # files ending in .cache can be ignored | |||
| *.[Cc]ache | |||
| # but keep track of directories ending in .cache | |||
| !*.[Cc]ache/ | |||
| # Others | |||
| ClientBin/ | |||
| [Ss]tyle[Cc]op.* | |||
| ~$* | |||
| *~ | |||
| *.dbmdl | |||
| *.dbproj.schemaview | |||
| *.pfx | |||
| *.publishsettings | |||
| node_modules/ | |||
| orleans.codegen.cs | |||
| # RIA/Silverlight projects | |||
| Generated_Code/ | |||
| # Backup & report files from converting an old project file | |||
| # to a newer Visual Studio version. Backup files are not needed, | |||
| # because we have git ;-) | |||
| _UpgradeReport_Files/ | |||
| Backup*/ | |||
| UpgradeLog*.XML | |||
| UpgradeLog*.htm | |||
| # SQL Server files | |||
| *.mdf | |||
| *.ldf | |||
| # Business Intelligence projects | |||
| *.rdl.data | |||
| *.bim.layout | |||
| *.bim_*.settings | |||
| # Microsoft Fakes | |||
| FakesAssemblies/ | |||
| # GhostDoc plugin setting file | |||
| *.GhostDoc.xml | |||
| # Node.js Tools for Visual Studio | |||
| .ntvs_analysis.dat | |||
| # Visual Studio 6 build log | |||
| *.plg | |||
| # Visual Studio 6 workspace options file | |||
| *.opt | |||
| # Visual Studio LightSwitch build output | |||
| **/*.HTMLClient/GeneratedArtifacts | |||
| **/*.DesktopClient/GeneratedArtifacts | |||
| **/*.DesktopClient/ModelManifest.xml | |||
| **/*.Server/GeneratedArtifacts | |||
| **/*.Server/ModelManifest.xml | |||
| _Pvt_Extensions | |||
| # LightSwitch generated files | |||
| GeneratedArtifacts/ | |||
| ModelManifest.xml | |||
| # Paket dependency manager | |||
| .paket/paket.exe | |||
| # FAKE - F# Make | |||
| .fake/ | |||
| @ -0,0 +1,22 @@ | |||
| | |||
| Microsoft Visual Studio Solution File, Format Version 12.00 | |||
| # Visual Studio 2013 | |||
| VisualStudioVersion = 12.0.40629.0 | |||
| MinimumVisualStudioVersion = 10.0.40219.1 | |||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hack.Xenosaga", "Hack.Xenosaga\Hack.Xenosaga.csproj", "{3FE1E3A5-A55A-4D1A-ACDD-85A9EE5B9D5B}" | |||
| EndProject | |||
| Global | |||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
| Debug|Any CPU = Debug|Any CPU | |||
| Release|Any CPU = Release|Any CPU | |||
| EndGlobalSection | |||
| GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
| {3FE1E3A5-A55A-4D1A-ACDD-85A9EE5B9D5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {3FE1E3A5-A55A-4D1A-ACDD-85A9EE5B9D5B}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
| {3FE1E3A5-A55A-4D1A-ACDD-85A9EE5B9D5B}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
| {3FE1E3A5-A55A-4D1A-ACDD-85A9EE5B9D5B}.Release|Any CPU.Build.0 = Release|Any CPU | |||
| EndGlobalSection | |||
| GlobalSection(SolutionProperties) = preSolution | |||
| HideSolutionNode = FALSE | |||
| EndGlobalSection | |||
| EndGlobal | |||
| @ -0,0 +1,55 @@ | |||
| using System; | |||
| using System.IO; | |||
| namespace Hack.Xenosaga.Common | |||
| { | |||
| public class Functions | |||
| { | |||
| public static void usage() | |||
| { | |||
| Console.WriteLine("xenosaga <option> <file> [regroup]"); | |||
| Console.WriteLine(" option : -l = List files from index"); | |||
| Console.WriteLine(" -u = Unpack files from index"); | |||
| Console.WriteLine(" -p = Pack files from index"); | |||
| Console.WriteLine(" file : Index file (the first one of each decade : xenosaga.00, xenosaga.10, xenosaga.20...)"); | |||
| Console.WriteLine(" regroup : true to regroup all files in only one (ex: 11, 12, 13 in 11) ; false or empty (default) to keep the same system of increment files"); | |||
| } | |||
| public static bool checkArgs(string[] args, out Variables.stArgs listArgs) | |||
| { | |||
| listArgs = new Variables.stArgs(); | |||
| if (args.Length != 2 && args.Length != 3) | |||
| { | |||
| Console.WriteLine("Incorrect number of parameter!"); | |||
| return false; | |||
| } | |||
| if (args[0] != "-l" && args[0] != "-p" && args[0] != "-u") | |||
| { | |||
| Console.WriteLine("Incorrect parameter 1!"); | |||
| return false; | |||
| } | |||
| if (!File.Exists(args[1])) | |||
| { | |||
| Console.WriteLine("Incorrect parameter 2 : unknown file"); | |||
| return false; | |||
| } | |||
| if (args.Length == 3 && (args[2] != "true" && args[2] != "false")) | |||
| { | |||
| Console.WriteLine("Incorrect parameter 3!"); | |||
| return false; | |||
| } | |||
| listArgs.option = args[0]; | |||
| listArgs.filename = args[1]; | |||
| if (args.Length == 3) | |||
| listArgs.regroup = args[2] == "true" ? true : false; | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,197 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| namespace Hack.Xenosaga.Common | |||
| { | |||
| public class listPathElement | |||
| { | |||
| private pathElement p_root; | |||
| private List<pathElement> p_index; | |||
| private Dictionary<string, pathElement> p_mappedIndex; | |||
| public listPathElement() | |||
| { | |||
| p_root = new pathElement(true) { Name = "" }; | |||
| p_index = new List<pathElement>(); | |||
| p_mappedIndex = new Dictionary<string, pathElement>(); | |||
| addToIndex(p_root); | |||
| } | |||
| public void addToIndex(pathElement entry) | |||
| { | |||
| if (p_mappedIndex.ContainsKey(entry.FullPath)) | |||
| throw new Exception(String.Format("Entry {0} already exists", entry.FullPath)); | |||
| p_mappedIndex.Add(entry.FullPath, entry); | |||
| p_index.Add(entry); | |||
| } | |||
| public IEnumerable<pathElement> getEntries() | |||
| { | |||
| foreach (pathElement entry in p_index) | |||
| yield return entry; | |||
| } | |||
| public pathElement Root | |||
| { | |||
| get { return p_root; } | |||
| set { p_root = value; } | |||
| } | |||
| private static int CompareElementBySector(pathElement A, pathElement B) | |||
| { | |||
| if (A.Sector == B.Sector) | |||
| return 0; | |||
| else if (A.Sector > B.Sector) | |||
| return 1; | |||
| else if (A.Sector < B.Sector) | |||
| return -1; | |||
| else | |||
| return 0; | |||
| } | |||
| private static int CompareElementById(pathElement A, pathElement B) | |||
| { | |||
| if (A.Id == B.Id) | |||
| return 0; | |||
| else if (A.Id > B.Id) | |||
| return 1; | |||
| else if (A.Id < B.Id) | |||
| return -1; | |||
| else | |||
| return 0; | |||
| } | |||
| public void SortBySector() | |||
| { | |||
| p_index.Sort(CompareElementBySector); | |||
| } | |||
| public void SortById() | |||
| { | |||
| p_index.Sort(CompareElementById); | |||
| } | |||
| } | |||
| public class pathElement | |||
| { | |||
| private int p_id; | |||
| private bool p_isDirectory; | |||
| private bool p_isCompressed; | |||
| private string p_name; | |||
| private UInt32 p_position; | |||
| private UInt32 p_sector; | |||
| private UInt32 p_sizeIn; | |||
| private UInt32 p_sizeOut; | |||
| private string p_fullPath; | |||
| private int p_level; | |||
| private pathElement p_parent; | |||
| private List<pathElement> p_entries; | |||
| public pathElement(bool isDirectory) | |||
| { | |||
| p_parent = null; | |||
| p_isDirectory = isDirectory; | |||
| if (isDirectory) | |||
| p_entries = new List<pathElement>(); | |||
| } | |||
| public IEnumerable<pathElement> getEntries() | |||
| { | |||
| foreach (pathElement entry in p_entries) | |||
| yield return entry; | |||
| } | |||
| public void addEntry(pathElement entry) | |||
| { | |||
| entry.Parent = this; | |||
| p_entries.Add(entry); | |||
| } | |||
| private void computeFullPath() | |||
| { | |||
| p_fullPath = p_isDirectory ? p_name + "/" : p_name; | |||
| pathElement parent = p_parent; | |||
| while (parent != null) | |||
| { | |||
| p_fullPath = parent.Name + "/" + p_fullPath; | |||
| parent = parent.Parent; | |||
| } | |||
| } | |||
| public int Id | |||
| { | |||
| get { return p_id; } | |||
| set { p_id = value; } | |||
| } | |||
| public int Level | |||
| { | |||
| get { return p_level; } | |||
| set { p_level = value; } | |||
| } | |||
| public string Name | |||
| { | |||
| get { return p_name; } | |||
| set { p_name = value; } | |||
| } | |||
| public UInt32 Position | |||
| { | |||
| get { return p_position; } | |||
| set { p_position = value; } | |||
| } | |||
| public UInt32 Sector | |||
| { | |||
| get { return p_sector; } | |||
| set { p_sector = value; } | |||
| } | |||
| public UInt32 SizeIn | |||
| { | |||
| get { return p_sizeIn; } | |||
| set { p_sizeIn = value; } | |||
| } | |||
| public UInt32 SizeOut | |||
| { | |||
| get { return p_sizeOut; } | |||
| set { p_sizeOut = value; } | |||
| } | |||
| public pathElement Parent | |||
| { | |||
| get { return p_parent; } | |||
| private set { p_parent = value; } | |||
| } | |||
| public bool IsDirectory | |||
| { | |||
| get { return p_isDirectory; } | |||
| private set { p_isDirectory = value; } | |||
| } | |||
| public bool IsCompressed | |||
| { | |||
| get { return p_isCompressed; } | |||
| set { p_isCompressed = value; } | |||
| } | |||
| public string FullPath | |||
| { | |||
| get | |||
| { | |||
| if (p_fullPath == null) | |||
| computeFullPath(); | |||
| return p_fullPath; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,23 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Hack.Xenosaga.Common | |||
| { | |||
| public class Variables | |||
| { | |||
| public struct stArgs | |||
| { | |||
| public string option; | |||
| public string filename; | |||
| public bool regroup; | |||
| } | |||
| public const string dirUnpack = "01-UNPACK/"; | |||
| public const string dirExtract = "02-EXTRACT/"; | |||
| public const string dirInsert = "03-INSERT/"; | |||
| public const string dirPack = "04-PACK/"; | |||
| } | |||
| } | |||
| @ -0,0 +1,69 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
| <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | |||
| <PropertyGroup> | |||
| <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |||
| <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |||
| <ProjectGuid>{3FE1E3A5-A55A-4D1A-ACDD-85A9EE5B9D5B}</ProjectGuid> | |||
| <OutputType>Exe</OutputType> | |||
| <AppDesignerFolder>Properties</AppDesignerFolder> | |||
| <RootNamespace>Hack.Xenosaga</RootNamespace> | |||
| <AssemblyName>Xenosaga</AssemblyName> | |||
| <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> | |||
| <FileAlignment>512</FileAlignment> | |||
| <TargetFrameworkProfile /> | |||
| </PropertyGroup> | |||
| <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |||
| <PlatformTarget>AnyCPU</PlatformTarget> | |||
| <DebugSymbols>true</DebugSymbols> | |||
| <DebugType>full</DebugType> | |||
| <Optimize>false</Optimize> | |||
| <OutputPath>..\Build\bin\Debug\</OutputPath> | |||
| <DefineConstants>DEBUG;TRACE</DefineConstants> | |||
| <ErrorReport>prompt</ErrorReport> | |||
| <WarningLevel>4</WarningLevel> | |||
| <Prefer32Bit>false</Prefer32Bit> | |||
| <BaseIntermediateOutputPath>..\Build\obj</BaseIntermediateOutputPath> | |||
| </PropertyGroup> | |||
| <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |||
| <PlatformTarget>AnyCPU</PlatformTarget> | |||
| <DebugType>pdbonly</DebugType> | |||
| <Optimize>true</Optimize> | |||
| <OutputPath>..\Build\bin\Release\</OutputPath> | |||
| <DefineConstants>TRACE</DefineConstants> | |||
| <ErrorReport>prompt</ErrorReport> | |||
| <WarningLevel>4</WarningLevel> | |||
| <BaseIntermediateOutputPath>..\Build\obj</BaseIntermediateOutputPath> | |||
| </PropertyGroup> | |||
| <PropertyGroup> | |||
| <StartupObject>Hack.Xenosaga.Xenosaga</StartupObject> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <Reference Include="System" /> | |||
| <Reference Include="System.Core" /> | |||
| <Reference Include="System.Xml.Linq" /> | |||
| <Reference Include="System.Data.DataSetExtensions" /> | |||
| <Reference Include="Microsoft.CSharp" /> | |||
| <Reference Include="System.Data" /> | |||
| <Reference Include="System.Xml" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <Compile Include="Common\Functions.cs" /> | |||
| <Compile Include="Common\PathElement.cs" /> | |||
| <Compile Include="Common\Variables.cs" /> | |||
| <Compile Include="Process\Unpack.cs" /> | |||
| <Compile Include="Properties\AssemblyInfo.cs" /> | |||
| <Compile Include="Xenosaga.cs" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <None Include="App.config" /> | |||
| </ItemGroup> | |||
| <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | |||
| <!-- To modify your build process, add your task inside one of the targets below and uncomment it. | |||
| Other similar extension points exist, see Microsoft.Common.targets. | |||
| <Target Name="BeforeBuild"> | |||
| </Target> | |||
| <Target Name="AfterBuild"> | |||
| </Target> | |||
| --> | |||
| </Project> | |||
| @ -0,0 +1,476 @@ | |||
| using System; | |||
| using System.IO; | |||
| using System.Diagnostics; | |||
| using System.Text; | |||
| using Hack.Xenosaga.Common; | |||
| namespace Hack.Xenosaga.Process | |||
| { | |||
| class Unpack | |||
| { | |||
| private static BinaryWriter _bw; | |||
| private const string _listExtension = ".lst"; | |||
| private const string _copyright = "Hacked by BahaBulle (c)2016\0"; | |||
| private const int _sectorSize = 0x800; | |||
| private const int _maxSizeFile = 0x40000000; | |||
| private struct element | |||
| { | |||
| public bool isDirectory; | |||
| public bool isCompressed; | |||
| public byte level; | |||
| public string name; | |||
| public UInt32 sector; | |||
| public UInt32 position; | |||
| public UInt32 sizeIn; | |||
| public UInt32 sizeOut; | |||
| } | |||
| #region Private methods | |||
| private static int getIdFile(UInt32 position, int indexSize) | |||
| { | |||
| double d = (position - indexSize) / _maxSizeFile; | |||
| return (int)Math.Floor(d) + 1; | |||
| } | |||
| private static bool readElement(BinaryReader br, ref element e) | |||
| { | |||
| byte size = br.ReadByte(); | |||
| if (size == 0) | |||
| return false; | |||
| if ((size & 0x80) != 0) | |||
| { | |||
| size -= 2; | |||
| e.isDirectory = true; | |||
| e.level = br.ReadByte(); | |||
| e.name = Encoding.ASCII.GetString(br.ReadBytes(size & 0x7F)); | |||
| } | |||
| else | |||
| { | |||
| size--; | |||
| e.isDirectory = false; | |||
| e.level = 0; | |||
| e.name = Encoding.ASCII.GetString(br.ReadBytes(size & 0x3F)); | |||
| e.sector = br.ReadUInt16() + (uint)br.ReadByte() * 0x10000; | |||
| e.position = e.sector * _sectorSize; | |||
| e.sizeIn = br.ReadUInt32(); | |||
| if ((size & 0x40) != 0) | |||
| { | |||
| e.sizeOut = br.ReadUInt16() + (uint)br.ReadByte() * 0x10000; | |||
| e.isCompressed = true; | |||
| } | |||
| else | |||
| { | |||
| e.sizeOut = e.sizeIn; | |||
| e.isCompressed = false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| private static byte readIndex(string asIndexName, listPathElement path) | |||
| { | |||
| byte bIndexNbSector = 0; | |||
| int num = 0; | |||
| int level; | |||
| using (BinaryReader brIndex = new BinaryReader(File.Open(asIndexName, FileMode.Open))) | |||
| { | |||
| pathElement current = new pathElement(true); | |||
| bIndexNbSector = brIndex.ReadByte(); | |||
| element e = new element(); | |||
| while (readElement(brIndex, ref e)) | |||
| { | |||
| level = e.level; | |||
| while (e.level-- > 0) | |||
| current = current.Parent; | |||
| pathElement entry = new pathElement(e.isDirectory) { Name = e.name, Position = e.position, Sector = e.sector, SizeIn = e.sizeIn, SizeOut = e.sizeOut, Id = num++, Level = level, IsCompressed = e.isCompressed }; | |||
| current.addEntry(entry); | |||
| path.addToIndex(entry); | |||
| if (e.isDirectory) | |||
| current = entry; | |||
| } | |||
| } | |||
| return bIndexNbSector; | |||
| } | |||
| private static void writeIndex(string as_file, byte ai_nbSector, listPathElement index) | |||
| { | |||
| index.SortById(); | |||
| using (BinaryWriter bwIndex = new BinaryWriter(File.Open(Variables.dirPack + as_file, FileMode.Create))) | |||
| { | |||
| bwIndex.Write(ai_nbSector); | |||
| foreach (pathElement entryPath in index.getEntries()) | |||
| { | |||
| if (entryPath.Name != "") | |||
| { | |||
| if (entryPath.IsDirectory) | |||
| { | |||
| bwIndex.Write((byte)(entryPath.Name.Length + 0x82)); | |||
| bwIndex.Write((byte)entryPath.Level); | |||
| bwIndex.Write(entryPath.Name.ToCharArray()); | |||
| } | |||
| else | |||
| { | |||
| if (entryPath.IsCompressed) | |||
| bwIndex.Write((byte)(entryPath.Name.Length + 0x41)); | |||
| else | |||
| bwIndex.Write((byte)(entryPath.Name.Length + 1)); | |||
| bwIndex.Write(entryPath.Name.ToCharArray()); | |||
| bwIndex.Write((UInt16)entryPath.Sector); | |||
| bwIndex.Write((byte)(entryPath.Sector / 0x10000)); | |||
| bwIndex.Write((UInt32)entryPath.SizeIn); | |||
| if (entryPath.IsCompressed) | |||
| { | |||
| bwIndex.Write((UInt16)entryPath.SizeOut); | |||
| bwIndex.Write((byte)(entryPath.SizeOut / 0x10000)); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| bwIndex.Write((byte)0); | |||
| int size = (int)bwIndex.BaseStream.Length; | |||
| padding(bwIndex, ref size); | |||
| } | |||
| } | |||
| private static void padding(BinaryWriter a_bw, ref int size) | |||
| { | |||
| char[] hack = _copyright.ToCharArray(); | |||
| int id = 0; | |||
| while (size % _sectorSize != 0) | |||
| { | |||
| a_bw.Write(hack[id++]); | |||
| size++; | |||
| if (id >= hack.Length) | |||
| id = 0; | |||
| } | |||
| } | |||
| private static int AddFileToStream(string pathname, ref int num, BinaryReader br, int size, bool regroup) | |||
| { | |||
| if (_bw == null) | |||
| _bw = new BinaryWriter(File.Open(string.Format("{0}{1:00}", pathname, num), FileMode.Create)); | |||
| long pos = _bw.BaseStream.Position; | |||
| int size_rest = _maxSizeFile - (int)_bw.BaseStream.Length; | |||
| if (!regroup && size > size_rest) | |||
| { | |||
| _bw.Write(br.ReadBytes(size_rest), 0, size_rest); | |||
| _bw.Close(); | |||
| _bw.Dispose(); | |||
| num++; | |||
| _bw = new BinaryWriter(File.Open(string.Format("{0}{1:00}", pathname, num), FileMode.Create)); | |||
| _bw.Write(br.ReadBytes(size - size_rest), 0, size - size_rest); | |||
| } | |||
| else | |||
| _bw.Write(br.ReadBytes(size), 0, size); | |||
| padding(_bw, ref size); | |||
| return size; | |||
| } | |||
| #endregion | |||
| #region Public methods | |||
| public static void unpackIsoFiles(string indexName) | |||
| { | |||
| BinaryReader br = null; | |||
| byte bIndexNbSector = 0; | |||
| int numFileIndex; | |||
| int numFileOpen = -1; | |||
| int iIndexSize = 0; | |||
| string fileNameBase = Path.GetFileNameWithoutExtension(indexName); | |||
| int.TryParse(Path.GetExtension(indexName).Substring(1), out numFileIndex); | |||
| string directoryName = Variables.dirUnpack + string.Format("{0:D2}", numFileIndex); | |||
| listPathElement index = new listPathElement(); | |||
| Console.WriteLine("Traitement de l'index {0}", indexName); | |||
| // Lecture de l'index | |||
| try | |||
| { | |||
| bIndexNbSector = readIndex(indexName, index); | |||
| index.SortBySector(); | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| Console.WriteLine(" (EE) Erreur lors de la lecture de l'index : {0}", ex.Message); | |||
| return; | |||
| } | |||
| iIndexSize = bIndexNbSector * _sectorSize; | |||
| try | |||
| { | |||
| foreach (pathElement entryPath in index.getEntries()) | |||
| { | |||
| if (!entryPath.IsDirectory) | |||
| { | |||
| Console.WriteLine(" Ecriture du fichier {0}", entryPath.FullPath); | |||
| Directory.CreateDirectory(directoryName + Path.GetDirectoryName(entryPath.FullPath)); | |||
| int id = getIdFile(entryPath.Position, iIndexSize) + numFileIndex; | |||
| double pos = (entryPath.Position - iIndexSize) % _maxSizeFile; | |||
| if (numFileOpen == -1 || numFileOpen != id) | |||
| { | |||
| if (br != null) | |||
| { | |||
| br.Close(); | |||
| br.Dispose(); | |||
| } | |||
| br = new BinaryReader(File.Open(string.Format("{0}.{1:D2}", fileNameBase, id), FileMode.Open)); | |||
| numFileOpen = id; | |||
| } | |||
| br.BaseStream.Seek((int)pos, SeekOrigin.Begin); | |||
| int size_rest = (int)br.BaseStream.Length - (int)pos; | |||
| using (BinaryWriter bw = new BinaryWriter(File.Open(directoryName + entryPath.FullPath, FileMode.Create))) | |||
| { | |||
| if (size_rest >= entryPath.SizeIn) | |||
| bw.Write(br.ReadBytes((int)entryPath.SizeIn)); | |||
| else | |||
| { | |||
| bw.Write(br.ReadBytes(size_rest)); | |||
| int num = id + 1; | |||
| if (br != null) | |||
| { | |||
| br.Close(); | |||
| br.Dispose(); | |||
| } | |||
| br = new BinaryReader(File.Open(string.Format("{0}.{1:D2}", fileNameBase, num), FileMode.Open)); | |||
| numFileOpen = num; | |||
| bw.Write(br.ReadBytes((int)entryPath.SizeIn - size_rest)); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| Console.WriteLine(" (EE) Erreur lors de l'extraction des fichiers : {0}", ex.Message); | |||
| return; | |||
| } | |||
| } | |||
| public static void packIsoFiles(string indexName, bool regroup) | |||
| { | |||
| BinaryReader br = null; | |||
| byte bIndexNbSector = 0; | |||
| long l_sector = 0; | |||
| long l_position = 0; | |||
| int iIndexSize = 0; | |||
| int numFileIndex; | |||
| int numFileWrite = -1; | |||
| int idSave = -1; | |||
| string fileNameBase = Path.GetFileNameWithoutExtension(indexName); | |||
| int.TryParse(Path.GetExtension(indexName).Substring(1), out numFileIndex); | |||
| listPathElement index = new listPathElement(); | |||
| Console.WriteLine("Traitement de l'index {0}", indexName); | |||
| // Lecture de l'index | |||
| try | |||
| { | |||
| bIndexNbSector = readIndex(indexName, index); | |||
| index.SortBySector(); | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| Console.WriteLine(" (EE) Erreur lors de la lecture de l'index : {0}", ex.Message); | |||
| return; | |||
| } | |||
| l_sector += bIndexNbSector; | |||
| iIndexSize = bIndexNbSector * _sectorSize; | |||
| l_position += iIndexSize; | |||
| numFileWrite = numFileIndex + 1; | |||
| try | |||
| { | |||
| string s_pathname = string.Format("{0}{1}.", Variables.dirPack, fileNameBase); | |||
| Directory.CreateDirectory(Variables.dirPack); | |||
| foreach (pathElement entryPath in index.getEntries()) | |||
| { | |||
| if (!entryPath.IsDirectory) | |||
| { | |||
| long size = 0; | |||
| if (File.Exists(Variables.dirInsert + entryPath.Name)) | |||
| { | |||
| Console.WriteLine(" Insertion du fichier {0}", entryPath.FullPath); | |||
| using (BinaryReader brFile = new BinaryReader(File.Open(Variables.dirInsert + entryPath.Name, FileMode.Open))) | |||
| { | |||
| size = brFile.BaseStream.Length; | |||
| if (entryPath.IsCompressed) | |||
| { | |||
| // Compression du fichier | |||
| entryPath.SizeIn = (UInt32)size; | |||
| //entryPath.SizeOut = entryPath.SizeIn; | |||
| } | |||
| else | |||
| { | |||
| entryPath.SizeIn = (UInt32)size; | |||
| //entryPath.SizeOut = entryPath.SizeIn; | |||
| } | |||
| int size_new = AddFileToStream(s_pathname, ref numFileWrite, brFile, (int)size, regroup); | |||
| entryPath.Position = (UInt32)l_position; | |||
| entryPath.Sector = entryPath.Position / _sectorSize; | |||
| l_position += size_new; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| Console.WriteLine(" Copie du fichier {0}", entryPath.FullPath); | |||
| size = entryPath.SizeIn; | |||
| int id = getIdFile(entryPath.Position, iIndexSize) + numFileIndex; | |||
| double pos = (entryPath.Position - iIndexSize) % _maxSizeFile; | |||
| int size_new = 0; | |||
| if (br != null && id != idSave) | |||
| { | |||
| br.Close(); | |||
| br.Dispose(); | |||
| br = null; | |||
| } | |||
| if (br == null) | |||
| { | |||
| br = new BinaryReader(File.Open(string.Format("{0}.{1:D2}", fileNameBase, id), FileMode.Open)); | |||
| idSave = id; | |||
| } | |||
| br.BaseStream.Seek((int)pos, SeekOrigin.Begin); | |||
| int size_rest = (int)br.BaseStream.Length - (int)pos; | |||
| if (size_rest >= size) | |||
| size_new = AddFileToStream(s_pathname, ref numFileWrite, br, (int)size, regroup); | |||
| else | |||
| { | |||
| int sizeTemp = AddFileToStream(s_pathname, ref numFileWrite, br, size_rest, regroup); | |||
| int num = id + 1; | |||
| size_new = sizeTemp; | |||
| if (br != null) | |||
| { | |||
| br.Close(); | |||
| br.Dispose(); | |||
| } | |||
| br = new BinaryReader(File.Open(string.Format("{0}.{1:D2}", fileNameBase, num), FileMode.Open)); | |||
| idSave = num; | |||
| sizeTemp = AddFileToStream(s_pathname, ref numFileWrite, br, (int)entryPath.SizeIn - size_rest, regroup); | |||
| size_new += sizeTemp; | |||
| } | |||
| entryPath.Position = (UInt32)l_position; | |||
| entryPath.Sector = entryPath.Position / _sectorSize; | |||
| l_position += size_new; | |||
| } | |||
| } | |||
| } | |||
| _bw.Close(); | |||
| _bw.Dispose(); | |||
| writeIndex(indexName, bIndexNbSector, index); | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| Console.WriteLine("(EE) Erreur lors de l'insertion des fichiers : {0}", ex.Message); | |||
| return; | |||
| } | |||
| } | |||
| public static void listFiles(string indexName) | |||
| { | |||
| byte bIndexNbSector = 0; | |||
| int iIndexSize; | |||
| int numFile; | |||
| int.TryParse(Path.GetExtension(indexName).Substring(1), out numFile); | |||
| listPathElement index = new listPathElement(); | |||
| Console.WriteLine("Traitement de l'index {0}", indexName); | |||
| try | |||
| { | |||
| Directory.CreateDirectory(Variables.dirUnpack); | |||
| using (StreamWriter sw = new StreamWriter(string.Format("{0}{1}{2}", Variables.dirUnpack, indexName, _listExtension))) | |||
| { | |||
| TextWriterTraceListener twtl_trace = new TextWriterTraceListener(sw); | |||
| Trace.Listeners.Add(twtl_trace); | |||
| bIndexNbSector = readIndex(indexName, index); | |||
| index.SortBySector(); | |||
| iIndexSize = bIndexNbSector * _sectorSize; | |||
| foreach (pathElement entryPath in index.getEntries()) | |||
| { | |||
| if (!entryPath.IsDirectory) | |||
| { | |||
| double d = (entryPath.Position - iIndexSize) / _maxSizeFile; | |||
| int id = (int)Math.Floor(d) + 1; | |||
| Trace.WriteLine(string.Format("{0,-36}Sector={1,-15}SizeIn={2,-15}SizeOut={3,-15}File=xenosaga.{4:D2}", entryPath.FullPath, entryPath.Sector, entryPath.SizeIn, entryPath.SizeOut, id + numFile)); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| Console.WriteLine(" (EE) Erreur lors de la lecture de l'index : {0}", ex.Message); | |||
| return; | |||
| } | |||
| } | |||
| #endregion | |||
| } | |||
| } | |||
| @ -0,0 +1,36 @@ | |||
| using System.Reflection; | |||
| using System.Runtime.CompilerServices; | |||
| using System.Runtime.InteropServices; | |||
| // Les informations générales relatives à un assembly dépendent de | |||
| // l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations | |||
| // associées à un assembly. | |||
| [assembly: AssemblyTitle("Hack.Xenosaga")] | |||
| [assembly: AssemblyDescription("")] | |||
| [assembly: AssemblyConfiguration("")] | |||
| [assembly: AssemblyCompany("")] | |||
| [assembly: AssemblyProduct("Hack.Xenosaga")] | |||
| [assembly: AssemblyCopyright("Copyright © 2016")] | |||
| [assembly: AssemblyTrademark("")] | |||
| [assembly: AssemblyCulture("")] | |||
| // L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly | |||
| // aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de | |||
| // COM, affectez la valeur true à l'attribut ComVisible sur ce type. | |||
| [assembly: ComVisible(false)] | |||
| // Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM | |||
| [assembly: Guid("e34b0f4d-db94-4f48-aed4-1b4fd63075ae")] | |||
| // Les informations de version pour un assembly se composent des quatre valeurs suivantes : | |||
| // | |||
| // Version principale | |||
| // Version secondaire | |||
| // Numéro de build | |||
| // Révision | |||
| // | |||
| // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut | |||
| // en utilisant '*', comme indiqué ci-dessous : | |||
| // [assembly: AssemblyVersion("1.0.*")] | |||
| [assembly: AssemblyVersion("1.0.0.0")] | |||
| [assembly: AssemblyFileVersion("1.0.0.0")] | |||
| @ -0,0 +1,34 @@ | |||
| using Hack.Xenosaga.Common; | |||
| using Hack.Xenosaga.Process; | |||
| namespace Hack.Xenosaga | |||
| { | |||
| class Xenosaga | |||
| { | |||
| public static void Main(string[] args) | |||
| { | |||
| Variables.stArgs listArgs; | |||
| if (!Functions.checkArgs(args, out listArgs)) | |||
| { | |||
| Functions.usage(); | |||
| return; | |||
| } | |||
| switch (listArgs.option) | |||
| { | |||
| case "-l": | |||
| Unpack.listFiles(listArgs.filename); | |||
| break; | |||
| case "-p": | |||
| Unpack.packIsoFiles(listArgs.filename, listArgs.regroup); | |||
| break; | |||
| case "-u": | |||
| Unpack.unpackIsoFiles(listArgs.filename); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,340 @@ | |||
| GNU GENERAL PUBLIC LICENSE | |||
| Version 2, June 1991 | |||
| Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> | |||
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| Everyone is permitted to copy and distribute verbatim copies | |||
| of this license document, but changing it is not allowed. | |||
| Preamble | |||
| The licenses for most software are designed to take away your | |||
| freedom to share and change it. By contrast, the GNU General Public | |||
| License is intended to guarantee your freedom to share and change free | |||
| software--to make sure the software is free for all its users. This | |||
| General Public License applies to most of the Free Software | |||
| Foundation's software and to any other program whose authors commit to | |||
| using it. (Some other Free Software Foundation software is covered by | |||
| the GNU Lesser General Public License instead.) You can apply it to | |||
| your programs, too. | |||
| When we speak of free software, we are referring to freedom, not | |||
| price. Our General Public Licenses are designed to make sure that you | |||
| have the freedom to distribute copies of free software (and charge for | |||
| this service if you wish), that you receive source code or can get it | |||
| if you want it, that you can change the software or use pieces of it | |||
| in new free programs; and that you know you can do these things. | |||
| To protect your rights, we need to make restrictions that forbid | |||
| anyone to deny you these rights or to ask you to surrender the rights. | |||
| These restrictions translate to certain responsibilities for you if you | |||
| distribute copies of the software, or if you modify it. | |||
| For example, if you distribute copies of such a program, whether | |||
| gratis or for a fee, you must give the recipients all the rights that | |||
| you have. You must make sure that they, too, receive or can get the | |||
| source code. And you must show them these terms so they know their | |||
| rights. | |||
| We protect your rights with two steps: (1) copyright the software, and | |||
| (2) offer you this license which gives you legal permission to copy, | |||
| distribute and/or modify the software. | |||
| Also, for each author's protection and ours, we want to make certain | |||
| that everyone understands that there is no warranty for this free | |||
| software. If the software is modified by someone else and passed on, we | |||
| want its recipients to know that what they have is not the original, so | |||
| that any problems introduced by others will not reflect on the original | |||
| authors' reputations. | |||
| Finally, any free program is threatened constantly by software | |||
| patents. We wish to avoid the danger that redistributors of a free | |||
| program will individually obtain patent licenses, in effect making the | |||
| program proprietary. To prevent this, we have made it clear that any | |||
| patent must be licensed for everyone's free use or not licensed at all. | |||
| The precise terms and conditions for copying, distribution and | |||
| modification follow. | |||
| GNU GENERAL PUBLIC LICENSE | |||
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |||
| 0. This License applies to any program or other work which contains | |||
| a notice placed by the copyright holder saying it may be distributed | |||
| under the terms of this General Public License. The "Program", below, | |||
| refers to any such program or work, and a "work based on the Program" | |||
| means either the Program or any derivative work under copyright law: | |||
| that is to say, a work containing the Program or a portion of it, | |||
| either verbatim or with modifications and/or translated into another | |||
| language. (Hereinafter, translation is included without limitation in | |||
| the term "modification".) Each licensee is addressed as "you". | |||
| Activities other than copying, distribution and modification are not | |||
| covered by this License; they are outside its scope. The act of | |||
| running the Program is not restricted, and the output from the Program | |||
| is covered only if its contents constitute a work based on the | |||
| Program (independent of having been made by running the Program). | |||
| Whether that is true depends on what the Program does. | |||
| 1. You may copy and distribute verbatim copies of the Program's | |||
| source code as you receive it, in any medium, provided that you | |||
| conspicuously and appropriately publish on each copy an appropriate | |||
| copyright notice and disclaimer of warranty; keep intact all the | |||
| notices that refer to this License and to the absence of any warranty; | |||
| and give any other recipients of the Program a copy of this License | |||
| along with the Program. | |||
| You may charge a fee for the physical act of transferring a copy, and | |||
| you may at your option offer warranty protection in exchange for a fee. | |||
| 2. You may modify your copy or copies of the Program or any portion | |||
| of it, thus forming a work based on the Program, and copy and | |||
| distribute such modifications or work under the terms of Section 1 | |||
| above, provided that you also meet all of these conditions: | |||
| a) You must cause the modified files to carry prominent notices | |||
| stating that you changed the files and the date of any change. | |||
| b) You must cause any work that you distribute or publish, that in | |||
| whole or in part contains or is derived from the Program or any | |||
| part thereof, to be licensed as a whole at no charge to all third | |||
| parties under the terms of this License. | |||
| c) If the modified program normally reads commands interactively | |||
| when run, you must cause it, when started running for such | |||
| interactive use in the most ordinary way, to print or display an | |||
| announcement including an appropriate copyright notice and a | |||
| notice that there is no warranty (or else, saying that you provide | |||
| a warranty) and that users may redistribute the program under | |||
| these conditions, and telling the user how to view a copy of this | |||
| License. (Exception: if the Program itself is interactive but | |||
| does not normally print such an announcement, your work based on | |||
| the Program is not required to print an announcement.) | |||
| These requirements apply to the modified work as a whole. If | |||
| identifiable sections of that work are not derived from the Program, | |||
| and can be reasonably considered independent and separate works in | |||
| themselves, then this License, and its terms, do not apply to those | |||
| sections when you distribute them as separate works. But when you | |||
| distribute the same sections as part of a whole which is a work based | |||
| on the Program, the distribution of the whole must be on the terms of | |||
| this License, whose permissions for other licensees extend to the | |||
| entire whole, and thus to each and every part regardless of who wrote it. | |||
| Thus, it is not the intent of this section to claim rights or contest | |||
| your rights to work written entirely by you; rather, the intent is to | |||
| exercise the right to control the distribution of derivative or | |||
| collective works based on the Program. | |||
| In addition, mere aggregation of another work not based on the Program | |||
| with the Program (or with a work based on the Program) on a volume of | |||
| a storage or distribution medium does not bring the other work under | |||
| the scope of this License. | |||
| 3. You may copy and distribute the Program (or a work based on it, | |||
| under Section 2) in object code or executable form under the terms of | |||
| Sections 1 and 2 above provided that you also do one of the following: | |||
| a) Accompany it with the complete corresponding machine-readable | |||
| source code, which must be distributed under the terms of Sections | |||
| 1 and 2 above on a medium customarily used for software interchange; or, | |||
| b) Accompany it with a written offer, valid for at least three | |||
| years, to give any third party, for a charge no more than your | |||
| cost of physically performing source distribution, a complete | |||
| machine-readable copy of the corresponding source code, to be | |||
| distributed under the terms of Sections 1 and 2 above on a medium | |||
| customarily used for software interchange; or, | |||
| c) Accompany it with the information you received as to the offer | |||
| to distribute corresponding source code. (This alternative is | |||
| allowed only for noncommercial distribution and only if you | |||
| received the program in object code or executable form with such | |||
| an offer, in accord with Subsection b above.) | |||
| The source code for a work means the preferred form of the work for | |||
| making modifications to it. For an executable work, complete source | |||
| code means all the source code for all modules it contains, plus any | |||
| associated interface definition files, plus the scripts used to | |||
| control compilation and installation of the executable. However, as a | |||
| special exception, the source code distributed need not include | |||
| anything that is normally distributed (in either source or binary | |||
| form) with the major components (compiler, kernel, and so on) of the | |||
| operating system on which the executable runs, unless that component | |||
| itself accompanies the executable. | |||
| If distribution of executable or object code is made by offering | |||
| access to copy from a designated place, then offering equivalent | |||
| access to copy the source code from the same place counts as | |||
| distribution of the source code, even though third parties are not | |||
| compelled to copy the source along with the object code. | |||
| 4. You may not copy, modify, sublicense, or distribute the Program | |||
| except as expressly provided under this License. Any attempt | |||
| otherwise to copy, modify, sublicense or distribute the Program is | |||
| void, and will automatically terminate your rights under this License. | |||
| However, parties who have received copies, or rights, from you under | |||
| this License will not have their licenses terminated so long as such | |||
| parties remain in full compliance. | |||
| 5. You are not required to accept this License, since you have not | |||
| signed it. However, nothing else grants you permission to modify or | |||
| distribute the Program or its derivative works. These actions are | |||
| prohibited by law if you do not accept this License. Therefore, by | |||
| modifying or distributing the Program (or any work based on the | |||
| Program), you indicate your acceptance of this License to do so, and | |||
| all its terms and conditions for copying, distributing or modifying | |||
| the Program or works based on it. | |||
| 6. Each time you redistribute the Program (or any work based on the | |||
| Program), the recipient automatically receives a license from the | |||
| original licensor to copy, distribute or modify the Program subject to | |||
| these terms and conditions. You may not impose any further | |||
| restrictions on the recipients' exercise of the rights granted herein. | |||
| You are not responsible for enforcing compliance by third parties to | |||
| this License. | |||
| 7. If, as a consequence of a court judgment or allegation of patent | |||
| infringement or for any other reason (not limited to patent issues), | |||
| conditions are imposed on you (whether by court order, agreement or | |||
| otherwise) that contradict the conditions of this License, they do not | |||
| excuse you from the conditions of this License. If you cannot | |||
| distribute so as to satisfy simultaneously your obligations under this | |||
| License and any other pertinent obligations, then as a consequence you | |||
| may not distribute the Program at all. For example, if a patent | |||
| license would not permit royalty-free redistribution of the Program by | |||
| all those who receive copies directly or indirectly through you, then | |||
| the only way you could satisfy both it and this License would be to | |||
| refrain entirely from distribution of the Program. | |||
| If any portion of this section is held invalid or unenforceable under | |||
| any particular circumstance, the balance of the section is intended to | |||
| apply and the section as a whole is intended to apply in other | |||
| circumstances. | |||
| It is not the purpose of this section to induce you to infringe any | |||
| patents or other property right claims or to contest validity of any | |||
| such claims; this section has the sole purpose of protecting the | |||
| integrity of the free software distribution system, which is | |||
| implemented by public license practices. Many people have made | |||
| generous contributions to the wide range of software distributed | |||
| through that system in reliance on consistent application of that | |||
| system; it is up to the author/donor to decide if he or she is willing | |||
| to distribute software through any other system and a licensee cannot | |||
| impose that choice. | |||
| This section is intended to make thoroughly clear what is believed to | |||
| be a consequence of the rest of this License. | |||
| 8. If the distribution and/or use of the Program is restricted in | |||
| certain countries either by patents or by copyrighted interfaces, the | |||
| original copyright holder who places the Program under this License | |||
| may add an explicit geographical distribution limitation excluding | |||
| those countries, so that distribution is permitted only in or among | |||
| countries not thus excluded. In such case, this License incorporates | |||
| the limitation as if written in the body of this License. | |||
| 9. The Free Software Foundation may publish revised and/or new versions | |||
| of the General Public License from time to time. Such new versions will | |||
| be similar in spirit to the present version, but may differ in detail to | |||
| address new problems or concerns. | |||
| Each version is given a distinguishing version number. If the Program | |||
| specifies a version number of this License which applies to it and "any | |||
| later version", you have the option of following the terms and conditions | |||
| either of that version or of any later version published by the Free | |||
| Software Foundation. If the Program does not specify a version number of | |||
| this License, you may choose any version ever published by the Free Software | |||
| Foundation. | |||
| 10. If you wish to incorporate parts of the Program into other free | |||
| programs whose distribution conditions are different, write to the author | |||
| to ask for permission. For software which is copyrighted by the Free | |||
| Software Foundation, write to the Free Software Foundation; we sometimes | |||
| make exceptions for this. Our decision will be guided by the two goals | |||
| of preserving the free status of all derivatives of our free software and | |||
| of promoting the sharing and reuse of software generally. | |||
| NO WARRANTY | |||
| 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |||
| REPAIR OR CORRECTION. | |||
| 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGES. | |||
| END OF TERMS AND CONDITIONS | |||
| How to Apply These Terms to Your New Programs | |||
| If you develop a new program, and you want it to be of the greatest | |||
| possible use to the public, the best way to achieve this is to make it | |||
| free software which everyone can redistribute and change under these terms. | |||
| To do so, attach the following notices to the program. It is safest | |||
| to attach them to the start of each source file to most effectively | |||
| convey the exclusion of warranty; and each file should have at least | |||
| the "copyright" line and a pointer to where the full notice is found. | |||
| {description} | |||
| Copyright (C) {year} {fullname} | |||
| This program is free software; you can redistribute it and/or modify | |||
| it under the terms of the GNU General Public License as published by | |||
| the Free Software Foundation; either version 2 of the License, or | |||
| (at your option) any later version. | |||
| This program is distributed in the hope that it will be useful, | |||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU General Public License for more details. | |||
| You should have received a copy of the GNU General Public License along | |||
| with this program; if not, write to the Free Software Foundation, Inc., | |||
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||
| Also add information on how to contact you by electronic and paper mail. | |||
| If the program is interactive, make it output a short notice like this | |||
| when it starts in an interactive mode: | |||
| Gnomovision version 69, Copyright (C) year name of author | |||
| Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||
| This is free software, and you are welcome to redistribute it | |||
| under certain conditions; type `show c' for details. | |||
| The hypothetical commands `show w' and `show c' should show the appropriate | |||
| parts of the General Public License. Of course, the commands you use may | |||
| be called something other than `show w' and `show c'; they could even be | |||
| mouse-clicks or menu items--whatever suits your program. | |||
| You should also get your employer (if you work as a programmer) or your | |||
| school, if any, to sign a "copyright disclaimer" for the program, if | |||
| necessary. Here is a sample; alter the names: | |||
| Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |||
| `Gnomovision' (which makes passes at compilers) written by James Hacker. | |||
| {signature of Ty Coon}, 1 April 1989 | |||
| Ty Coon, President of Vice | |||
| This General Public License does not permit incorporating your program into | |||
| proprietary programs. If your program is a subroutine library, you may | |||
| consider it more useful to permit linking proprietary applications with the | |||
| library. If this is what you want to do, use the GNU Lesser General | |||
| Public License instead of this License. | |||
| @ -0,0 +1,9 @@ | |||
| Tool dedicated to isohacking for Xenosaga on Playstation 2 | |||
| Usage : | |||
| xenosaga <option> <file> [regroup] | |||
| option : -l = List files from index | |||
| -u = Unpack files from index | |||
| -p = Pack files from index | |||
| file : Index file (the first one of each decade : xenosaga.00, xenosaga.10, xenosaga.20...) | |||
| regroup : true to regroup all files in only one (ex: 11, 12, 13 in 11) ; false or empty (default) to keep the same system of increment files | |||