@ -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 |