ygopro-deck-encode 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +51 -17
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +52 -17
- package/dist/index.mjs.map +2 -2
- package/dist/src/utils.d.ts +11 -0
- package/index.ts +17 -21
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -31,6 +31,46 @@ function countItems(arr) {
|
|
|
31
31
|
}
|
|
32
32
|
return map;
|
|
33
33
|
}
|
|
34
|
+
var BufferWriter = class {
|
|
35
|
+
constructor(length) {
|
|
36
|
+
this.pointer = 0;
|
|
37
|
+
this.buffer = new Uint8Array(length);
|
|
38
|
+
}
|
|
39
|
+
writeUint32LE(value) {
|
|
40
|
+
this.buffer[this.pointer++] = value & 255;
|
|
41
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
42
|
+
this.buffer[this.pointer++] = value >> 16 & 255;
|
|
43
|
+
this.buffer[this.pointer++] = value >> 24 & 255;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
writeUint32BE(value) {
|
|
47
|
+
this.buffer[this.pointer++] = value >> 24 & 255;
|
|
48
|
+
this.buffer[this.pointer++] = value >> 16 & 255;
|
|
49
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
50
|
+
this.buffer[this.pointer++] = value & 255;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
writeUint16LE(value) {
|
|
54
|
+
this.buffer[this.pointer++] = value & 255;
|
|
55
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
writeUint16BE(value) {
|
|
59
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
60
|
+
this.buffer[this.pointer++] = value & 255;
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
writeUint8(value) {
|
|
64
|
+
this.buffer[this.pointer++] = value & 255;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
writeString(str) {
|
|
68
|
+
for (let i = 0; i < str.length; i++) {
|
|
69
|
+
this.buffer[this.pointer++] = str.charCodeAt(i);
|
|
70
|
+
}
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
34
74
|
|
|
35
75
|
// index.ts
|
|
36
76
|
var import_js_base64 = require("js-base64");
|
|
@@ -40,36 +80,26 @@ var YGOProDeck = class {
|
|
|
40
80
|
this.extra = [];
|
|
41
81
|
this.side = [];
|
|
42
82
|
}
|
|
43
|
-
sort() {
|
|
44
|
-
this.main.sort();
|
|
45
|
-
this.extra.sort();
|
|
46
|
-
this.side.sort();
|
|
47
|
-
}
|
|
48
83
|
bufferLength() {
|
|
49
84
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
50
85
|
return counted.reduce((a, b) => a + b.size * 4, 0);
|
|
51
86
|
}
|
|
52
87
|
toUint8Array() {
|
|
53
88
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
buf[pointer++] = value & 255;
|
|
58
|
-
buf[pointer++] = value >> 8 & 255;
|
|
59
|
-
buf[pointer++] = value >> 16 & 255;
|
|
60
|
-
buf[pointer++] = value >> 24 & 255;
|
|
61
|
-
};
|
|
89
|
+
const writer = new BufferWriter(
|
|
90
|
+
counted.reduce((a, b) => a + b.size * 4, 0)
|
|
91
|
+
);
|
|
62
92
|
const writeCards = (countMap, type) => {
|
|
63
93
|
for (const [id, count] of countMap.entries()) {
|
|
64
94
|
if (count > 4) {
|
|
65
95
|
throw new Error(`Too many cards: ${id}`);
|
|
66
96
|
}
|
|
67
97
|
const value = id & 268435455 | type << 28 | count - 1 << 30;
|
|
68
|
-
writeUint32LE(value);
|
|
98
|
+
writer.writeUint32LE(value);
|
|
69
99
|
}
|
|
70
100
|
};
|
|
71
101
|
counted.forEach(writeCards);
|
|
72
|
-
return
|
|
102
|
+
return writer.buffer;
|
|
73
103
|
}
|
|
74
104
|
toEncodedString() {
|
|
75
105
|
return import_js_base64.Base64.fromUint8Array(this.toUint8Array(), true);
|
|
@@ -88,7 +118,6 @@ var YGOProDeck = class {
|
|
|
88
118
|
cards.push(id);
|
|
89
119
|
}
|
|
90
120
|
}
|
|
91
|
-
this.sort();
|
|
92
121
|
return this;
|
|
93
122
|
}
|
|
94
123
|
static fromUint8Array(buf) {
|
|
@@ -129,12 +158,17 @@ var YGOProDeck = class {
|
|
|
129
158
|
current.push(parseInt(line, 10));
|
|
130
159
|
}
|
|
131
160
|
}
|
|
132
|
-
this.sort();
|
|
133
161
|
return this;
|
|
134
162
|
}
|
|
135
163
|
static fromYdkString(str) {
|
|
136
164
|
return new YGOProDeck().fromYdkString(str);
|
|
137
165
|
}
|
|
166
|
+
toUpdateDeckPayload() {
|
|
167
|
+
const cards = [...this.main, ...this.extra, ...this.side];
|
|
168
|
+
const writer = new BufferWriter(cards.length * 4 + 8).writeUint32LE(this.main.length + this.extra.length).writeUint32LE(this.side.length);
|
|
169
|
+
cards.forEach((id) => writer.writeUint32LE(id));
|
|
170
|
+
return writer.buffer;
|
|
171
|
+
}
|
|
138
172
|
};
|
|
139
173
|
// Annotate the CommonJS export names for ESM import in node:
|
|
140
174
|
0 && (module.exports = {});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../index.ts", "../src/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { countItems } from './src/utils';\nimport { Base64
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,WAAc,KAAU;AACtC,QAAM,MAAM,oBAAI,IAAe;AAC/B,aAAW,QAAQ,KAAK;AACtB,QAAI,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EACxC;AACA,SAAO;AACT
|
|
4
|
+
"sourcesContent": ["import { BufferWriter, countItems } from './src/utils';\nimport { Base64 } from 'js-base64';\n\nexport default class YGOProDeck {\n main: number[] = [];\n extra: number[] = [];\n side: number[] = [];\n\n bufferLength() {\n const counted = [this.main, this.extra, this.side].map(countItems);\n return counted.reduce((a, b) => a + b.size * 4, 0);\n }\n\n toUint8Array() {\n const counted = [this.main, this.extra, this.side].map(countItems);\n const writer = new BufferWriter(\n counted.reduce((a, b) => a + b.size * 4, 0),\n );\n const writeCards = (countMap: Map<number, number>, type: number) => {\n // each card: 28 bits for id, 2 bits(0, 1, 2, 3) for type(0: main, 1: extra, 2: side, 3: unknown), 2 bits for count (0: 1, 1: 2, 2: 3, 3: 4)\n for (const [id, count] of countMap.entries()) {\n if (count > 4) {\n throw new Error(`Too many cards: ${id}`);\n }\n const value = (id & 0xfffffff) | (type << 28) | ((count - 1) << 30);\n writer.writeUint32LE(value);\n }\n };\n counted.forEach(writeCards);\n return writer.buffer;\n }\n\n toEncodedString() {\n return Base64.fromUint8Array(this.toUint8Array(), true);\n }\n\n toString() {\n return this.toEncodedString();\n }\n\n fromUint8Array(buf: Uint8Array) {\n for (let i = 0; i < buf.length - 3; i += 4) {\n const value =\n buf[i] | (buf[i + 1] << 8) | (buf[i + 2] << 16) | (buf[i + 3] << 24);\n const id = value & 0xfffffff;\n const type = (value >> 28) & 0x3;\n const count = ((value >> 30) & 0x3) + 1;\n const cards = [this.main, this.extra, this.side][type];\n for (let j = 0; j < count; j++) {\n cards.push(id);\n }\n }\n return this;\n }\n\n static fromUint8Array(buf: Uint8Array) {\n return new YGOProDeck().fromUint8Array(buf);\n }\n\n fromEncodedString(str: string) {\n return this.fromUint8Array(Base64.toUint8Array(str));\n }\n\n static fromEncodedString(str: string) {\n return new YGOProDeck().fromEncodedString(str);\n }\n\n toYdkString() {\n return [\n '#created by ygopro-deck-encode',\n '#main',\n ...this.main.map((id) => id.toString()),\n '#extra',\n ...this.extra.map((id) => id.toString()),\n '!side',\n ...this.side.map((id) => id.toString()),\n ].join('\\n');\n }\n\n fromYdkString(str: string) {\n const lines = str.split('\\n');\n let current = this.main;\n for (const _line of lines) {\n const line = _line.trim();\n if (line === '#main') {\n current = this.main;\n }\n if (line === '#extra') {\n current = this.extra;\n }\n if (line === '!side') {\n current = this.side;\n }\n if (line.match(/^\\d+$/)) {\n current.push(parseInt(line, 10));\n }\n }\n return this;\n }\n\n static fromYdkString(str: string) {\n return new YGOProDeck().fromYdkString(str);\n }\n\n toUpdateDeckPayload() {\n const cards = [...this.main, ...this.extra, ...this.side];\n const writer = new BufferWriter(cards.length * 4 + 8)\n .writeUint32LE(this.main.length + this.extra.length)\n .writeUint32LE(this.side.length);\n cards.forEach((id) => writer.writeUint32LE(id));\n return writer.buffer;\n }\n}\n", "export function countItems<T>(arr: T[]) {\n const map = new Map<T, number>();\n for (const item of arr) {\n map.set(item, (map.get(item) || 0) + 1);\n }\n return map;\n}\n\nexport class BufferWriter {\n buffer: Uint8Array;\n pointer = 0;\n constructor(length: number) {\n this.buffer = new Uint8Array(length);\n }\n writeUint32LE(value: number) {\n this.buffer[this.pointer++] = value & 0xff;\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n this.buffer[this.pointer++] = (value >> 16) & 0xff;\n this.buffer[this.pointer++] = (value >> 24) & 0xff;\n return this;\n }\n\n writeUint32BE(value: number) {\n this.buffer[this.pointer++] = (value >> 24) & 0xff;\n this.buffer[this.pointer++] = (value >> 16) & 0xff;\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n this.buffer[this.pointer++] = value & 0xff;\n return this;\n }\n\n writeUint16LE(value: number) {\n this.buffer[this.pointer++] = value & 0xff;\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n return this;\n }\n\n writeUint16BE(value: number) {\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n this.buffer[this.pointer++] = value & 0xff;\n return this;\n }\n\n writeUint8(value: number) {\n this.buffer[this.pointer++] = value & 0xff;\n return this;\n }\n\n writeString(str: string) {\n for (let i = 0; i < str.length; i++) {\n this.buffer[this.pointer++] = str.charCodeAt(i);\n }\n return this;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ export default class YGOProDeck {
|
|
|
2
2
|
main: number[];
|
|
3
3
|
extra: number[];
|
|
4
4
|
side: number[];
|
|
5
|
-
private sort;
|
|
6
5
|
bufferLength(): number;
|
|
7
6
|
toUint8Array(): Uint8Array;
|
|
8
7
|
toEncodedString(): string;
|
|
@@ -14,4 +13,5 @@ export default class YGOProDeck {
|
|
|
14
13
|
toYdkString(): string;
|
|
15
14
|
fromYdkString(str: string): this;
|
|
16
15
|
static fromYdkString(str: string): YGOProDeck;
|
|
16
|
+
toUpdateDeckPayload(): Uint8Array;
|
|
17
17
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -6,6 +6,47 @@ function countItems(arr) {
|
|
|
6
6
|
}
|
|
7
7
|
return map;
|
|
8
8
|
}
|
|
9
|
+
var BufferWriter = class {
|
|
10
|
+
buffer;
|
|
11
|
+
pointer = 0;
|
|
12
|
+
constructor(length) {
|
|
13
|
+
this.buffer = new Uint8Array(length);
|
|
14
|
+
}
|
|
15
|
+
writeUint32LE(value) {
|
|
16
|
+
this.buffer[this.pointer++] = value & 255;
|
|
17
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
18
|
+
this.buffer[this.pointer++] = value >> 16 & 255;
|
|
19
|
+
this.buffer[this.pointer++] = value >> 24 & 255;
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
writeUint32BE(value) {
|
|
23
|
+
this.buffer[this.pointer++] = value >> 24 & 255;
|
|
24
|
+
this.buffer[this.pointer++] = value >> 16 & 255;
|
|
25
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
26
|
+
this.buffer[this.pointer++] = value & 255;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
writeUint16LE(value) {
|
|
30
|
+
this.buffer[this.pointer++] = value & 255;
|
|
31
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
writeUint16BE(value) {
|
|
35
|
+
this.buffer[this.pointer++] = value >> 8 & 255;
|
|
36
|
+
this.buffer[this.pointer++] = value & 255;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
writeUint8(value) {
|
|
40
|
+
this.buffer[this.pointer++] = value & 255;
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
writeString(str) {
|
|
44
|
+
for (let i = 0; i < str.length; i++) {
|
|
45
|
+
this.buffer[this.pointer++] = str.charCodeAt(i);
|
|
46
|
+
}
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
9
50
|
|
|
10
51
|
// index.ts
|
|
11
52
|
import { Base64 } from "js-base64";
|
|
@@ -13,36 +54,26 @@ var YGOProDeck = class {
|
|
|
13
54
|
main = [];
|
|
14
55
|
extra = [];
|
|
15
56
|
side = [];
|
|
16
|
-
sort() {
|
|
17
|
-
this.main.sort();
|
|
18
|
-
this.extra.sort();
|
|
19
|
-
this.side.sort();
|
|
20
|
-
}
|
|
21
57
|
bufferLength() {
|
|
22
58
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
23
59
|
return counted.reduce((a, b) => a + b.size * 4, 0);
|
|
24
60
|
}
|
|
25
61
|
toUint8Array() {
|
|
26
62
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
buf[pointer++] = value & 255;
|
|
31
|
-
buf[pointer++] = value >> 8 & 255;
|
|
32
|
-
buf[pointer++] = value >> 16 & 255;
|
|
33
|
-
buf[pointer++] = value >> 24 & 255;
|
|
34
|
-
};
|
|
63
|
+
const writer = new BufferWriter(
|
|
64
|
+
counted.reduce((a, b) => a + b.size * 4, 0)
|
|
65
|
+
);
|
|
35
66
|
const writeCards = (countMap, type) => {
|
|
36
67
|
for (const [id, count] of countMap.entries()) {
|
|
37
68
|
if (count > 4) {
|
|
38
69
|
throw new Error(`Too many cards: ${id}`);
|
|
39
70
|
}
|
|
40
71
|
const value = id & 268435455 | type << 28 | count - 1 << 30;
|
|
41
|
-
writeUint32LE(value);
|
|
72
|
+
writer.writeUint32LE(value);
|
|
42
73
|
}
|
|
43
74
|
};
|
|
44
75
|
counted.forEach(writeCards);
|
|
45
|
-
return
|
|
76
|
+
return writer.buffer;
|
|
46
77
|
}
|
|
47
78
|
toEncodedString() {
|
|
48
79
|
return Base64.fromUint8Array(this.toUint8Array(), true);
|
|
@@ -61,7 +92,6 @@ var YGOProDeck = class {
|
|
|
61
92
|
cards.push(id);
|
|
62
93
|
}
|
|
63
94
|
}
|
|
64
|
-
this.sort();
|
|
65
95
|
return this;
|
|
66
96
|
}
|
|
67
97
|
static fromUint8Array(buf) {
|
|
@@ -102,12 +132,17 @@ var YGOProDeck = class {
|
|
|
102
132
|
current.push(parseInt(line, 10));
|
|
103
133
|
}
|
|
104
134
|
}
|
|
105
|
-
this.sort();
|
|
106
135
|
return this;
|
|
107
136
|
}
|
|
108
137
|
static fromYdkString(str) {
|
|
109
138
|
return new YGOProDeck().fromYdkString(str);
|
|
110
139
|
}
|
|
140
|
+
toUpdateDeckPayload() {
|
|
141
|
+
const cards = [...this.main, ...this.extra, ...this.side];
|
|
142
|
+
const writer = new BufferWriter(cards.length * 4 + 8).writeUint32LE(this.main.length + this.extra.length).writeUint32LE(this.side.length);
|
|
143
|
+
cards.forEach((id) => writer.writeUint32LE(id));
|
|
144
|
+
return writer.buffer;
|
|
145
|
+
}
|
|
111
146
|
};
|
|
112
147
|
export {
|
|
113
148
|
YGOProDeck as default
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/utils.ts", "../index.ts"],
|
|
4
|
-
"sourcesContent": ["export function countItems<T>(arr: T[]) {\n const map = new Map<T, number>();\n for (const item of arr) {\n map.set(item, (map.get(item) || 0) + 1);\n }\n return map;\n}\n
|
|
5
|
-
"mappings": ";AAAO,SAAS,WAAc,KAAU;AACtC,QAAM,MAAM,oBAAI,IAAe;AAC/B,aAAW,QAAQ,KAAK;AACtB,QAAI,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EACxC;AACA,SAAO;AACT
|
|
4
|
+
"sourcesContent": ["export function countItems<T>(arr: T[]) {\n const map = new Map<T, number>();\n for (const item of arr) {\n map.set(item, (map.get(item) || 0) + 1);\n }\n return map;\n}\n\nexport class BufferWriter {\n buffer: Uint8Array;\n pointer = 0;\n constructor(length: number) {\n this.buffer = new Uint8Array(length);\n }\n writeUint32LE(value: number) {\n this.buffer[this.pointer++] = value & 0xff;\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n this.buffer[this.pointer++] = (value >> 16) & 0xff;\n this.buffer[this.pointer++] = (value >> 24) & 0xff;\n return this;\n }\n\n writeUint32BE(value: number) {\n this.buffer[this.pointer++] = (value >> 24) & 0xff;\n this.buffer[this.pointer++] = (value >> 16) & 0xff;\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n this.buffer[this.pointer++] = value & 0xff;\n return this;\n }\n\n writeUint16LE(value: number) {\n this.buffer[this.pointer++] = value & 0xff;\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n return this;\n }\n\n writeUint16BE(value: number) {\n this.buffer[this.pointer++] = (value >> 8) & 0xff;\n this.buffer[this.pointer++] = value & 0xff;\n return this;\n }\n\n writeUint8(value: number) {\n this.buffer[this.pointer++] = value & 0xff;\n return this;\n }\n\n writeString(str: string) {\n for (let i = 0; i < str.length; i++) {\n this.buffer[this.pointer++] = str.charCodeAt(i);\n }\n return this;\n }\n}\n", "import { BufferWriter, countItems } from './src/utils';\nimport { Base64 } from 'js-base64';\n\nexport default class YGOProDeck {\n main: number[] = [];\n extra: number[] = [];\n side: number[] = [];\n\n bufferLength() {\n const counted = [this.main, this.extra, this.side].map(countItems);\n return counted.reduce((a, b) => a + b.size * 4, 0);\n }\n\n toUint8Array() {\n const counted = [this.main, this.extra, this.side].map(countItems);\n const writer = new BufferWriter(\n counted.reduce((a, b) => a + b.size * 4, 0),\n );\n const writeCards = (countMap: Map<number, number>, type: number) => {\n // each card: 28 bits for id, 2 bits(0, 1, 2, 3) for type(0: main, 1: extra, 2: side, 3: unknown), 2 bits for count (0: 1, 1: 2, 2: 3, 3: 4)\n for (const [id, count] of countMap.entries()) {\n if (count > 4) {\n throw new Error(`Too many cards: ${id}`);\n }\n const value = (id & 0xfffffff) | (type << 28) | ((count - 1) << 30);\n writer.writeUint32LE(value);\n }\n };\n counted.forEach(writeCards);\n return writer.buffer;\n }\n\n toEncodedString() {\n return Base64.fromUint8Array(this.toUint8Array(), true);\n }\n\n toString() {\n return this.toEncodedString();\n }\n\n fromUint8Array(buf: Uint8Array) {\n for (let i = 0; i < buf.length - 3; i += 4) {\n const value =\n buf[i] | (buf[i + 1] << 8) | (buf[i + 2] << 16) | (buf[i + 3] << 24);\n const id = value & 0xfffffff;\n const type = (value >> 28) & 0x3;\n const count = ((value >> 30) & 0x3) + 1;\n const cards = [this.main, this.extra, this.side][type];\n for (let j = 0; j < count; j++) {\n cards.push(id);\n }\n }\n return this;\n }\n\n static fromUint8Array(buf: Uint8Array) {\n return new YGOProDeck().fromUint8Array(buf);\n }\n\n fromEncodedString(str: string) {\n return this.fromUint8Array(Base64.toUint8Array(str));\n }\n\n static fromEncodedString(str: string) {\n return new YGOProDeck().fromEncodedString(str);\n }\n\n toYdkString() {\n return [\n '#created by ygopro-deck-encode',\n '#main',\n ...this.main.map((id) => id.toString()),\n '#extra',\n ...this.extra.map((id) => id.toString()),\n '!side',\n ...this.side.map((id) => id.toString()),\n ].join('\\n');\n }\n\n fromYdkString(str: string) {\n const lines = str.split('\\n');\n let current = this.main;\n for (const _line of lines) {\n const line = _line.trim();\n if (line === '#main') {\n current = this.main;\n }\n if (line === '#extra') {\n current = this.extra;\n }\n if (line === '!side') {\n current = this.side;\n }\n if (line.match(/^\\d+$/)) {\n current.push(parseInt(line, 10));\n }\n }\n return this;\n }\n\n static fromYdkString(str: string) {\n return new YGOProDeck().fromYdkString(str);\n }\n\n toUpdateDeckPayload() {\n const cards = [...this.main, ...this.extra, ...this.side];\n const writer = new BufferWriter(cards.length * 4 + 8)\n .writeUint32LE(this.main.length + this.extra.length)\n .writeUint32LE(this.side.length);\n cards.forEach((id) => writer.writeUint32LE(id));\n return writer.buffer;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -1 +1,12 @@
|
|
|
1
1
|
export declare function countItems<T>(arr: T[]): Map<T, number>;
|
|
2
|
+
export declare class BufferWriter {
|
|
3
|
+
buffer: Uint8Array;
|
|
4
|
+
pointer: number;
|
|
5
|
+
constructor(length: number);
|
|
6
|
+
writeUint32LE(value: number): this;
|
|
7
|
+
writeUint32BE(value: number): this;
|
|
8
|
+
writeUint16LE(value: number): this;
|
|
9
|
+
writeUint16BE(value: number): this;
|
|
10
|
+
writeUint8(value: number): this;
|
|
11
|
+
writeString(str: string): this;
|
|
12
|
+
}
|
package/index.ts
CHANGED
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
import { countItems } from './src/utils';
|
|
2
|
-
import { Base64
|
|
1
|
+
import { BufferWriter, countItems } from './src/utils';
|
|
2
|
+
import { Base64 } from 'js-base64';
|
|
3
3
|
|
|
4
4
|
export default class YGOProDeck {
|
|
5
5
|
main: number[] = [];
|
|
6
6
|
extra: number[] = [];
|
|
7
7
|
side: number[] = [];
|
|
8
8
|
|
|
9
|
-
private sort() {
|
|
10
|
-
this.main.sort();
|
|
11
|
-
this.extra.sort();
|
|
12
|
-
this.side.sort();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
9
|
bufferLength() {
|
|
16
10
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
17
11
|
return counted.reduce((a, b) => a + b.size * 4, 0);
|
|
@@ -19,14 +13,9 @@ export default class YGOProDeck {
|
|
|
19
13
|
|
|
20
14
|
toUint8Array() {
|
|
21
15
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
buf[pointer++] = value & 0xff;
|
|
26
|
-
buf[pointer++] = (value >> 8) & 0xff;
|
|
27
|
-
buf[pointer++] = (value >> 16) & 0xff;
|
|
28
|
-
buf[pointer++] = (value >> 24) & 0xff;
|
|
29
|
-
};
|
|
16
|
+
const writer = new BufferWriter(
|
|
17
|
+
counted.reduce((a, b) => a + b.size * 4, 0),
|
|
18
|
+
);
|
|
30
19
|
const writeCards = (countMap: Map<number, number>, type: number) => {
|
|
31
20
|
// each card: 28 bits for id, 2 bits(0, 1, 2, 3) for type(0: main, 1: extra, 2: side, 3: unknown), 2 bits for count (0: 1, 1: 2, 2: 3, 3: 4)
|
|
32
21
|
for (const [id, count] of countMap.entries()) {
|
|
@@ -34,11 +23,11 @@ export default class YGOProDeck {
|
|
|
34
23
|
throw new Error(`Too many cards: ${id}`);
|
|
35
24
|
}
|
|
36
25
|
const value = (id & 0xfffffff) | (type << 28) | ((count - 1) << 30);
|
|
37
|
-
writeUint32LE(value);
|
|
26
|
+
writer.writeUint32LE(value);
|
|
38
27
|
}
|
|
39
28
|
};
|
|
40
29
|
counted.forEach(writeCards);
|
|
41
|
-
return
|
|
30
|
+
return writer.buffer;
|
|
42
31
|
}
|
|
43
32
|
|
|
44
33
|
toEncodedString() {
|
|
@@ -61,7 +50,6 @@ export default class YGOProDeck {
|
|
|
61
50
|
cards.push(id);
|
|
62
51
|
}
|
|
63
52
|
}
|
|
64
|
-
this.sort();
|
|
65
53
|
return this;
|
|
66
54
|
}
|
|
67
55
|
|
|
@@ -73,7 +61,7 @@ export default class YGOProDeck {
|
|
|
73
61
|
return this.fromUint8Array(Base64.toUint8Array(str));
|
|
74
62
|
}
|
|
75
63
|
|
|
76
|
-
static fromEncodedString(str: string) {
|
|
64
|
+
static fromEncodedString(str: string) {
|
|
77
65
|
return new YGOProDeck().fromEncodedString(str);
|
|
78
66
|
}
|
|
79
67
|
|
|
@@ -107,11 +95,19 @@ export default class YGOProDeck {
|
|
|
107
95
|
current.push(parseInt(line, 10));
|
|
108
96
|
}
|
|
109
97
|
}
|
|
110
|
-
this.sort();
|
|
111
98
|
return this;
|
|
112
99
|
}
|
|
113
100
|
|
|
114
101
|
static fromYdkString(str: string) {
|
|
115
102
|
return new YGOProDeck().fromYdkString(str);
|
|
116
103
|
}
|
|
104
|
+
|
|
105
|
+
toUpdateDeckPayload() {
|
|
106
|
+
const cards = [...this.main, ...this.extra, ...this.side];
|
|
107
|
+
const writer = new BufferWriter(cards.length * 4 + 8)
|
|
108
|
+
.writeUint32LE(this.main.length + this.extra.length)
|
|
109
|
+
.writeUint32LE(this.side.length);
|
|
110
|
+
cards.forEach((id) => writer.writeUint32LE(id));
|
|
111
|
+
return writer.buffer;
|
|
112
|
+
}
|
|
117
113
|
}
|
package/package.json
CHANGED