ygopro-deck-encode 1.0.2 → 1.0.4
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 +53 -12
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +54 -12
- package/dist/index.mjs.map +2 -2
- package/dist/src/utils.d.ts +11 -0
- package/index.ts +18 -14
- package/package.json +4 -4
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");
|
|
@@ -46,25 +86,20 @@ var YGOProDeck = class {
|
|
|
46
86
|
}
|
|
47
87
|
toUint8Array() {
|
|
48
88
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
buf[pointer++] = value & 255;
|
|
53
|
-
buf[pointer++] = value >> 8 & 255;
|
|
54
|
-
buf[pointer++] = value >> 16 & 255;
|
|
55
|
-
buf[pointer++] = value >> 24 & 255;
|
|
56
|
-
};
|
|
89
|
+
const writer = new BufferWriter(
|
|
90
|
+
counted.reduce((a, b) => a + b.size * 4, 0)
|
|
91
|
+
);
|
|
57
92
|
const writeCards = (countMap, type) => {
|
|
58
93
|
for (const [id, count] of countMap.entries()) {
|
|
59
94
|
if (count > 4) {
|
|
60
95
|
throw new Error(`Too many cards: ${id}`);
|
|
61
96
|
}
|
|
62
97
|
const value = id & 268435455 | type << 28 | count - 1 << 30;
|
|
63
|
-
writeUint32LE(value);
|
|
98
|
+
writer.writeUint32LE(value);
|
|
64
99
|
}
|
|
65
100
|
};
|
|
66
101
|
counted.forEach(writeCards);
|
|
67
|
-
return
|
|
102
|
+
return writer.buffer;
|
|
68
103
|
}
|
|
69
104
|
toEncodedString() {
|
|
70
105
|
return import_js_base64.Base64.fromUint8Array(this.toUint8Array(), true);
|
|
@@ -76,8 +111,8 @@ var YGOProDeck = class {
|
|
|
76
111
|
for (let i = 0; i < buf.length - 3; i += 4) {
|
|
77
112
|
const value = buf[i] | buf[i + 1] << 8 | buf[i + 2] << 16 | buf[i + 3] << 24;
|
|
78
113
|
const id = value & 268435455;
|
|
79
|
-
const type = value
|
|
80
|
-
const count = (value
|
|
114
|
+
const type = value >>> 28 & 3;
|
|
115
|
+
const count = (value >>> 30 & 3) + 1;
|
|
81
116
|
const cards = [this.main, this.extra, this.side][type];
|
|
82
117
|
for (let j = 0; j < count; j++) {
|
|
83
118
|
cards.push(id);
|
|
@@ -128,6 +163,12 @@ var YGOProDeck = class {
|
|
|
128
163
|
static fromYdkString(str) {
|
|
129
164
|
return new YGOProDeck().fromYdkString(str);
|
|
130
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
|
+
}
|
|
131
172
|
};
|
|
132
173
|
// Annotate the CommonJS export names for ESM import in node:
|
|
133
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 } 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
|
|
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
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";
|
|
@@ -19,25 +60,20 @@ var YGOProDeck = class {
|
|
|
19
60
|
}
|
|
20
61
|
toUint8Array() {
|
|
21
62
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
buf[pointer++] = value & 255;
|
|
26
|
-
buf[pointer++] = value >> 8 & 255;
|
|
27
|
-
buf[pointer++] = value >> 16 & 255;
|
|
28
|
-
buf[pointer++] = value >> 24 & 255;
|
|
29
|
-
};
|
|
63
|
+
const writer = new BufferWriter(
|
|
64
|
+
counted.reduce((a, b) => a + b.size * 4, 0)
|
|
65
|
+
);
|
|
30
66
|
const writeCards = (countMap, type) => {
|
|
31
67
|
for (const [id, count] of countMap.entries()) {
|
|
32
68
|
if (count > 4) {
|
|
33
69
|
throw new Error(`Too many cards: ${id}`);
|
|
34
70
|
}
|
|
35
71
|
const value = id & 268435455 | type << 28 | count - 1 << 30;
|
|
36
|
-
writeUint32LE(value);
|
|
72
|
+
writer.writeUint32LE(value);
|
|
37
73
|
}
|
|
38
74
|
};
|
|
39
75
|
counted.forEach(writeCards);
|
|
40
|
-
return
|
|
76
|
+
return writer.buffer;
|
|
41
77
|
}
|
|
42
78
|
toEncodedString() {
|
|
43
79
|
return Base64.fromUint8Array(this.toUint8Array(), true);
|
|
@@ -49,8 +85,8 @@ var YGOProDeck = class {
|
|
|
49
85
|
for (let i = 0; i < buf.length - 3; i += 4) {
|
|
50
86
|
const value = buf[i] | buf[i + 1] << 8 | buf[i + 2] << 16 | buf[i + 3] << 24;
|
|
51
87
|
const id = value & 268435455;
|
|
52
|
-
const type = value
|
|
53
|
-
const count = (value
|
|
88
|
+
const type = value >>> 28 & 3;
|
|
89
|
+
const count = (value >>> 30 & 3) + 1;
|
|
54
90
|
const cards = [this.main, this.extra, this.side][type];
|
|
55
91
|
for (let j = 0; j < count; j++) {
|
|
56
92
|
cards.push(id);
|
|
@@ -101,6 +137,12 @@ var YGOProDeck = class {
|
|
|
101
137
|
static fromYdkString(str) {
|
|
102
138
|
return new YGOProDeck().fromYdkString(str);
|
|
103
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
|
+
}
|
|
104
146
|
};
|
|
105
147
|
export {
|
|
106
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", "import { 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
|
|
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": ";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;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,EACV,YAAY,QAAgB;AAC1B,SAAK,SAAS,IAAI,WAAW,MAAM;AAAA,EACrC;AAAA,EACA,cAAc,OAAe;AAC3B,SAAK,OAAO,KAAK,SAAS,IAAI,QAAQ;AACtC,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,IAAK;AAC9C,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,KAAM;AAC/C,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,KAAM;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAe;AAC3B,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,KAAM;AAC/C,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,KAAM;AAC/C,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,IAAK;AAC9C,SAAK,OAAO,KAAK,SAAS,IAAI,QAAQ;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAe;AAC3B,SAAK,OAAO,KAAK,SAAS,IAAI,QAAQ;AACtC,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,IAAK;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAe;AAC3B,SAAK,OAAO,KAAK,SAAS,IAAK,UAAU,IAAK;AAC9C,SAAK,OAAO,KAAK,SAAS,IAAI,QAAQ;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,OAAe;AACxB,SAAK,OAAO,KAAK,SAAS,IAAI,QAAQ;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,KAAa;AACvB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,WAAK,OAAO,KAAK,SAAS,IAAI,IAAI,WAAW,CAAC;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AACF;;;ACpDA,SAAS,cAAc;AAEvB,IAAqB,aAArB,MAAgC;AAAA,EAC9B,OAAiB,CAAC;AAAA,EAClB,QAAkB,CAAC;AAAA,EACnB,OAAiB,CAAC;AAAA,EAElB,eAAe;AACb,UAAM,UAAU,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE,IAAI,UAAU;AACjE,WAAO,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,GAAG,CAAC;AAAA,EACnD;AAAA,EAEA,eAAe;AACb,UAAM,UAAU,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE,IAAI,UAAU;AACjE,UAAM,SAAS,IAAI;AAAA,MACjB,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,GAAG,CAAC;AAAA,IAC5C;AACA,UAAM,aAAa,CAAC,UAA+B,SAAiB;AAElE,iBAAW,CAAC,IAAI,KAAK,KAAK,SAAS,QAAQ,GAAG;AAC5C,YAAI,QAAQ,GAAG;AACb,gBAAM,IAAI,MAAM,mBAAmB,IAAI;AAAA,QACzC;AACA,cAAM,QAAS,KAAK,YAAc,QAAQ,KAAQ,QAAQ,KAAM;AAChE,eAAO,cAAc,KAAK;AAAA,MAC5B;AAAA,IACF;AACA,YAAQ,QAAQ,UAAU;AAC1B,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,kBAAkB;AAChB,WAAO,OAAO,eAAe,KAAK,aAAa,GAAG,IAAI;AAAA,EACxD;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEA,eAAe,KAAiB;AAC9B,aAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG;AAC1C,YAAM,QACJ,IAAI,CAAC,IAAK,IAAI,IAAI,CAAC,KAAK,IAAM,IAAI,IAAI,CAAC,KAAK,KAAO,IAAI,IAAI,CAAC,KAAK;AACnE,YAAM,KAAK,QAAQ;AACnB,YAAM,OAAQ,UAAU,KAAM;AAC9B,YAAM,SAAU,UAAU,KAAM,KAAO;AACvC,YAAM,QAAQ,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE,IAAI;AACrD,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,eAAe,KAAiB;AACrC,WAAO,IAAI,WAAW,EAAE,eAAe,GAAG;AAAA,EAC5C;AAAA,EAEA,kBAAkB,KAAa;AAC7B,WAAO,KAAK,eAAe,OAAO,aAAa,GAAG,CAAC;AAAA,EACrD;AAAA,EAEA,OAAO,kBAAkB,KAAa;AACpC,WAAO,IAAI,WAAW,EAAE,kBAAkB,GAAG;AAAA,EAC/C;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG,KAAK,KAAK,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AAAA,MACtC;AAAA,MACA,GAAG,KAAK,MAAM,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AAAA,MACvC;AAAA,MACA,GAAG,KAAK,KAAK,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AAAA,IACxC,EAAE,KAAK,IAAI;AAAA,EACb;AAAA,EAEA,cAAc,KAAa;AACzB,UAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAI,UAAU,KAAK;AACnB,eAAW,SAAS,OAAO;AACzB,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,SAAS,SAAS;AACpB,kBAAU,KAAK;AAAA,MACjB;AACA,UAAI,SAAS,UAAU;AACrB,kBAAU,KAAK;AAAA,MACjB;AACA,UAAI,SAAS,SAAS;AACpB,kBAAU,KAAK;AAAA,MACjB;AACA,UAAI,KAAK,MAAM,OAAO,GAAG;AACvB,gBAAQ,KAAK,SAAS,MAAM,EAAE,CAAC;AAAA,MACjC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,cAAc,KAAa;AAChC,WAAO,IAAI,WAAW,EAAE,cAAc,GAAG;AAAA,EAC3C;AAAA,EAEA,sBAAsB;AACpB,UAAM,QAAQ,CAAC,GAAG,KAAK,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,IAAI;AACxD,UAAM,SAAS,IAAI,aAAa,MAAM,SAAS,IAAI,CAAC,EACjD,cAAc,KAAK,KAAK,SAAS,KAAK,MAAM,MAAM,EAClD,cAAc,KAAK,KAAK,MAAM;AACjC,UAAM,QAAQ,CAAC,OAAO,OAAO,cAAc,EAAE,CAAC;AAC9C,WAAO,OAAO;AAAA,EAChB;AACF;",
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { countItems } from './src/utils';
|
|
1
|
+
import { BufferWriter, countItems } from './src/utils';
|
|
2
2
|
import { Base64 } from 'js-base64';
|
|
3
3
|
|
|
4
4
|
export default class YGOProDeck {
|
|
@@ -13,14 +13,9 @@ export default class YGOProDeck {
|
|
|
13
13
|
|
|
14
14
|
toUint8Array() {
|
|
15
15
|
const counted = [this.main, this.extra, this.side].map(countItems);
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
buf[pointer++] = value & 0xff;
|
|
20
|
-
buf[pointer++] = (value >> 8) & 0xff;
|
|
21
|
-
buf[pointer++] = (value >> 16) & 0xff;
|
|
22
|
-
buf[pointer++] = (value >> 24) & 0xff;
|
|
23
|
-
};
|
|
16
|
+
const writer = new BufferWriter(
|
|
17
|
+
counted.reduce((a, b) => a + b.size * 4, 0),
|
|
18
|
+
);
|
|
24
19
|
const writeCards = (countMap: Map<number, number>, type: number) => {
|
|
25
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)
|
|
26
21
|
for (const [id, count] of countMap.entries()) {
|
|
@@ -28,11 +23,11 @@ export default class YGOProDeck {
|
|
|
28
23
|
throw new Error(`Too many cards: ${id}`);
|
|
29
24
|
}
|
|
30
25
|
const value = (id & 0xfffffff) | (type << 28) | ((count - 1) << 30);
|
|
31
|
-
writeUint32LE(value);
|
|
26
|
+
writer.writeUint32LE(value);
|
|
32
27
|
}
|
|
33
28
|
};
|
|
34
29
|
counted.forEach(writeCards);
|
|
35
|
-
return
|
|
30
|
+
return writer.buffer;
|
|
36
31
|
}
|
|
37
32
|
|
|
38
33
|
toEncodedString() {
|
|
@@ -48,8 +43,8 @@ export default class YGOProDeck {
|
|
|
48
43
|
const value =
|
|
49
44
|
buf[i] | (buf[i + 1] << 8) | (buf[i + 2] << 16) | (buf[i + 3] << 24);
|
|
50
45
|
const id = value & 0xfffffff;
|
|
51
|
-
const type = (value
|
|
52
|
-
const count = ((value
|
|
46
|
+
const type = (value >>> 28) & 0x3;
|
|
47
|
+
const count = ((value >>> 30) & 0x3) + 1;
|
|
53
48
|
const cards = [this.main, this.extra, this.side][type];
|
|
54
49
|
for (let j = 0; j < count; j++) {
|
|
55
50
|
cards.push(id);
|
|
@@ -66,7 +61,7 @@ export default class YGOProDeck {
|
|
|
66
61
|
return this.fromUint8Array(Base64.toUint8Array(str));
|
|
67
62
|
}
|
|
68
63
|
|
|
69
|
-
static fromEncodedString(str: string) {
|
|
64
|
+
static fromEncodedString(str: string) {
|
|
70
65
|
return new YGOProDeck().fromEncodedString(str);
|
|
71
66
|
}
|
|
72
67
|
|
|
@@ -106,4 +101,13 @@ export default class YGOProDeck {
|
|
|
106
101
|
static fromYdkString(str: string) {
|
|
107
102
|
return new YGOProDeck().fromYdkString(str);
|
|
108
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
|
+
}
|
|
109
113
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ygopro-deck-encode",
|
|
3
3
|
"description": "YGOPro Deck encode and decode, with well-browser support.",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.4",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
},
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
19
|
-
"url": "https://code.mycard.moe/
|
|
19
|
+
"url": "https://code.mycard.moe/mycard/ygopro-deck-encode.git"
|
|
20
20
|
},
|
|
21
21
|
"author": "Nanahira <nanahira@momobako.com>",
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"keywords": [],
|
|
24
24
|
"bugs": {
|
|
25
|
-
"url": "https://code.mycard.moe/
|
|
25
|
+
"url": "https://code.mycard.moe/mycard/ygopro-deck-encode/issues"
|
|
26
26
|
},
|
|
27
|
-
"homepage": "https://code.mycard.moe/
|
|
27
|
+
"homepage": "https://code.mycard.moe/mycard/ygopro-deck-encode",
|
|
28
28
|
"jest": {
|
|
29
29
|
"moduleFileExtensions": [
|
|
30
30
|
"js",
|