in theory this works, in practice, i forgot to have a test file on hand
This commit is contained in:
parent
5fff911ba6
commit
d68e2f913a
47
icon.js
47
icon.js
|
@ -1,6 +1,7 @@
|
||||||
//todo: Make this a module/mjs file. C6 compatibility can stay, if needed.
|
//todo: Make this a module/mjs file. C6 compatibility can stay, if needed.
|
||||||
ICONJS_DEBUG = false;
|
ICONJS_DEBUG = false;
|
||||||
ICONJS_STRICT = true;
|
ICONJS_STRICT = true;
|
||||||
|
ICONJS_VERSION = "0.3.3";
|
||||||
|
|
||||||
function setDebug(value) {
|
function setDebug(value) {
|
||||||
ICONJS_DEBUG = !!value;
|
ICONJS_DEBUG = !!value;
|
||||||
|
@ -269,6 +270,52 @@ function readEmsPsuFile(input){
|
||||||
return fsOut;
|
return fsOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function readPsvFile(input){
|
||||||
|
const view = new DataView(input);
|
||||||
|
const u32le = function(i){return view.getUint32(i, 1)};
|
||||||
|
//!pattern psv_file.hexpat
|
||||||
|
const magic = u32le(0);
|
||||||
|
if (magic !== 0x50535600) {
|
||||||
|
throw `Not a PS3 export (PSV) file (was ${magic}, expected ${0x50535600})`;
|
||||||
|
}
|
||||||
|
//:skip 4
|
||||||
|
//:skip 20 // key seed, console ignores this
|
||||||
|
//:skip 20 // sha1 hmac digest, useful for... something
|
||||||
|
//:skip 8
|
||||||
|
const type1 = u32le(52);
|
||||||
|
const type2 = u32le(56);
|
||||||
|
if(type1 !== 0x2c && type2 !== 2) {
|
||||||
|
throw `Not parsing, this is not a PS2 save export (was ${type1}:${type2}, expected 44:2)`;
|
||||||
|
}
|
||||||
|
const displayedSize = u32le(60);
|
||||||
|
const ps2dOffset = u32le(64);
|
||||||
|
const ps2dSize = u32le(68); // don't know why this is included if its always 964
|
||||||
|
const nModelOffset = u32le(72);
|
||||||
|
const nModelSize = u32le(76);
|
||||||
|
const cModelOffset = u32le(80);
|
||||||
|
const cModelSize = u32le(84);
|
||||||
|
const dModelOffset = u32le(88);
|
||||||
|
const dModelSize = u32le(92);
|
||||||
|
const numberOfFiles = u32le(96); // in-case this library changes stance on other files
|
||||||
|
const rootDirectoryData = input.slice(100, 158);
|
||||||
|
let offset = 158;
|
||||||
|
let fileData = new Array();
|
||||||
|
for (let index = 0; index < numberOfFiles; index++) {
|
||||||
|
fileData.push(input.slice(offset,offset+0x3c));
|
||||||
|
offset += 0x3c;
|
||||||
|
};
|
||||||
|
//then file data after this but we already have pointers to the files we care about
|
||||||
|
const icons = {
|
||||||
|
n: input.slice(nModelOffset, nModelOffset+nModelSize),
|
||||||
|
c: input.slice(cModelOffset, cModelOffset+cModelSize),
|
||||||
|
d: input.slice(dModelOffset, dModelOffset+dModelSize),
|
||||||
|
}
|
||||||
|
if (ICONJS_DEBUG) {
|
||||||
|
console.log({magic, type1, type2, displayedSize, ps2dOffset, ps2dSize, nModelOffset, nModelSize, cModelOffset, cModelSize, dModelOffset, dModelSize, numberOfFiles, rootDirectoryData, fileData})
|
||||||
|
}
|
||||||
|
return {icons, "icon.sys": input.slice(ps2dOffset, ps2dOffset+ps2dSize)};
|
||||||
|
}
|
||||||
|
|
||||||
if(typeof module !== "undefined") {
|
if(typeof module !== "undefined") {
|
||||||
// for C6JS
|
// for C6JS
|
||||||
module.exports = {readIconFile, readPS2D, readEmsPsuFile, setDebug, setStrictness};
|
module.exports = {readIconFile, readPS2D, readEmsPsuFile, setDebug, setStrictness};
|
||||||
|
|
4
index.js
4
index.js
|
@ -21,6 +21,10 @@ if(processObj.argv[2] === "psu") {
|
||||||
output[file] = iconjs.readIconFile(parsed[parsed.rootDirectory][PS2D.filenames[file]].data);
|
output[file] = iconjs.readIconFile(parsed[parsed.rootDirectory][PS2D.filenames[file]].data);
|
||||||
});
|
});
|
||||||
console.log(output);
|
console.log(output);
|
||||||
|
} else if(processObj.argv[2] === "psv") {
|
||||||
|
let inputFile = filesystem.readFileSync(processObj.argv[3] ? processObj.argv[3] : "file.psu");
|
||||||
|
const parsed = iconjs.readPsvFile(inputFile.buffer.slice(inputFile.byteOffset, inputFile.byteOffset + inputFile.byteLength));
|
||||||
|
console.log(parsed);
|
||||||
} else {
|
} else {
|
||||||
let inputFile = filesystem.readFileSync(processObj.argv[2] ? processObj.argv[2] : "icon.sys");
|
let inputFile = filesystem.readFileSync(processObj.argv[2] ? processObj.argv[2] : "icon.sys");
|
||||||
const metadata = iconjs.readPS2D(inputFile.buffer.slice(inputFile.byteOffset, inputFile.byteOffset + inputFile.byteLength));
|
const metadata = iconjs.readPS2D(inputFile.buffer.slice(inputFile.byteOffset, inputFile.byteOffset + inputFile.byteLength));
|
||||||
|
|
48
input.htm
48
input.htm
|
@ -59,9 +59,12 @@
|
||||||
<input type="file" id="icon" name="icon" accept=".icn, .ico" />
|
<input type="file" id="icon" name="icon" accept=".icn, .ico" />
|
||||||
<br>
|
<br>
|
||||||
<hr>
|
<hr>
|
||||||
<label for="psuinput">.psu goes here:</label>
|
<label for="psuinput">EMS Memory Adapter export file (.psu) goes here:</label>
|
||||||
<input type="file" id="psuinput" name="psuinput" accept=".psu" />
|
<input type="file" id="psuinput" name="psuinput" accept=".psu" />
|
||||||
<br>
|
<br>
|
||||||
|
<label for="psvinput">PS3 export file (.psv) goes here:</label>
|
||||||
|
<input type="file" id="psvinput" name="psvinput" accept=".psv" />
|
||||||
|
<br>
|
||||||
<p>
|
<p>
|
||||||
<span>Date created: </span><span id="dateCreated">--:--:-- --/--/----</span><span> UTC+09:00</span>
|
<span>Date created: </span><span id="dateCreated">--:--:-- --/--/----</span><span> UTC+09:00</span>
|
||||||
<br>
|
<br>
|
||||||
|
@ -99,6 +102,15 @@
|
||||||
glContext.drawArrays(glContext.TRIANGLE_STRIP, 0, 4);
|
glContext.drawArrays(glContext.TRIANGLE_STRIP, 0, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function resetDisplay() {
|
||||||
|
document.getElementById("title1").textContent = "\uff0d";
|
||||||
|
document.getElementById("title2").textContent = "\uff0d";
|
||||||
|
document.getElementById("iconn").textContent = "?";
|
||||||
|
document.getElementById("iconc").textContent = "?";
|
||||||
|
document.getElementById("icond").textContent = "?";
|
||||||
|
document.getElementById("dateCreated").textContent = "--:--:-- --/--/----";
|
||||||
|
document.getElementById("dateModified").textContent = "--:--:-- --/--/----";
|
||||||
|
}
|
||||||
document.getElementById("strictnessOption").onchange = function(e) {
|
document.getElementById("strictnessOption").onchange = function(e) {
|
||||||
setStrictness(e.target.checked);
|
setStrictness(e.target.checked);
|
||||||
if(!!filebox.files.length) {filebox.onchange();}
|
if(!!filebox.files.length) {filebox.onchange();}
|
||||||
|
@ -107,11 +119,7 @@
|
||||||
}
|
}
|
||||||
filebox = document.getElementById("input");
|
filebox = document.getElementById("input");
|
||||||
filebox.onchange = function(e) {
|
filebox.onchange = function(e) {
|
||||||
document.getElementById("title1").textContent = "\uff0d";
|
resetDisplay();
|
||||||
document.getElementById("title2").textContent = "\uff0d";
|
|
||||||
document.getElementById("iconn").textContent = "?";
|
|
||||||
document.getElementById("iconc").textContent = "?";
|
|
||||||
document.getElementById("icond").textContent = "?";
|
|
||||||
if(filebox.files.length === 0) {
|
if(filebox.files.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -142,13 +150,7 @@
|
||||||
}
|
}
|
||||||
psubox = document.getElementById("psuinput");
|
psubox = document.getElementById("psuinput");
|
||||||
psubox.onchange = function(e) {
|
psubox.onchange = function(e) {
|
||||||
document.getElementById("title1").textContent = "\uff0d";
|
resetDisplay();
|
||||||
document.getElementById("title2").textContent = "\uff0d";
|
|
||||||
document.getElementById("iconn").textContent = "?";
|
|
||||||
document.getElementById("iconc").textContent = "?";
|
|
||||||
document.getElementById("icond").textContent = "?";
|
|
||||||
document.getElementById("dateCreated").textContent = "--:--:-- --/--/----";
|
|
||||||
document.getElementById("dateModified").textContent = "--:--:-- --/--/----";
|
|
||||||
if(psubox.files.length === 0) {
|
if(psubox.files.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -173,6 +175,23 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
psvbox = document.getElementById("psvinput");
|
||||||
|
psvbox.onchange = function(e) {
|
||||||
|
resetDisplay();
|
||||||
|
if(psvbox.files.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
psvbox.files[0].arrayBuffer().then(function(d){
|
||||||
|
try {
|
||||||
|
let inputData = readPsvFile(d);
|
||||||
|
let output = readPS2D(inputData["icon.sys"]);
|
||||||
|
updateDisplay(output);
|
||||||
|
} catch(e) {
|
||||||
|
if(glContext!==null){glContext.clear(glContext.COLOR_BUFFER_BIT);}
|
||||||
|
alert(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
function createShader(gl, type, source) {
|
function createShader(gl, type, source) {
|
||||||
var shader = gl.createShader(type);
|
var shader = gl.createShader(type);
|
||||||
gl.shaderSource(shader, source);
|
gl.shaderSource(shader, source);
|
||||||
|
@ -234,6 +253,7 @@
|
||||||
}
|
}
|
||||||
//todo: Model rendering, animation parsing, animation tweening
|
//todo: Model rendering, animation parsing, animation tweening
|
||||||
</script>
|
</script>
|
||||||
<span id="version">icondumper2 0.3.2 - © 2023 yellows111</span>
|
<span id="version">icondumper2 <span id="iconjsVersion">(unknown icon.js version)</span> - © 2023 yellows111</span>
|
||||||
|
<script>document.getElementById("iconjsVersion").textContent = ICONJS_VERSION;</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
Loading…
Reference in New Issue