forked from FourCinnamon0/sc-exportname-tool
-
Notifications
You must be signed in to change notification settings - Fork 0
/
exportname_tool.js
145 lines (135 loc) · 4.13 KB
/
exportname_tool.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
const fs = require("fs");
class SCChunkReader {
constructor(data) {
this.data = data
this.i = 0
}
addData(data) {
Buffer.concat([this.data,data])
}
readInt32() {
var intt = this.data.readInt32LE(this.i)
this.i += 4
return intt
}
readInt16() {
var intt = this.data.readInt16LE(this.i)
this.i += 2
return intt
}
readInt8() {
var intt = this.data.readInt8(this.i)
this.i += 1
return intt
}
readString() {
var length = this.readInt8()
return this.readBuffer(length).toString()
}
readBuffer(length) {
var buf = this.data.slice(this.i,this.i+length)
this.i += length
return buf
}
peekBuffer(length,offset) {
return this.data.slice(this.i+offset,this.i+length+offset)
}
logBuffer(length) {
console.log("logBuffer",this.data.slice(this.i,this.i+length))
// return this.data.slice(this.i,this.i+length)
}
skip(i) {
this.i += i
}
}
var data = fs.readFileSync(process.argv[2])
var showIDs = process.argv[3] === "true"||process.argv[3] === "yes"
if(!process.argv[3]){
showIDs = true
}
var saveToFile = process.argv[4] === "true"||process.argv[3] === "yes"
if(!process.argv[4]){
saveToFile = false
}
var version = null;var decompressed;
if(data[0] == 83 && data[1] == 67) {
pre_version = (data.slice(2, 6).readInt32BE())
if (pre_version == 4) {
version = (data.slice(6, 10).readInt32BE())
hash_length = (data.slice(10, 14).readInt32BE())
end_block_size = (data.slice(-4).readInt32BE())
data = data.slice(14 + hash_length,-end_block_size - 9)
console.log("SC header version:",pre_version,"SC format version",version)
console.log("( pt ) Versão do cabeçalho SC:",pre_version,"Versão do formato SC",version)
}else{
version = pre_version
hash_length = (data.slice(6, 10).readInt32BE())
data = data.slice(10 + hash_length)
console.log("SC version: ",version)
console.log("( pt ) Versão do SC: ",version)
}
}
if([null, 1, 3].includes(version)) {
try{
if (Buffer.compare(data.slice(0,4), Buffer.from("SCLZ", 'utf8')) == 0) {
console.log('[*] Detected LZHAM compression !')
console.log('[*] ( pt ) Compressão LZHAM detectada !')
decompressed = require("sc-compression").decompress(data)
}else if(Buffer.compare(data.slice(0,4), Buffer.from([0x28, 0xB5, 0x2F, 0xFD])) == 0){
console.log('[*] Detected Zstandard compression !')
console.log('[*] ( pt ) Compressão Zstandard detectada !')
const ZstdCodec = require('zstd-codec').ZstdCodec
decompressed = (new ZstdCodec.Simple()).decompress(data)
}else{
const lzma = require("lzma");
console.log('[*] Detected LZMA compression !')
console.log('[*] ( pt ) Compressão LZMA detectada !')
data = Buffer.concat([data.slice(0,9), Buffer.from([0,0,0,0]), data.slice(9)])
decompressed = Buffer.from(lzma.decompress(data))
}
}catch (e) {
console.error(e)
console.log(`Cannot decompress file!`)
console.log(`( pt ) Não é possível descompactar o arquivo!`)
return;
}
} else {
decompressed = data
}
// console.log(decompressed)
var reader = new SCChunkReader(decompressed)
var shapeCount = reader.readInt16()
var animationsCount = reader.readInt16()
var texturesCount = reader.readInt16()
var textFieldsCount = reader.readInt16()
var matricesCount = reader.readInt16()
var colorTransformsCount = reader.readInt16()
reader.skip(5)
var exportCount = reader.readInt16();
var exportIDs = [];var exports = []
for (let i = 0; i < exportCount; i++) {
exportIDs.push(reader.readInt16());
}
var toWrite = ""
if(saveToFile) {
clog = function (...args) {
toWrite = toWrite + args.join(" ") + "\n"
console.log(...args)
}
done = function () {
fs.writeFileSync("export_names.txt",toWrite)
console.log("Saved output to export_names.txt")
console.log("( pt ) Saída salva em export_names.txt")
}
}else{
clog = function (...args) {
console.log(...args)
}
done = function () {}
}
for (let i = 0; i < exportCount; i++) {
exports.push(reader.readString());
if(showIDs) {clog(exportIDs[i],exports[i])}else{clog(exports[i])}
}
done()
// console.log(exportIDs,exports)