diff --git a/zone.js b/zone.js index 6e644e1..b17cfcf 100644 --- a/zone.js +++ b/zone.js @@ -29,7 +29,21 @@ var ecoSchema = [ ]} ]; + + var floraSchema = [ + { name: "name", type: "nullstring" }, + { name: "texture", type: "nullstring" }, + { name: "model", type: "nullstring" }, + { name: "unknownBoolean1", type: "boolean" }, + { name: "unknownFloat1", type: "float" }, + { name: "unknownFloat2", type: "float" }, + { name: "unknownFloat3", type: "float" }, + { name: "unknownFloat4", type: "float" }, + { name: "unknownFloat5", type: "float" } +]; + +var floraSchemaPS2 = [ { name: "name", type: "nullstring" }, { name: "texture", type: "nullstring" }, { name: "model", type: "nullstring" }, @@ -78,16 +92,34 @@ var lightSchema = [ { name: "id", type: "uint32" } ]; + +var decalSchema = [ + { name: "unknownFloat1", type: "float" }, + { name: "position", type: "floatvector4" }, + { name: "unknownFloat2", type: "float" }, + { name: "unknownFloat3", type: "float" }, + { name: "unknownFloat4", type: "float" }, + { name: "unknownFloat5", type: "float" }, + { name: "decimalDigits6And4", type: "uint32" }, //I mean, uh, the last 4 digits in decimal seem to be similar or same for several values, thus probably have some significance + { name: "name", type: "nullstring" }, + { name: "unknownFloat6", type: "float" }, + { name: "unknownFloat7", type: "float" }, + { name: "unknownFloat8", type: "float" }, + { name: "unknownInt", type: "uint32" } +]; + var schema = [ { name: "signature", type: "uint32" }, { name: "version", type: "uint32" }, + { name: "unknown", type: "uint32" }, { name: "offsets", type: "schema", fields: [ { name: "ecos", type: "uint32" }, { name: "floras", type: "uint32" }, { name: "invisibleWalls", type: "uint32" }, { name: "objects", type: "uint32" }, { name: "lights", type: "uint32" }, - { name: "unknowns", type: "uint32" } + { name: "unknowns", type: "uint32" }, + { name: "decals", type: "uint32" } ]}, { name: "quadsPerTile", type: "uint32" }, { name: "tileSize", type: "float" }, @@ -103,6 +135,36 @@ var schema = [ { name: "invisibleWalls", type: "array", fields: invisibleWallSchema }, { name: "objects", type: "array", fields: objectSchema }, { name: "lights", type: "array", fields: lightSchema }, + { name: "unknowns", type: "array", fields: [] }, + { name: "decals", type: "array", fields: decalSchema } + +]; + +var schemaPS2 = [ + { name: "signature", type: "uint32" }, + { name: "version", type: "uint32" }, + { name: "offsets", type: "schema", fields: [ + { name: "ecos", type: "uint32" }, + { name: "floras", type: "uint32" }, + { name: "invisibleWalls", type: "uint32" }, + { name: "objects", type: "uint32" }, + { name: "lights", type: "uint32" }, + { name: "unknowns", type: "uint32" } + ]}, + { name: "quadsPerTile", type: "uint32" }, + { name: "tileSize", type: "float" }, + { name: "tileHeight", type: "float" }, + { name: "vertsPerTile", type: "uint32" }, + { name: "tilesPerChunk", type: "uint32" }, + { name: "startX", type: "int32" }, + { name: "startY", type: "int32" }, + { name: "chunksX", type: "uint32" }, + { name: "chunksY", type: "uint32" }, + { name: "ecos", type: "array", fields: ecoSchema }, + { name: "floras", type: "array", fields: floraSchemaPS2 }, + { name: "invisibleWalls", type: "array", fields: invisibleWallSchema }, + { name: "objects", type: "array", fields: objectSchema }, + { name: "lights", type: "array", fields: lightSchema }, { name: "unknowns", type: "array", fields: [] } ]; @@ -115,8 +177,14 @@ function readZone(data, offset) { if (signature != 0x454E4F5A) { throw "Not a valid zone file"; } - - var zone = DataSchema.parse(schema, data, offset); + var version = data.readUInt32LE(offset+4); + if (version == 0x00000001) { + var zone = DataSchema.parse(schemaPS2, data, offset); + } + else { + var zone = DataSchema.parse(schema, data, offset); + } + return zone.result; } @@ -158,7 +226,7 @@ function writeZone(zone) { zone.offsets.unknowns = offset; // write data - var result = DataSchema.pack(schema, zone); + var result = DataSchema.pack(schemaH1Z1, zone); return result.data; }