[Projekt] Extracting Ace Combat
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
- Schrompf
- Moderator
- Beiträge: 4856
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Wow, cool.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
-
- Establishment
- Beiträge: 237
- Registriert: 04.02.2005, 09:12
- Benutzertext: www.gamedevstudio.com
- Echter Name: Thomas Mittelsdorf
- Wohnort: Meiningen
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Das ist wirklich eine echte Leistung. Hut ab !!!
Re: [Projekt] Extracting Ace Combat
ist noch interessant, ein paar modelle scheinen sich zu wiederholen. so sparsam waren sie wohl doch nicht :)
Discord: https://discord.gg/AWhsvN3 für Devader: http://devader.space
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Da geht’s um die Positionierungszeit des CD-Lesekopfes. Die sich wiederholenden Modelle sind je 2–10 KiB groß, aber dafür sind nun alle Modelle eines Levels auf einem Haufen (im selben oder in benachbarten Sektoren).marcgfx hat geschrieben:ist noch interessant, ein paar modelle scheinen sich zu wiederholen. so sparsam waren sie wohl doch nicht :)
So wurde wohl bei vielen Spielen verfahren. Die 600 MiB einer CD waren ja gigantisch, verglichen mit den 64 MiB eines N64-Spiels. Dabei hat man gern Zeit gegen Platz getauscht.
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
I was just trying to extract data from the mission’s 0003.ulz folder, which I suspected to contain terrain details.
The structure is pretty much the same as for the meshes in 0005, with just a few differences. The hex formatting is straightforward and boring, so I’ll skip directly to the layouts:
I expected some terrain details when instead I got these beauties:
The structure is pretty much the same as for the meshes in 0005, with just a few differences. The hex formatting is straightforward and boring, so I’ll skip directly to the layouts:
Code: Alles auswählen
struct Mesh_0003_Header {
UInt4B_LE unknown;
UInt4B_LE vertexOffsets[3];
UInt4B_LE zero;
UInt4B_LE offsetOfTriangles;
UInt4B_LE offsetOfQuads;
};
// 32-B wide triangle structure.
// • maps directly to bytes in a file
// • can be found in mission/0003.ulz files
// • Gouraud-shaded
struct Mesh_Triangle_32 {
UInt2B_LE unk[2];
UInt1B indices[3];
UInt1B zero;
UInt4B_LE colors[3];
UInt1B unk2[6];
UInt2B_LE unk3;
UInt1B unk4[2];
UInt2B_LE zero2;
};
// 36-B wide quad structure.
// • maps directly to bytes in a file
// • can be found in mission/0003.ulz files
// • Gouraud-shaded
struct Mesh_Quad_36 {
UInt2B_LE unk[2];
UInt1B indices[4];
UInt4B_LE colors[4];
UInt1B unk2[6];
UInt2B_LE unk3;
UInt1B unk4[4];
};
- just NPC meshes
- you can identify some low-poly LODs
- only triangle colors here, I didn’t implement vertex colors/Gouraud shading yet
- no textures yet (texture coordinates are present in the files; I’m 95 % sure)
- there’s actually up to three sets of vertices with identical triangle/quad information in each mesh (may be different damage levels); just showing the first set here
- some surfaces are still missing – I probably skipped another triangle/quad block that appears in only a few files
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Nicht meins, aber für Fans ein Fest: Team NEMO hat die Übersetzung fertig.
Damit kann jeder, der eine ISO der japanischen Originalversion hat, diese nun auch auf Englisch spielen, statt sich mit der stark zusammengekürzten Version abzumühen.
- English subtitles for all 52 missions from both discs;
- the subs from last year's Disc 1 patch have been revised;
- localization work by Guest Localizer Agness Kaku on M01;
- translations for Armory, Search and Archive menus.
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Christmas time, spare time, Ace Combat time.
I changed my output format from STL to VRML. Still no texture coordinates, but at least vertex colors work properly.
Furthermore, the tile map in each level’s 0001.ulz can be decoded like:
Textures an write-ups will take a while (probably months, again). In the meantime, enjoy this shot of Expo City:
I changed my output format from STL to VRML. Still no texture coordinates, but at least vertex colors work properly.
Furthermore, the tile map in each level’s 0001.ulz can be decoded like:
- throw away zeroes (that’s holes in the terrain)
- keep only the least significant 9 bits (& 511)
- subtract one
- get the according file from 0002.ulz
Textures an write-ups will take a while (probably months, again). In the meantime, enjoy this shot of Expo City:
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
The format of the playable planes is pretty complicated.
- There’s three sets of vertices, and the first two sets are distorted. Probably some kind of dynamic LOD.
- Many objects have no triangles. I suspect there’s multiple vertex sets for the same triangle indices in different situations (e.g. air brake extended/retracted; rudders left/center/right) and the game interpolates the sets dynamically.
- There’s four different data layouts for triangles/quads with/without lighting.
- These are the only models without pre-baked lighting and with per-vertex normals instead.
Re: [Projekt] Extracting Ace Combat
ist ja wie ein rätsel lösen. ist das mehr meditativ oder doch eher frustrierend? bzw wie lange hast du um die einzelnen schritte zu lösen und wie oft läufst du in die falsche richtung :)
Discord: https://discord.gg/AWhsvN3 für Devader: http://devader.space
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Kommt drauf an – meistens meditativ, ich tu’s ja zur Entspannung. Aber wenn ich keine Texturen extrahieren kann, weil mein Viewer die noch nicht unterstützt und ich das erstmal implementieren muss und noch mehr Drumherum dazukommt, nervt’s auch schonmal. Die vorher erwähnten Vertex-Koordinaten mit XY-XY-XY-Z-Z-Z waren auch grenzwertig.
Dazu muss man aber sagen, dass Ace Combat 3 wirklich einfach ist im Vergleich zu Driver 2 vorher. Die Modelle haben quasi alle die gleiche Struktur. Man kriegt sehr schnell Ergebnisse. Darum schreibe ich auch darüber, und nicht über wirklich harte Brocken.
Dazu muss man aber sagen, dass Ace Combat 3 wirklich einfach ist im Vergleich zu Driver 2 vorher. Die Modelle haben quasi alle die gleiche Struktur. Man kriegt sehr schnell Ergebnisse. Darum schreibe ich auch darüber, und nicht über wirklich harte Brocken.
Re: [Projekt] Extracting Ace Combat
Hello, I wrote a new ulz decompressor, the dashman's code has a bug on ulz v0 flag reading.
I did some checks and for the Japanese version, the first cd contains 2256 ulz files (from ACE.BPB), dashman's decompressor works on 2014 files while mine has no problem at all, all 2256 files decompressed.
Maybe what you are looking for is in those uncompressed files.
You can download the tool here, I plan to write a compressor too and an unpacker for ACE.BPB and ACE.SPB
:D
I did some checks and for the Japanese version, the first cd contains 2256 ulz files (from ACE.BPB), dashman's decompressor works on 2014 files while mine has no problem at all, all 2256 files decompressed.
Maybe what you are looking for is in those uncompressed files.
You can download the tool here, I plan to write a compressor too and an unpacker for ACE.BPB and ACE.SPB
:D
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Can you give an example of a specific file that decompresses fine with your script but was broken before? I can’t see any difference. My code is based on “ULZ update 1.cs” by esperknight.
However, the code is now drastically reduced due to the similarities in both compression methods you found … good work!
Here’s my current code:
However, the code is now drastically reduced due to the similarities in both compression methods you found … good work!
Here’s my current code:
Code: Alles auswählen
struct Header {
// Always “ULZ\x1A”.
UInt4B_LE id;
// • bits 0–23: extracted size
// • bits 24–31: compression type (“0” or “2”)
UInt4B_LE typeAndSize;
// • bits 0–23: offset of symbol table from beginning of archive
// • bits 24–31: log2 of sliding window
UInt4B_LE u_pos;
// Offset of lookups from beginning of archive.
UInt4B_LE c_pos;
UInt4B_LE flags[];
};
// Checks whether the given bytes mark the beginning of an ULZ stream.
// • pass at least 20 bytes
bool isULZ(Byte const * toData, USize const dataSize) {
return 20 < dataSize && *reinterpret_cast<UInt4B_LE const *>(toData) == bigEndian(0x556C7A1Au);
}
// Returns the size of the extracted data. ULZ supports file sizes up to 24 MiB.
USize extractedSizeOf(Header const & header) {
return littleEndian(header.typeAndSize) & 0xFFFFFF;
}
// Extracts the given ULZ to the given address.
// • returns “no” on failure
// • requires sufficient space – use “extractedSizeOf()”
bool extract(Byte * toOutput, Byte const * const toInput, USize const compressedSize) {
if(no == isULZ(toInput, compressedSize)) {
__debugbreak();
return no;
}
auto & header = *reinterpret_cast<Header const *>(toInput);
auto const type = littleEndian(header.typeAndSize) >> 24;
auto const offsetBits = littleEndian(header.u_pos) >> 24u;
auto const offsetMask = (1u << offsetBits) - 1;
{
// The sliding window cannot be larger than 2^15 B (because offset-length pairs are 16-bit integers):
if(offsetBits > 15) {
__debugbreak(); // TODO: error: bad window
return no;
}
// All tables must be located within the file.
// TODO
}
// There is one stream of new symbols:
auto toUncompressedData = toInput + (littleEndian(header.u_pos) & 0xFFFFFF);
// There is one stream of lookups (offset + length) into already-decompressed data:
auto toCompressedData = reinterpret_cast<UInt2B const *>(toInput + littleEndian(header.c_pos));
// There is one stream of 32-bit flags, where each bit determines whether the next symbol is known (offset + length):
auto toFlags = header.flags;
auto bytesLeft = extractedSizeOf(header);
if(0 == bytesLeft) {
return yes; // nothing to do (never happens with real files)
}
// Both type 0 and type 2 consume bits (starting at the most significant position), but type 1 skips every 32nd bit:
UInt4B flagMaskIfConsumed;
switch(type) {
case 0: flagMaskIfConsumed = 1; break;
case 2: flagMaskIfConsumed = 0; break;
default: __debugbreak(); return no; // TODO: error: bad type
}
UInt4B flags;
UInt4B flagMask = flagMaskIfConsumed; // force refill on first iteration
do {
if(flagMaskIfConsumed == flagMask) { // All flags consumed?
flags = littleEndian(*toFlags++);
flagMask = 0x80000000u;
}
if(flags & flagMask) {
// Copy an uncompressed byte:
*toOutput++ = *toUncompressedData++;
--bytesLeft;
} else {
// Duplicate “length” bytes starting backwards at “offset” in the result.
auto const offsetAndLength = UInt4B(littleEndian(*toCompressedData++));
auto const offset = offsetAndLength & offsetMask;
auto const length = 3 + (offsetAndLength >> offsetBits);
if(length > bytesLeft) {
__debugbreak(); // TODO: error: overrun
return no;
}
movsb(toOutput, toOutput - 1 - offset, length);
toOutput += length;
bytesLeft -= length;
}
flagMask >>= 1;
} while(bytesLeft);
return yes;
}
Re: [Projekt] Extracting Ace Combat
thanks!
In the original implementation, the function Uncompress_v0 is running until flags == 0 and doesn't check the final size at all, this brings to the bug that I fixed in my code.
Here a list of file extracted with the bugfix
the same list without the size, easier to read
Until my implementation I used the c# code compiled in mono
In the original implementation, the function Uncompress_v0 is running until flags == 0 and doesn't check the final size at all, this brings to the bug that I fixed in my code.
Here a list of file extracted with the bugfix
Code: Alles auswählen
.
├── [ 4096] BPB/
│ ├── [ 4096] 0005/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0006/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0007/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0008/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 245180] 0011.bin
│ │ ├── [ 76100] 0012.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0009/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 4828] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0010/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 788] 0013.bin
│ │ └── [ 22764] 0014.bin
│ ├── [ 4096] 0011/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 25168] 0012.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0012/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0013/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0014/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0015/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0016/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 18776] 0006.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0017/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 25232] 0012.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0018/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 16844] 0012.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0019/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0020/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 788] 0013.bin
│ │ └── [ 17580] 0014.bin
│ ├── [ 4096] 0021/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 2680] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0022/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0023/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0024/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 2684] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0025/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 6800] 0007.bin
│ │ ├── [ 788] 0013.bin
│ │ └── [ 22764] 0014.bin
│ ├── [ 4096] 0026/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 3784] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0027/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0028/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0029/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0030/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 4456] 0007.bin
│ │ ├── [ 572] 0010.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0031/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0032/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 18776] 0006.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0033/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0034/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0035/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0036/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0037/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0038/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 50524] 0012.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0039/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0040/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0041/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0042/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 4544] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0043/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0044/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0045/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0046/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0048/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0049/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 5680] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0050/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 4948] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0051/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0052/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 16876] 0012.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0053/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0054/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 1016] 0007.bin
│ ├── [ 4096] 0055/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0056/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0057/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0058/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 1664] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0059/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0060/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 297748] 0002.bin
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 2504] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0061/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 17184] 0006.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0062/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 980] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0063/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 3616] 0004.tim
│ │ ├── [ 952] 0007.bin
│ │ └── [ 788] 0013.bin
│ ├── [ 4096] 0064/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 18872] 0003.bin
│ │ └── [ 8360] 0012.bin
│ ├── [ 4096] 0065/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 18872] 0003.bin
│ │ ├── [ 1016] 0007.bin
│ │ └── [ 8360] 0012.bin
│ ├── [ 4096] 0071/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33868] 0002.bin
│ ├── [ 4096] 0074/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33868] 0002.bin
│ ├── [ 4096] 0075/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33868] 0002.bin
│ ├── [ 4096] 0089/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33868] 0002.bin
│ ├── [ 4096] 0094/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33868] 0002.bin
│ ├── [ 4096] 0102/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33868] 0002.bin
│ ├── [ 4096] 0112/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 329344] 0004.bin
│ │ └── [ 8100] 0007.bin
│ ├── [ 4096] 0113/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 8100] 0000.bin
│ │ └── [ 16048] 0003.bin
│ ├── [ 4096] 0114/
│ │ └── [ 4096] 0004/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 15940] 0001.tim
│ ├── [ 4096] 0116/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] 0006/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 11208] 0001.bin
│ ├── [ 4096] 0118/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] 0007/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 15772] 0000.bin
│ ├── [ 4096] 0119/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 10920] 0001.bin
│ ├── [ 4096] 0121/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 5248] 0000.tim
│ │ ├── [ 5248] 0001.tim
│ │ ├── [ 5248] 0002.tim
│ │ ├── [ 5248] 0003.tim
│ │ ├── [ 5248] 0004.tim
│ │ ├── [ 5248] 0008.tim
│ │ ├── [ 5248] 0009.tim
│ │ ├── [ 5248] 0011.tim
│ │ ├── [ 5248] 0013.tim
│ │ ├── [ 5248] 0014.tim
│ │ ├── [ 5248] 0017.tim
│ │ ├── [ 5248] 0019.tim
│ │ ├── [ 5248] 0020.tim
│ │ ├── [ 5248] 0021.tim
│ │ ├── [ 5248] 0022.tim
│ │ ├── [ 5248] 0026.tim
│ │ ├── [ 5248] 0027.tim
│ │ ├── [ 5248] 0028.tim
│ │ ├── [ 5248] 0033.tim
│ │ ├── [ 5248] 0034.tim
│ │ ├── [ 5248] 0035.tim
│ │ ├── [ 5248] 0036.tim
│ │ ├── [ 5248] 0037.tim
│ │ ├── [ 5248] 0038.tim
│ │ ├── [ 5248] 0041.tim
│ │ ├── [ 5248] 0045.tim
│ │ ├── [ 5248] 0057.tim
│ │ └── [ 5248] 0059.tim
│ ├── [ 4096] 0122/
│ │ └── [ 4096] 0002/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 5248] 0009.tim
│ ├── [ 4096] 0123/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 5248] 0000.tim
│ │ ├── [ 5248] 0001.tim
│ │ ├── [ 5248] 0003.tim
│ │ ├── [ 5248] 0010.tim
│ │ ├── [ 5248] 0011.tim
│ │ ├── [ 5248] 0016.tim
│ │ ├── [ 5248] 0019.tim
│ │ ├── [ 5248] 0021.tim
│ │ ├── [ 5248] 0033.tim
│ │ ├── [ 5248] 0036.tim
│ │ ├── [ 5248] 0038.tim
│ │ ├── [ 5248] 0042.tim
│ │ ├── [ 5248] 0043.tim
│ │ ├── [ 5248] 0044.tim
│ │ ├── [ 5248] 0048.tim
│ │ ├── [ 5248] 0049.tim
│ │ ├── [ 5248] 0052.tim
│ │ ├── [ 5248] 0056.tim
│ │ └── [ 5248] 0059.tim
│ ├── [ 4096] 0124/
│ │ ├── [ 4096] 0000/
│ │ │ └── [ 4096] ulz_data/
│ │ │ ├── [ 5248] 0001.tim
│ │ │ └── [ 5248] 0002.tim
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33316] 0001.bin
│ ├── [ 4096] 0125/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ ├── [ 5248] 0000.tim
│ │ └── [ 5248] 0013.tim
│ ├── [ 4096] 0131/
│ │ └── [ 4096] 0003/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 32864] 0000.tim
│ ├── [ 4096] 0142/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 29352] 0007.bin
│ ├── [ 4096] 0159/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 29352] 0007.bin
│ ├── [ 4096] 0160/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 39176] 0007.bin
│ ├── [ 4096] 0164/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 29096] 0007.bin
│ ├── [ 4096] 0166/
│ │ └── [ 4096] 0003/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 32864] 0000.tim
│ ├── [ 4096] 0168/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 39176] 0007.bin
│ ├── [ 4096] 0174/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 29352] 0007.bin
│ ├── [ 4096] 0175/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 29352] 0007.bin
│ ├── [ 4096] 0178/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 39176] 0007.bin
│ ├── [ 4096] 0188/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 33968] 0000.bin
│ ├── [ 4096] 0215/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 19612] 0000.bin
│ ├── [ 4096] 0226/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 19612] 0000.bin
│ ├── [ 4096] 0227/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 19612] 0000.bin
│ ├── [ 4096] 0252/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 32864] 0000.tim
│ ├── [ 4096] 0269/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 32864] 0000.tim
│ ├── [ 4096] 0270/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 8460] 0002.bin
│ ├── [ 4096] 0304/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 32864] 0001.tim
│ ├── [ 4096] 0305/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 32864] 0000.tim
│ ├── [ 4096] 0331/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 8460] 0002.bin
│ ├── [ 4096] 0349/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 4232] 0002.bin
│ ├── [ 4096] 0355/
│ │ └── [ 4096] 0001/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 32864] 0001.tim
│ ├── [ 4096] 0424/
│ │ └── [ 4096] 0000/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 11208] 0001.bin
│ ├── [ 4096] 0429/
│ │ └── [ 4096] 0000/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 40252] 0000.bin
│ ├── [ 4096] 0443/
│ │ └── [ 4096] 0000/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 40284] 0000.bin
│ ├── [ 4096] 0458/
│ │ └── [ 4096] 0000/
│ │ └── [ 4096] ulz_data/
│ │ └── [ 15772] 0000.bin
│ └── [ 4096] 0460/
│ └── [ 4096] 0000/
│ └── [ 4096] ulz_data/
│ └── [ 10920] 0001.bin
├── [ 16947] report_simple.txt
└── [ 0] report_size.txt
234 directories, 244 files
Code: Alles auswählen
.
├── BPB/
│ ├── 0005/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0006/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0007/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0008/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0011.bin
│ │ ├── 0012.bin
│ │ └── 0013.bin
│ ├── 0009/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0010/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0013.bin
│ │ └── 0014.bin
│ ├── 0011/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0012.bin
│ │ └── 0013.bin
│ ├── 0012/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0013/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0014/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0015/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0016/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0006.bin
│ │ └── 0013.bin
│ ├── 0017/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0012.bin
│ │ └── 0013.bin
│ ├── 0018/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0012.bin
│ │ └── 0013.bin
│ ├── 0019/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0020/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0013.bin
│ │ └── 0014.bin
│ ├── 0021/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0022/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0023/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0024/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0025/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ ├── 0013.bin
│ │ └── 0014.bin
│ ├── 0026/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0027/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0028/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0029/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0030/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ ├── 0010.bin
│ │ └── 0013.bin
│ ├── 0031/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0032/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0006.bin
│ │ └── 0013.bin
│ ├── 0033/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0034/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0035/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0036/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0037/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0038/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0012.bin
│ │ └── 0013.bin
│ ├── 0039/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0040/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0041/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0042/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0043/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0044/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0045/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0046/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0048/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0049/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0050/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0051/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0052/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0012.bin
│ │ └── 0013.bin
│ ├── 0053/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0054/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0055/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0056/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0057/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0058/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0059/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ └── 0013.bin
│ ├── 0060/
│ │ └── ulz_data/
│ │ ├── 0002.bin
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0061/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0006.bin
│ │ └── 0013.bin
│ ├── 0062/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0063/
│ │ └── ulz_data/
│ │ ├── 0004.tim
│ │ ├── 0007.bin
│ │ └── 0013.bin
│ ├── 0064/
│ │ └── ulz_data/
│ │ ├── 0003.bin
│ │ └── 0012.bin
│ ├── 0065/
│ │ └── ulz_data/
│ │ ├── 0003.bin
│ │ ├── 0007.bin
│ │ └── 0012.bin
│ ├── 0071/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0074/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0075/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0089/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0094/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0102/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0112/
│ │ └── ulz_data/
│ │ ├── 0004.bin
│ │ └── 0007.bin
│ ├── 0113/
│ │ └── ulz_data/
│ │ ├── 0000.bin
│ │ └── 0003.bin
│ ├── 0114/
│ │ └── 0004/
│ │ └── ulz_data/
│ │ └── 0001.tim
│ ├── 0116/
│ │ └── 0001/
│ │ └── 0006/
│ │ └── ulz_data/
│ │ └── 0001.bin
│ ├── 0118/
│ │ └── 0001/
│ │ └── 0007/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ ├── 0119/
│ │ └── 0001/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ └── 0001.bin
│ ├── 0121/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ ├── 0000.tim
│ │ ├── 0001.tim
│ │ ├── 0002.tim
│ │ ├── 0003.tim
│ │ ├── 0004.tim
│ │ ├── 0008.tim
│ │ ├── 0009.tim
│ │ ├── 0011.tim
│ │ ├── 0013.tim
│ │ ├── 0014.tim
│ │ ├── 0017.tim
│ │ ├── 0019.tim
│ │ ├── 0020.tim
│ │ ├── 0021.tim
│ │ ├── 0022.tim
│ │ ├── 0026.tim
│ │ ├── 0027.tim
│ │ ├── 0028.tim
│ │ ├── 0033.tim
│ │ ├── 0034.tim
│ │ ├── 0035.tim
│ │ ├── 0036.tim
│ │ ├── 0037.tim
│ │ ├── 0038.tim
│ │ ├── 0041.tim
│ │ ├── 0045.tim
│ │ ├── 0057.tim
│ │ └── 0059.tim
│ ├── 0122/
│ │ └── 0002/
│ │ └── ulz_data/
│ │ └── 0009.tim
│ ├── 0123/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ ├── 0000.tim
│ │ ├── 0001.tim
│ │ ├── 0003.tim
│ │ ├── 0010.tim
│ │ ├── 0011.tim
│ │ ├── 0016.tim
│ │ ├── 0019.tim
│ │ ├── 0021.tim
│ │ ├── 0033.tim
│ │ ├── 0036.tim
│ │ ├── 0038.tim
│ │ ├── 0042.tim
│ │ ├── 0043.tim
│ │ ├── 0044.tim
│ │ ├── 0048.tim
│ │ ├── 0049.tim
│ │ ├── 0052.tim
│ │ ├── 0056.tim
│ │ └── 0059.tim
│ ├── 0124/
│ │ ├── 0000/
│ │ │ └── ulz_data/
│ │ │ ├── 0001.tim
│ │ │ └── 0002.tim
│ │ └── ulz_data/
│ │ └── 0001.bin
│ ├── 0125/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ ├── 0000.tim
│ │ └── 0013.tim
│ ├── 0131/
│ │ └── 0003/
│ │ └── ulz_data/
│ │ └── 0000.tim
│ ├── 0142/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0159/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0160/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0164/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0166/
│ │ └── 0003/
│ │ └── ulz_data/
│ │ └── 0000.tim
│ ├── 0168/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0174/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0175/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0178/
│ │ └── ulz_data/
│ │ └── 0007.bin
│ ├── 0188/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ ├── 0215/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ ├── 0226/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ ├── 0227/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ ├── 0252/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ └── 0000.tim
│ ├── 0269/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ └── 0000.tim
│ ├── 0270/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0304/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ └── 0001.tim
│ ├── 0305/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ └── 0000.tim
│ ├── 0331/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0349/
│ │ └── ulz_data/
│ │ └── 0002.bin
│ ├── 0355/
│ │ └── 0001/
│ │ └── ulz_data/
│ │ └── 0001.tim
│ ├── 0424/
│ │ └── 0000/
│ │ └── ulz_data/
│ │ └── 0001.bin
│ ├── 0429/
│ │ └── 0000/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ ├── 0443/
│ │ └── 0000/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ ├── 0458/
│ │ └── 0000/
│ │ └── ulz_data/
│ │ └── 0000.bin
│ └── 0460/
│ └── 0000/
│ └── ulz_data/
│ └── 0001.bin
└── report_simple.txt
234 directories, 243 files
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Okay, then I was already using the correct version. I guess I unknowingly fixed it while translating the code to C++ …
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Some notes on the Ace Combat 3 Demo version.
Demos are wonderful to reverse because
Hunting down the demo disks:
The Ace Combat 3 demo was distributed on CD-ROM with various game magazines. I owned one when I was a child, but it’s lost now. It was one of these:
McDonald’s distributed the same demo (as seen in this video), available here: SCED-03910.
This article mentions an Ace Combat 3 Demo on Disk 2 of the 4.1 issue of the PlayStation Underground magazine. I eventually found the image here: SCUS-94566 (Track 1).
This list includes french demos:
European demos (UK, Australia, Spain, etc.):
Now for Ace Combat 2:
Layout:
The demos are located in the AC3 subfolder. Same BPB/SPB format as the final version. It’s very tiny (2.5 MiB levels + textures + SFX!), and the look & feel is very close to the final version, so I don’t think we’ll find any surprises.
Identical are:
Related: There was a great interview with the directors of the Ace Combat games when Ace Combat 6 was released. However, the original article has been trimmed down since the original release (I hate the fucking web so much). A copy can be found here.
————
I didn’t know Namco released updated game versions WITH THE SAME FUCKING ID. E.g. Ace Combat 2, Japanese version 1.0 (released in April) vs. 1.1 (released in July), has some amount of changes to game data and EXE, but both versions go by SLPS-00830. Shit. Anyway, let’s see the translation fixes:
————
Okay, there are so many versions of the three games that it could be a thread on its own. There even is are-textured PlayStation 2 version of Ace Combat 2 in the NamCollection …
Demos are wonderful to reverse because
- they’re heavily reduced (no movies, less UI, …)
- you can find some hints on the game’s development because they’re often not as clean as the final versions
Hunting down the demo disks:
The Ace Combat 3 demo was distributed on CD-ROM with various game magazines. I owned one when I was a child, but it’s lost now. It was one of these:
- Euro Demo Germany 02/00 (SCED-01845)
- Euro Demo Germany 08/01 (SCED-03471)
- Euro Demo Germany 05/02 (SCED-03887)
McDonald’s distributed the same demo (as seen in this video), available here: SCED-03910.
This article mentions an Ace Combat 3 Demo on Disk 2 of the 4.1 issue of the PlayStation Underground magazine. I eventually found the image here: SCUS-94566 (Track 1).
This list includes french demos:
- Euro Demo 38 France (SCED-01858)
- Euro Demo 50 France (SCED-02654)
- Euro Demo 54 France (SCED-02658)
- Euro Demo 55 France (SCED-03461)
European demos (UK, Australia, Spain, etc.):
- Euro Demo 55 (SCED-01829), download
file date is 1999-11-20, 15:50:20 UTC - Official PlayStation Magazine Demo 74 (SCED-03451),
broken download - Official UK PlayStation Magazine 86 (SCED-03789)
- Euro Demo (Future) 107 (SCED-04133)
Now for Ace Combat 2:
- Euro Demo 12 (Germany) (SCED-00677 – vastly different from Demo 12 (Europe), Demo 12-01, Demo 12-99, or any other, for that matter!), download
- Euro Demo 26 (SCED-00822), download
Layout:
The demos are located in the AC3 subfolder. Same BPB/SPB format as the final version. It’s very tiny (2.5 MiB levels + textures + SFX!), and the look & feel is very close to the final version, so I don’t think we’ll find any surprises.
Identical are:
- the three European demos from German magazines, the European McDonald’s demo, Euro Demo 55
Let’s call them the European Ace Combat 3 Demo from 1999-11-24, 16:03:47 UTC. -
the PlayStation Underground demo
Let’s call it the US Ace Combat 3 Demo.
Related: There was a great interview with the directors of the Ace Combat games when Ace Combat 6 was released. However, the original article has been trimmed down since the original release (I hate the fucking web so much). A copy can be found here.
- on Air Combat: “We would have loved to include the replay and landing/take-off features. Actually, we finally got the replay feature working the week after we submitted the game for approval. The landing and take-off feature was up and running just three weeks after. (Even though, we got these features to work, we still needed time to perfect them.) We actually tried to implement both of these features in the game afterwards, but we didn’t make it before the launch. In the end, a copy of Air Combat with the replay and landing/take-off features was something only the development team had.”
- on Ace Combat 3: “I remember we had the idea that the body of the aircraft would be covered with a non-metallic outer skin layer material known as a "nano-skin". In order to get this feeling of a skin across to the player, we attempted to create aircraft models without joints or seams on the flaps and variable geometry wings. We had a lot of other ideas on how we could differentiate our aircraft from those of the present, but in the end it was just too much for the hardware.”
————
I didn’t know Namco released updated game versions WITH THE SAME FUCKING ID. E.g. Ace Combat 2, Japanese version 1.0 (released in April) vs. 1.1 (released in July), has some amount of changes to game data and EXE, but both versions go by SLPS-00830. Shit. Anyway, let’s see the translation fixes:
————
Okay, there are so many versions of the three games that it could be a thread on its own. There even is a
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Habe am Wochenende Flugzeugtexturen entschlüsselt. Von Gebäuden bin ich aber leider noch ein Stück entfernt …
… den ganzen Satz und das Post-Mortem lade ich später hoch, wenn alle Fehler behoben sind.
… den ganzen Satz und das Post-Mortem lade ich später hoch, wenn alle Fehler behoben sind.
Zuletzt geändert von Krishty am 07.02.2017, 00:08, insgesamt 1-mal geändert.
Re: [Projekt] Extracting Ace Combat
bis auf das cockpit schauts gut aus, könnte da noch ein fehler vorliegen?
Discord: https://discord.gg/AWhsvN3 für Devader: http://devader.space
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Nee, die sehen alle so aus – ist ja Sci-Fi; die Cockpits sind komplett geschlossen und alles wird via Kamera gesteuert :)
Nachtrag: Nee warte – habe doch auch konventionell aussehende:
Nachtrag: Nee warte – habe doch auch konventionell aussehende:
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Let’s extract a plane.
Planes can be found in folders 0066–0102 (Japanese version) and 0047–0068 (EU/US version). These all have the following layout:
This looks a lot like the vertex data we found earlier. In fact, it’s pretty easy to recognize vertices in the same XY XY XY Z Z Z format. Triangle indices are pretty easy to spot as well (the consecutive integers from 00 to 0B):
Visualize what we just found:
Makes sense! I’ll take a shortcut here: In some other files, the last block is not empty, but contains quads instead of triangles (4th index not always zero). However, many files come with no triangles/quads at all, just a set of vertices. Let’s have a look at all files from the folder:
Using this identification chart, we can clearly identify it as a F-18 Hornet :)
Now, what about the other data (X, Y, Z, Q)?
X does not make sense as triangle indices, but it does make sense as indices into block #3. (See how it counts to 0B == 12 decimal, and there’s 13 entries in block #3?)
So what’s in block #3? It’s not too difficult to figure out once you know what you’re looking for. It’s the vertex normals, scaled to 4096 and stored as 16-bit fixed point numbers (because the PSX has no floating-point support). These normals are indeed very pretty (I decided to apply a random color to individual meshes in order to tell them apart):
We have seen Z before: It’s the GPU instruction for drawing a triangle.
There is not much room left for Y & Q: It must be texture coordinates, because where else would they go? But there’s eight numbers for three vertices, so we need to pick the right ones. We can easily get this done by using the individual texture coordinates as red and green colors: (I chose a different plane here because I was too lazy to take another screenshot for the article, sorry!) Nice smooth shading and the seams are exactly where a designer would place them!
We’ll apply the texture next time. It’s more difficult than one would think, and it requires the last pair of bytes to get it right …
Planes can be found in folders 0066–0102 (Japanese version) and 0047–0068 (EU/US version). These all have the following layout:
- folder with 12 small binary files (from 0 B to 16 KiB)
- folder with a small binary file (~100 B)
- folder with two textures:
- a binary file of several KiB
This looks a lot like the vertex data we found earlier. In fact, it’s pretty easy to recognize vertices in the same XY XY XY Z Z Z format. Triangle indices are pretty easy to spot as well (the consecutive integers from 00 to 0B):
Visualize what we just found:
Makes sense! I’ll take a shortcut here: In some other files, the last block is not empty, but contains quads instead of triangles (4th index not always zero). However, many files come with no triangles/quads at all, just a set of vertices. Let’s have a look at all files from the folder:
Using this identification chart, we can clearly identify it as a F-18 Hornet :)
Now, what about the other data (X, Y, Z, Q)?
X does not make sense as triangle indices, but it does make sense as indices into block #3. (See how it counts to 0B == 12 decimal, and there’s 13 entries in block #3?)
So what’s in block #3? It’s not too difficult to figure out once you know what you’re looking for. It’s the vertex normals, scaled to 4096 and stored as 16-bit fixed point numbers (because the PSX has no floating-point support). These normals are indeed very pretty (I decided to apply a random color to individual meshes in order to tell them apart):
We have seen Z before: It’s the GPU instruction for drawing a triangle.
There is not much room left for Y & Q: It must be texture coordinates, because where else would they go? But there’s eight numbers for three vertices, so we need to pick the right ones. We can easily get this done by using the individual texture coordinates as red and green colors: (I chose a different plane here because I was too lazy to take another screenshot for the article, sorry!) Nice smooth shading and the seams are exactly where a designer would place them!
We’ll apply the texture next time. It’s more difficult than one would think, and it requires the last pair of bytes to get it right …
Zuletzt geändert von Krishty am 08.05.2017, 22:45, insgesamt 1-mal geändert.
Re: [Projekt] Extracting Ace Combat
Sieht wieder mal gut aus Krishty! Bin schön gespannt wie dein Endprodukt dann ausschaut, bin weiterhin gebannt am lesen :)
Discord: https://discord.gg/AWhsvN3 für Devader: http://devader.space
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Just announcing three new "hidden" levels in the Japanese version of Ace Combat 3.
One hidden level has been known for years: Game Show, the level that shipped on demo discs, with minor modifications. It can only be accessed through a GameShark code (i.e. overwriting a memory location) and it's pretty boring. Its internal name is "----", and the developers probably used it as a test bed for AI before deploying the game.
Another hidden level has been known for some time, but nobody ever managed to enter it: Mission Code. There are some snapshots of the briefing on Acepedia, but the game will crash right after that.
I'm pretty sure I got its map decoded, and there's two copies of that map in the Japanese game files. It's Expo City in an early development stage. The differences from the final city are subtle, but it's amazing to see all the improvements that have been done. The map data looks compatible with the final data format, but the only airplane is the carrier for the Sepia spacecraft. This may be the reason why the briefing loads, but the mission doesn't.
Then there's two completely new maps. This time, the binary format of the models is not compatible with the final maps at all. I suspect the game will crash right away, and this might be the reason no one ever investigated the data. It's Expo City in some state after Mission Code and Megafloat in a *very* early stage of development. I have yet to find out how texturing works; even the vertex colors are screwed up.
I'll try to post snapshots of the early Expo City soon. Snapshots of the two other maps follow later. I have so many things to write here, but my PC does not have an internet connection, so it'll take some time to publish it all.
One hidden level has been known for years: Game Show, the level that shipped on demo discs, with minor modifications. It can only be accessed through a GameShark code (i.e. overwriting a memory location) and it's pretty boring. Its internal name is "----", and the developers probably used it as a test bed for AI before deploying the game.
Another hidden level has been known for some time, but nobody ever managed to enter it: Mission Code. There are some snapshots of the briefing on Acepedia, but the game will crash right after that.
I'm pretty sure I got its map decoded, and there's two copies of that map in the Japanese game files. It's Expo City in an early development stage. The differences from the final city are subtle, but it's amazing to see all the improvements that have been done. The map data looks compatible with the final data format, but the only airplane is the carrier for the Sepia spacecraft. This may be the reason why the briefing loads, but the mission doesn't.
Then there's two completely new maps. This time, the binary format of the models is not compatible with the final maps at all. I suspect the game will crash right away, and this might be the reason no one ever investigated the data. It's Expo City in some state after Mission Code and Megafloat in a *very* early stage of development. I have yet to find out how texturing works; even the vertex colors are screwed up.
I'll try to post snapshots of the early Expo City soon. Snapshots of the two other maps follow later. I have so many things to write here, but my PC does not have an internet connection, so it'll take some time to publish it all.
Zuletzt geändert von Krishty am 03.05.2017, 22:23, insgesamt 1-mal geändert.
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
I proudly present the first snapshot of the Mission Code version of Ace Combat 3's Expo City map!
For comparison, this is the same region in the demo/final version of the game:
- Expo City's iconic underground airport (top-left corner) has been introduced rather late. The early version didn't have one.
- The early version featured more buildings. The remaining buildings have been scaled down to as little as half their original sidelength (bottom-right corner).
- Texture detail has improved significantly (bottom-right corner).
- The final color palettes are much less colorful. Some look just like stills from the Matrix movie (e.g. the mission Awakening:)
- Prebaked lighting has improved significantly.
- The early version is brighter (about twice as bright). I tried to correct for it in the snapshots, so it's not obvious. It's not an art thing -- I guess at some point they compressed the color range of the prebaked vertex lighting and instead improved the texture color range. The reasons could be obscure color processing problems with the PSX GPU, or optimizations, or anything else.
Re: [Projekt] Extracting Ace Combat
Alsways impressive how much NAMCO got out from a system like PS One and what tricks they used to accomplish that. Thanks for sharing your reengineering work with us guys!
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Freut mich, wenn es unterhält :)marcgfx hat geschrieben:Sieht wieder mal gut aus Krishty! Bin schön gespannt wie dein Endprodukt dann ausschaut, bin weiterhin gebannt am lesen :)
One of the next write-ups will dive deep into the GPU memory management of the PSX, and this will be really impressive for anybody who’s into low-level stuff. It just takes me a lot of time to illustrate what’s going on. Stay tuned :)scheichs hat geschrieben:Alsways impressive how much NAMCO got out from a system like PS One and what tricks they used to accomplish that. Thanks for sharing your reengineering work with us guys!
In other news, I’m close to having decoded all maps, entities, and planes (including the new hidden ones). That’s enough stuff for three more threads like this …
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Extracted the hidden/secret levels/maps/terrains/missions from Ace Combat 3.
I’m now pretty confident we can group the three Expo City versions of the Japanese game version into alpha/beta/final. The hidden version of Megafloat is a beta version (not alpha) for pretty complicated technical reasons I’ll explain later. First, some snapshots:
This is the alpha version of Expo City. I explained its unique features in an earlier post. This is probably what you’d see if the hidden Mission Code level worked.
This is the beta version of Expo City. It is much closer to the final version (iconic underground airport, smaller buildings, new textures, cleaned up level), but there are subtle differences:
Here’s the final version for reference:
Moving on to Megafloat. Here’s the beta: It’s not as close to the final version as Expo City’s beta is, but … it uses the same exotic mip mapping approach, so it must have been created at the same time.
Again, the final version for reference:
Two conclusions:
Speaking of hidden beta stuff … the Japanese version was to feature a model viewer, but it was cut before release. It is accessable via memory manipulation (cheat/GameShark code; video not mine):
[youtube]G7qFyokLeBU[/youtube]
I extracted the model viewer’s data as well, and to my surprise, the models were slightly different from the ones you see in the video. We could have known earlier: the first two planes in the video are not lit dynamically (turning them upside-down does not change lighting), while the 3rd plane (at 1:18) is indeed lit dynamically. The reason I found: some models are so buggy/have so bad resolution that Namco chose to use the in-game models instead!
I’m now pretty confident we can group the three Expo City versions of the Japanese game version into alpha/beta/final. The hidden version of Megafloat is a beta version (not alpha) for pretty complicated technical reasons I’ll explain later. First, some snapshots:
This is the alpha version of Expo City. I explained its unique features in an earlier post. This is probably what you’d see if the hidden Mission Code level worked.
This is the beta version of Expo City. It is much closer to the final version (iconic underground airport, smaller buildings, new textures, cleaned up level), but there are subtle differences:
- some textures have not yet been replaced
- there are some holes in the terrain in other places
- it still uses the old lighting
Here’s the final version for reference:
Moving on to Megafloat. Here’s the beta: It’s not as close to the final version as Expo City’s beta is, but … it uses the same exotic mip mapping approach, so it must have been created at the same time.
Again, the final version for reference:
Two conclusions:
- Megafloat was completed much later than Expo City.
- At a late point during development (when Expo City was almost in its final state), Namco tried to replace the game’s entire texture management with a more efficient approach, which likely allowed for mip mapping or farther range of sight – but they failed and rolled back to the old system.
Speaking of hidden beta stuff … the Japanese version was to feature a model viewer, but it was cut before release. It is accessable via memory manipulation (cheat/GameShark code; video not mine):
[youtube]G7qFyokLeBU[/youtube]
I extracted the model viewer’s data as well, and to my surprise, the models were slightly different from the ones you see in the video. We could have known earlier: the first two planes in the video are not lit dynamically (turning them upside-down does not change lighting), while the 3rd plane (at 1:18) is indeed lit dynamically. The reason I found: some models are so buggy/have so bad resolution that Namco chose to use the in-game models instead!
Zuletzt geändert von Krishty am 04.05.2017, 00:18, insgesamt 2-mal geändert.
Re: [Projekt] Extracting Ace Combat
Again very cool stuff! Do you have some polygon numbers? It appears to me that the beta versions have higher polygoncount than the final ones.
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
polycount Expo City:
Megafloat:
Another interesting metric is texture load, in bytes. However, I don’t want to comment on this until I wrote the article on the GPU memory system …
- alpha: 261,673 (4,505 unique)
- beta: 261,172 (5,050 unique)
- final: 251,066 (4,856 unique)
Megafloat:
- beta: 153,031 (7,468 unique)
- final: 147,267 (5,495 unique)
Another interesting metric is texture load, in bytes. However, I don’t want to comment on this until I wrote the article on the GPU memory system …
- kimmi
- Moderator
- Beiträge: 1405
- Registriert: 26.02.2009, 09:42
- Echter Name: Kim Kulling
- Wohnort: Luebeck
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
Amazing results, thanks a lot for sharing those results!
Kim
Kim
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
I’d love to share more, but I fear sitting down and writing tutorials would break my flow :(
Extracting maps from Ace Combat 2 took me three evenings:
Extracting maps from Ace Combat 2 took me three evenings:
- analyzing the game archive format – no compression involved this time, and the internal data structures are very similar to Ace Combat 3
- extracting tile polygons – still way to go here
- applying textures – such a good thing I made my code from Ace Combat 3 reusable, it fits perfectly
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [Projekt] Extracting Ace Combat
In case anyone wants to extract Ace Combat 2, here’s my decompressor (I don’t think one has been written before):
Ace Combat 2 was re-released on PlayStation 2 in 2005. I was hoping to find bugfixes and other improvements in the game files, but the only difference in the PS2 version is … this: It’s even more confusing when you see this tweet from the developers, where the trademark was already in place. They probably just forgot it in the original game files.
Speaking of version differences …
Apart from the compression, both games’ formats are almost identical, so here’s a similar one for Ace Combat 3:- for Windows
- should work with all regions (EU, JAP, US)
- and versions (demo, 1.0, 1.1)
- place unpack_AC2.exe in one folder with ACE2.DAT (for the demo, rename D.T to ACE2.DAT) and run
- place unpack_AC3.exe in one folder with ACE.BPB & ACE.BPH and run
Ace Combat 2 was re-released on PlayStation 2 in 2005. I was hoping to find bugfixes and other improvements in the game files, but the only difference in the PS2 version is … this: It’s even more confusing when you see this tweet from the developers, where the trademark was already in place. They probably just forgot it in the original game files.
Speaking of version differences …
- except for a japanese character map, there are no regional differences (Japan/EU/US) in the game resources
- the executables are vastly different – no wonder regarding the different screen resolutions & refresh rates of PAL vs NTSC
- versions 1.0 and 1.1 differ in
- the translation fixes I mentioned before
- a string table in 1.0 being padded with “04EAS.PLY P:\UNIX\PX201\BRIEFING\WO” instead of zeroes in 1.1
- the executables, again (had no look at the disassembly yet)
Zuletzt geändert von Krishty am 05.08.2017, 00:37, insgesamt 3-mal geändert.