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