forked from Cu3PO42/KeySAVCoreJS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsave-reader-decrypted.ts
89 lines (80 loc) · 2.35 KB
/
save-reader-decrypted.ts
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
import SaveReader from "./save-reader";
import PkBase from "./pkbase";
import * as util from "./util";
const orasOffset = 0x33000;
const xyOffset = 0x22600;
const xyRamsavOffset = 0x1EF38;
const orasRamsavOffset = 0x2F794;
const smOffset = 0x04E00;
export { default as SaveReader } from "./save-reader";
export default class SaveReaderDecrypted implements SaveReader {
private offset: number;
public generation: number;
get keyName() {
return "Decrypted. No key needed.";
}
get unlockedSlots() {
return this.generation === 6 ? 930 : 960;
}
get isNewKey() {
return true;
}
scanSlots(from?: number, to?: number) {}
constructor(private sav: Uint8Array, type: string) {
switch (type) {
case "XY":
this.offset = xyOffset;
this.generation = 6;
break;
case "ORAS":
this.offset = orasOffset;
this.generation = 6;
break;
case "YABD":
this.generation = 6;
this.offset = 4;
var ekx = sav.subarray(4, 236);
if (!PkBase.verifyChk(PkBase.decrypt(ekx)))
this.offset = 8;
break;
case "PCDATA":
this.generation = 6;
this.offset = 0;
break;
case "XYRAM":
this.generation = 6;
this.offset = xyRamsavOffset;
break;
case "ORASRAM":
this.generation = 6;
this.offset = orasRamsavOffset;
break;
case "SM":
this.generation = 7;
this.offset = smOffset;
break;
}
}
getPkx(pos: number): PkBase {
var pkxOffset = this.offset + pos * 232;
var pkx = this.sav.subarray(pkxOffset, pkxOffset + 232);
if (util.empty(pkx))
return undefined;
pkx = PkBase.decrypt(pkx);
if (PkBase.verifyChk(pkx) && (pkx[8] | pkx[9]) != 0) {
return PkBase.makePkm(pkx, this.generation, Math.floor(pos / 30), pos % 30, false);
}
return undefined;
}
getAllPkx() {
var res = [];
var tmp;
for (var i = 0; i < (this.generation === 6 ? 930 : 960); ++i) {
tmp = this.getPkx(i);
if (tmp !== undefined) {
res.push(tmp);
}
}
return res;
}
}