koishipro-core.js 1.2.2 → 1.2.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 +27 -40
- package/dist/index.cjs.map +3 -3
- package/dist/index.mjs +31 -39
- package/dist/index.mjs.map +3 -3
- package/dist/src/ocgcore-duel.d.ts +1 -0
- package/dist/src/play-yrp.d.ts +0 -6
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -50,7 +50,6 @@ __export(index_exports, {
|
|
|
50
50
|
ZipReader: () => ZipReader,
|
|
51
51
|
ZipScriptReader: () => ZipScriptReader,
|
|
52
52
|
_OcgcoreConstants: () => vendor_exports,
|
|
53
|
-
consumeResponseFromOcgcoreProcess: () => consumeResponseFromOcgcoreProcess,
|
|
54
53
|
createDuelFromYrp: () => createDuelFromYrp,
|
|
55
54
|
createOcgcoreWrapper: () => createOcgcoreWrapper,
|
|
56
55
|
createSqljsCardReader: () => createSqljsCardReader,
|
|
@@ -62,7 +61,6 @@ __export(index_exports, {
|
|
|
62
61
|
parseRegistryKeys: () => parseRegistryKeys,
|
|
63
62
|
playYrp: () => playYrp,
|
|
64
63
|
playYrpStep: () => playYrpStep,
|
|
65
|
-
processYrpDuelStep: () => processYrpDuelStep,
|
|
66
64
|
testCard: () => testCard
|
|
67
65
|
});
|
|
68
66
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -261,6 +259,22 @@ var OcgcoreDuel = class {
|
|
|
261
259
|
message: parsedMessage
|
|
262
260
|
};
|
|
263
261
|
}
|
|
262
|
+
*advance(advancor) {
|
|
263
|
+
while (true) {
|
|
264
|
+
const res = this.process();
|
|
265
|
+
yield res;
|
|
266
|
+
if (res.status === 2 || res.message instanceof import_ygopro_msg_encode3.YGOProMsgRetry) {
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
if (res.status === 1 && res.raw.length > 0) {
|
|
270
|
+
const response = advancor?.();
|
|
271
|
+
if (!response) {
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
this.setResponse(response);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
264
278
|
newCard(card) {
|
|
265
279
|
this.ocgcoreWrapper.ocgcoreModule._new_card(
|
|
266
280
|
this.duelPtr,
|
|
@@ -1191,6 +1205,7 @@ async function DirCardReader(sqljs, ...baseDirs) {
|
|
|
1191
1205
|
|
|
1192
1206
|
// src/play-yrp.ts
|
|
1193
1207
|
var import_ygopro_yrp_encode = require("ygopro-yrp-encode");
|
|
1208
|
+
var import_ygopro_msg_encode5 = require("ygopro-msg-encode");
|
|
1194
1209
|
var { LOCATION_DECK, LOCATION_EXTRA, POS_FACEDOWN_DEFENSE } = import_ygopro_msg_encode.OcgcoreScriptConstants;
|
|
1195
1210
|
function normalizeYrp(input) {
|
|
1196
1211
|
if (input instanceof import_ygopro_yrp_encode.YGOProYrp) {
|
|
@@ -1290,45 +1305,19 @@ function createDuelFromYrp(wrapper, yrpInput) {
|
|
|
1290
1305
|
duel.startDuel(yrp.opt >>> 0);
|
|
1291
1306
|
return { yrp, duel };
|
|
1292
1307
|
}
|
|
1293
|
-
function consumeResponseFromOcgcoreProcess(duel, result, responses) {
|
|
1294
|
-
if (result.raw.length > 0 && result.raw[0] === import_ygopro_msg_encode.OcgcoreCommonConstants.MSG_RETRY) {
|
|
1295
|
-
throw new Error("Got MSG_RETRY");
|
|
1296
|
-
}
|
|
1297
|
-
if (result.status === 0) {
|
|
1298
|
-
return false;
|
|
1299
|
-
}
|
|
1300
|
-
if (result.status === 1) {
|
|
1301
|
-
if (result.raw.length === 0) {
|
|
1302
|
-
return false;
|
|
1303
|
-
}
|
|
1304
|
-
const response = responses.shift();
|
|
1305
|
-
if (!response) {
|
|
1306
|
-
return true;
|
|
1307
|
-
}
|
|
1308
|
-
duel.setResponse(response);
|
|
1309
|
-
return false;
|
|
1310
|
-
}
|
|
1311
|
-
return true;
|
|
1312
|
-
}
|
|
1313
|
-
function* processYrpDuelStep(duel, yrp) {
|
|
1314
|
-
const responses = yrp.responses.slice();
|
|
1315
|
-
while (true) {
|
|
1316
|
-
const result = duel.process();
|
|
1317
|
-
yield {
|
|
1318
|
-
duel,
|
|
1319
|
-
result,
|
|
1320
|
-
responses
|
|
1321
|
-
};
|
|
1322
|
-
if (consumeResponseFromOcgcoreProcess(duel, result, responses)) {
|
|
1323
|
-
break;
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
1308
|
function* playYrpStep(ocgcoreWrapper, yrpInput) {
|
|
1328
1309
|
const { yrp, duel } = createDuelFromYrp(ocgcoreWrapper, yrpInput);
|
|
1310
|
+
const responses = yrp.responses.slice();
|
|
1329
1311
|
try {
|
|
1330
|
-
for (const
|
|
1331
|
-
yield
|
|
1312
|
+
for (const result of duel.advance(() => responses.shift())) {
|
|
1313
|
+
yield {
|
|
1314
|
+
duel,
|
|
1315
|
+
result,
|
|
1316
|
+
responses
|
|
1317
|
+
};
|
|
1318
|
+
if (result.message instanceof import_ygopro_msg_encode5.YGOProMsgRetry) {
|
|
1319
|
+
throw new Error("Got MSG_RETRY");
|
|
1320
|
+
}
|
|
1332
1321
|
}
|
|
1333
1322
|
} finally {
|
|
1334
1323
|
duel.endDuel();
|
|
@@ -1412,7 +1401,6 @@ if (typeof globalThis !== "undefined" && !globalThis.Buffer) {
|
|
|
1412
1401
|
ZipReader,
|
|
1413
1402
|
ZipScriptReader,
|
|
1414
1403
|
_OcgcoreConstants,
|
|
1415
|
-
consumeResponseFromOcgcoreProcess,
|
|
1416
1404
|
createDuelFromYrp,
|
|
1417
1405
|
createOcgcoreWrapper,
|
|
1418
1406
|
createSqljsCardReader,
|
|
@@ -1424,7 +1412,6 @@ if (typeof globalThis !== "undefined" && !globalThis.Buffer) {
|
|
|
1424
1412
|
parseRegistryKeys,
|
|
1425
1413
|
playYrp,
|
|
1426
1414
|
playYrpStep,
|
|
1427
|
-
processYrpDuelStep,
|
|
1428
1415
|
testCard
|
|
1429
1416
|
});
|
|
1430
1417
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../index.ts", "../src/vendor/index.ts", "../src/constants/ocgcore.ts", "../src/utility/binary.ts", "../src/utility/utf8.ts", "../src/adapters/ocgcore-parsers.ts", "../src/adapters/start-duel.ts", "../src/ocgcore-duel.ts", "../src/ocgcore-wrapper.ts", "../src/types/ocgcore-enums.ts", "../src/ocgcore-wrapper-utils.ts", "../src/utility/load-node-module.ts", "../src/utility/node-fs.ts", "../src/utility/node-path.ts", "../src/load-ocgcore-factory.cjs.ts", "../src/create-ocgcore-wrapper.ts", "../src/script-reader/script-readers.ts", "../src/utility/search-zips.ts", "../src/script-reader/dir-script-reader-ex.ts", "../src/card-reader/sqljs-card-reader.ts", "../src/card-reader/dir-card-reader.ts", "../src/play-yrp.ts", "../src/test-card.ts"],
|
|
4
|
-
"sourcesContent": ["import { Buffer } from 'buffer';\n\nif (\n typeof globalThis !== 'undefined' &&\n !(globalThis as { Buffer?: unknown }).Buffer\n) {\n (globalThis as { Buffer?: unknown }).Buffer = Buffer;\n}\n\nexport * from './src/ocgcore-wrapper';\nexport * from './src/ocgcore-duel';\nexport * from './src/create-ocgcore-wrapper';\nexport * from './src/types';\nexport * from './src/adapters';\nexport * from './src/constants';\n// export * from './src/utility';\nexport * as _OcgcoreConstants from './src/vendor';\nexport * from './src/script-reader';\nexport * from './src/card-reader';\nexport * from './src/play-yrp';\nexport * from './src/test-card';\n", "export {\n OcgcoreCommonConstants,\n OcgcoreScriptConstants,\n} from 'ygopro-msg-encode';\n", "import { OcgcoreCommonConstants } from '../vendor';\n\nexport const MESSAGE_BUFFER_SIZE = OcgcoreCommonConstants.SIZE_MESSAGE_BUFFER;\nexport const QUERY_BUFFER_SIZE = 0x4000;\nexport const REGISTRY_BUFFER_SIZE = 0x2000;\n\nexport const LEN_FAIL = 0;\nexport const LEN_EMPTY = 4;\nexport const LEN_HEADER = 8;\n", "export function readU8(buf: Uint8Array, offset: number): number {\n return buf[offset] ?? 0;\n}\n\nexport function readU16(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint16(\n offset,\n true,\n );\n}\n\nexport function readI32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getInt32(\n offset,\n true,\n );\n}\n\nexport function readU32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint32(\n offset,\n true,\n );\n}\n", "const encoder = new TextEncoder();\nconst decoder = new TextDecoder('utf-8');\n\nexport function encodeUtf8(value: string): Uint8Array {\n return encoder.encode(value);\n}\n\nexport function decodeUtf8(value: Uint8Array): string {\n return decoder.decode(value);\n}\n", "import { LEN_HEADER } from '../constants';\nimport { readI32, readU16 } from '../utility/binary';\nimport { decodeUtf8 } from '../utility/utf8';\nimport { CardQuery, YGOProMsgReloadField } from 'ygopro-msg-encode';\n\n// Internal interface for registry parsing\ninterface RegistryDumpEntry {\n key: string;\n value: Uint8Array;\n valueText?: string;\n}\n\nexport function parseCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery | null {\n if (length <= LEN_HEADER) {\n return null;\n }\n const payload = raw.subarray(4, length);\n return new CardQuery().fromPayload(payload);\n}\n\nexport function parseFieldCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery[] {\n const cards: CardQuery[] = [];\n let offset = 0;\n while (offset + 4 <= length) {\n const chunkLen = readI32(raw, offset);\n if (chunkLen <= 0) {\n break;\n }\n const end = Math.min(length, offset + chunkLen);\n if (chunkLen <= LEN_HEADER) {\n const emptyCard = new CardQuery();\n emptyCard.flags = 0;\n emptyCard.empty = true;\n cards.push(emptyCard);\n } else {\n const payload = raw.subarray(offset + 4, end);\n cards.push(new CardQuery().fromPayload(payload));\n }\n offset += chunkLen;\n }\n return cards;\n}\n\nexport function parseFieldInfo(raw: Uint8Array): YGOProMsgReloadField {\n // query_field_info() in ocgcore returns data that starts with MSG_RELOAD_FIELD (162) byte\n // Format: [MSG_RELOAD_FIELD][duel_rule][player0_data][player1_data][chains]\n // YGOProMsgReloadField.fromPayload() expects the full message including the identifier\n return new YGOProMsgReloadField().fromPayload(raw);\n}\n\nexport function parseRegistryKeys(raw: Uint8Array): string[] {\n const keys: string[] = [];\n let offset = 0;\n while (offset + 2 <= raw.length) {\n const len = readU16(raw, offset);\n offset += 2;\n if (offset + len > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + len);\n offset += len;\n keys.push(decodeUtf8(keyBytes));\n }\n return keys;\n}\n\nexport function parseRegistryDump(raw: Uint8Array): RegistryDumpEntry[] {\n const entries: RegistryDumpEntry[] = [];\n let offset = 0;\n while (offset + 4 <= raw.length) {\n const keyLen = readU16(raw, offset);\n const valLen = readU16(raw, offset + 2);\n offset += 4;\n if (offset + keyLen + valLen > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + keyLen);\n offset += keyLen;\n const valueBytes = raw.subarray(offset, offset + valLen);\n offset += valLen;\n const entry: RegistryDumpEntry = {\n key: decodeUtf8(keyBytes),\n value: valueBytes,\n };\n entry.valueText = decodeUtf8(valueBytes);\n entries.push(entry);\n }\n return entries;\n}\n", "import { OcgcoreStartDuelOptions } from '../types/ocgcore-params';\n\nexport function normalizeStartDuelOptions(\n options: number | OcgcoreStartDuelOptions,\n): number {\n if (typeof options === 'number') {\n return options;\n }\n const duelRule = options.rule ?? 0;\n let duelOptions = options.options ?? 0;\n if (options.flags?.length) {\n for (const flag of options.flags) {\n duelOptions = (duelOptions | flag) >>> 0;\n }\n }\n return (((duelRule & 0xffff) << 16) | (duelOptions & 0xffff)) >>> 0;\n}\n", "import {\n OcgcoreCardQueryResult,\n OcgcoreFieldCardQueryResult,\n OcgcoreFieldInfoResult,\n OcgcoreMessageResult,\n OcgcoreProcessResult,\n OcgcoreRegistryDumpResult,\n OcgcoreRegistryKeysResult,\n OcgcoreRegistryValueResult,\n} from './types/ocgcore-results';\nimport {\n OcgcoreNewCardParams,\n OcgcoreNewTagCardParams,\n OcgcoreQueryCardParams,\n OcgcoreQueryFieldCardParams,\n OcgcoreQueryFieldCountParams,\n OcgcoreSetPlayerInfoParams,\n OcgcoreStartDuelOptions,\n} from './types/ocgcore-params';\nimport {\n MESSAGE_BUFFER_SIZE,\n QUERY_BUFFER_SIZE,\n REGISTRY_BUFFER_SIZE,\n LEN_HEADER,\n} from './constants';\nimport {\n parseCardQuery,\n parseFieldCardQuery,\n parseFieldInfo,\n parseRegistryDump,\n parseRegistryKeys,\n} from './adapters/ocgcore-parsers';\nimport { normalizeStartDuelOptions } from './adapters/start-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { decodeUtf8 } from './utility/utf8';\nimport { YGOProMessages, YGOProMsgBase } from 'ygopro-msg-encode';\n\nexport class OcgcoreDuel {\n private returnPtr = 0;\n private returnSize = 512;\n\n constructor(\n public ocgcoreWrapper: OcgcoreWrapper,\n public duelPtr: number,\n ) {}\n\n startDuel(options: number | OcgcoreStartDuelOptions): void {\n if (!this.returnPtr) {\n this.returnPtr = this.ocgcoreWrapper.malloc(this.returnSize);\n }\n const optionValue = normalizeStartDuelOptions(options);\n this.ocgcoreWrapper.ocgcoreModule._start_duel(this.duelPtr, optionValue);\n }\n\n ended = false;\n\n endDuel(): void {\n if (this.ended) return;\n this.ended = true;\n this.ocgcoreWrapper.ocgcoreModule._end_duel(this.duelPtr);\n if (this.returnPtr) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = 0;\n }\n this.ocgcoreWrapper.forgetDuel(this.duelPtr);\n }\n\n setPlayerInfo(info: OcgcoreSetPlayerInfoParams): void {\n this.ocgcoreWrapper.ocgcoreModule._set_player_info(\n this.duelPtr,\n info.player,\n info.lp,\n info.startHand,\n info.drawCount,\n );\n }\n\n _getLogMessage(bufPtr: number): number {\n return this.ocgcoreWrapper.ocgcoreModule._get_log_message(\n this.duelPtr,\n bufPtr,\n );\n }\n\n private getMessage(length: number): OcgcoreMessageResult {\n const ptr = this.ocgcoreWrapper.malloc(MESSAGE_BUFFER_SIZE);\n this.ocgcoreWrapper.ocgcoreModule._get_message(this.duelPtr, ptr);\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n return { length, raw };\n }\n\n process(): OcgcoreProcessResult {\n const result = this.ocgcoreWrapper.ocgcoreModule._process(this.duelPtr);\n const length = (result & 0x0fffffff) >>> 0;\n const status = ((result >>> 28) & 0x0f) >>> 0;\n const messageData = this.getMessage(length);\n\n // Parse message using YGOProMessages (only one message per process call)\n let parsedMessage: YGOProMsgBase | undefined;\n if (messageData.raw.length > 0) {\n try {\n parsedMessage = YGOProMessages.getInstanceFromPayload(messageData.raw);\n } catch (e) {\n // If parsing fails, parsedMessage remains undefined\n }\n }\n\n return {\n length: messageData.length,\n raw: messageData.raw,\n status,\n message: parsedMessage,\n };\n }\n\n newCard(card: OcgcoreNewCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.player,\n card.location,\n card.sequence,\n card.position,\n );\n }\n\n newTagCard(card: OcgcoreNewTagCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_tag_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.location,\n );\n }\n\n queryCard(query: OcgcoreQueryCardParams): OcgcoreCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_card(\n this.duelPtr,\n query.player,\n query.location,\n query.sequence,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const card = length <= LEN_HEADER ? null : parseCardQuery(raw, length);\n return { length, raw, card };\n }\n\n queryFieldCount(query: OcgcoreQueryFieldCountParams): number {\n return this.ocgcoreWrapper.ocgcoreModule._query_field_count(\n this.duelPtr,\n query.player,\n query.location,\n );\n }\n\n queryFieldCard(\n query: OcgcoreQueryFieldCardParams,\n ): OcgcoreFieldCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_card(\n this.duelPtr,\n query.player,\n query.location,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const cards = parseFieldCardQuery(raw, length);\n return { length, raw, cards };\n }\n\n queryFieldInfo(): OcgcoreFieldInfoResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_info(\n this.duelPtr,\n ptr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const field = parseFieldInfo(raw);\n return { length, raw, field };\n }\n\n setResponseInt(value: number): void {\n this.ocgcoreWrapper.ocgcoreModule._set_responsei(this.duelPtr, value);\n }\n\n setResponse(response: Uint8Array | number): void {\n if (typeof response === 'number') {\n this.setResponseInt(response);\n return;\n }\n if (response.length > this.returnSize) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = this.ocgcoreWrapper.malloc(response.length);\n this.returnSize = response.length;\n }\n this.ocgcoreWrapper.setHeap(this.returnPtr, response);\n this.ocgcoreWrapper.ocgcoreModule._set_responseb(\n this.duelPtr,\n this.returnPtr,\n );\n }\n\n preloadScript(scriptPath: string): void {\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._preload_script(this.duelPtr, ptr),\n scriptPath,\n );\n }\n\n getRegistryValue(key: string): OcgcoreRegistryValueResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.useTmpData(\n (keyPtr) =>\n this.ocgcoreWrapper.ocgcoreModule._get_registry_value(\n this.duelPtr,\n keyPtr,\n outPtr,\n ),\n key,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const value = raw;\n const text = length >= 0 ? decodeUtf8(raw) : undefined;\n return { length, raw, value, text };\n }\n\n setRegistryValue(key: string, value: string): void {\n this.ocgcoreWrapper.useTmpData(\n (keyPtr, valuePtr) =>\n this.ocgcoreWrapper.ocgcoreModule._set_registry_value(\n this.duelPtr,\n keyPtr,\n valuePtr,\n ),\n key,\n value,\n );\n }\n\n getRegistryKeys(): OcgcoreRegistryKeysResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._get_registry_keys(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const keys = length >= 0 ? parseRegistryKeys(raw) : [];\n return { length, raw, keys };\n }\n\n clearRegistry(): void {\n this.ocgcoreWrapper.ocgcoreModule._clear_registry(this.duelPtr);\n }\n\n dumpRegistry(): OcgcoreRegistryDumpResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._dump_registry(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n\n // Parse directly into dict\n const dict: Record<string, string> = {};\n if (length > 0) {\n const entries = parseRegistryDump(raw);\n for (const entry of entries) {\n if (entry.valueText !== undefined) {\n dict[entry.key] = entry.valueText;\n }\n }\n }\n\n return { length, raw, dict };\n }\n\n loadRegistry(input: Uint8Array | Record<string, string>): void {\n if (input instanceof Uint8Array) {\n // Load from binary format\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._load_registry(\n this.duelPtr,\n ptr,\n input.length,\n ),\n input,\n );\n } else {\n // Load from dict format\n for (const [key, value] of Object.entries(input)) {\n this.setRegistryValue(key, value);\n }\n }\n }\n}\n", "import { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { CardData } from 'ygopro-msg-encode';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\nimport { CardReader, MessageHandler, ScriptReader } from './types/callback';\n\nexport class OcgcoreWrapper {\n private scriptBufferPtr = 0;\n private scriptBufferSize = 0;\n private logBufferPtr = 0;\n private logBufferSize = 0;\n private tmpStringBufferPtr = 0;\n private tmpStringBufferSize = 0;\n\n private scriptReaderFunc = 0;\n private cardReaderFunc = 0;\n private messageHandlerFunc = 0;\n\n public scriptReaders: ScriptReader[] = [];\n public cardReaders: CardReader[] = [];\n public messageHandlers: MessageHandler[] = [];\n\n private heapU8: Uint8Array;\n private heapView: DataView;\n private encoder = new TextEncoder();\n private decoder = new TextDecoder('utf-8');\n private duels = new Map<number, OcgcoreDuel>();\n\n constructor(\n public ocgcoreModule: OcgcoreModule,\n options?: { scriptBufferSize?: number; logBufferSize?: number },\n ) {\n this.heapU8 = ocgcoreModule.HEAPU8 as Uint8Array;\n this.heapView = new DataView(this.heapU8.buffer);\n this.scriptBufferSize = options?.scriptBufferSize ?? 0x100000;\n this.logBufferSize = options?.logBufferSize ?? 1024;\n\n this.scriptReaderFunc = this.createFunction((scriptPtr, lenPtr) => {\n const scriptPath = this.getUTF8String(scriptPtr);\n const content = this.readScript(scriptPath);\n if (content == null) {\n return 0;\n }\n\n if (!this.scriptBufferPtr) {\n this.scriptBufferPtr = this.ocgcoreModule._malloc(\n this.scriptBufferSize,\n );\n }\n\n const bytes = content;\n if (bytes.length > this.scriptBufferSize) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = this.ocgcoreModule._malloc(bytes.length);\n this.scriptBufferSize = bytes.length;\n }\n\n this.heapU8.set(bytes, this.scriptBufferPtr);\n this.heapView.setInt32(lenPtr, bytes.length, true);\n return this.scriptBufferPtr;\n }, 'iii');\n this.ocgcoreModule._set_script_reader(this.scriptReaderFunc);\n\n this.cardReaderFunc = this.createFunction((cardId, cardDataPtr) => {\n const data = this.readCard(cardId);\n if (!data) {\n return 0;\n }\n\n const buf = new CardData().fromPartial(data).toPayload();\n this.heapU8.set(buf, cardDataPtr);\n return 0;\n }, 'iii');\n this.ocgcoreModule._set_card_reader(this.cardReaderFunc);\n\n this.messageHandlerFunc = this.createFunction((duelPtr, messageType) => {\n if (!this.logBufferPtr) {\n this.logBufferPtr = this.ocgcoreModule._malloc(this.logBufferSize);\n }\n this.ocgcoreModule._get_log_message(duelPtr, this.logBufferPtr);\n const message = this.getUTF8String(this.logBufferPtr);\n const type =\n messageType === 2\n ? OcgcoreMessageType.DebugMessage\n : OcgcoreMessageType.ScriptError;\n const duel = this.getOrCreateDuel(duelPtr);\n this.handleMessage(duel, message, type);\n }, 'iii');\n this.ocgcoreModule._set_message_handler(this.messageHandlerFunc);\n }\n\n readScript(scriptPath: string): Uint8Array | null {\n let content: string | Uint8Array | null | undefined;\n for (const reader of this.scriptReaders) {\n try {\n content = reader(scriptPath);\n } catch {\n content = null;\n }\n if (content != null) {\n break;\n }\n }\n return typeof content === 'string'\n ? this.encoder.encode(content)\n : (content ?? null);\n }\n\n readCard(cardId: number): Partial<CardData> | null {\n let data: Partial<CardData> | null | undefined;\n for (const reader of this.cardReaders) {\n try {\n data = reader(cardId);\n } catch {\n data = null;\n }\n if (data) {\n break;\n }\n }\n return data ?? null;\n }\n\n handleMessage(\n duel: OcgcoreDuel,\n message: string,\n type: OcgcoreMessageType,\n ): void {\n for (const handler of this.messageHandlers) {\n try {\n handler(duel, message, type);\n } catch {\n // ignore handler errors\n }\n }\n }\n\n getUTF8String(ptr: number): string {\n let length = 0;\n while (this.heapU8[ptr + length] !== 0) {\n length++;\n }\n return this.decoder.decode(this.heapU8.subarray(ptr, ptr + length));\n }\n\n setHeap(ptr: number, data: Uint8Array): void {\n this.heapU8.set(data, ptr);\n }\n\n copyHeap(ptr: number, length: number): Uint8Array {\n return this.heapU8.slice(ptr, ptr + length);\n }\n\n useTmpData<R>(\n cb: (...args: number[]) => R,\n ...args: Array<string | Uint8Array>\n ): R {\n const encoded = args.map((item) =>\n typeof item === 'string' ? this.encoder.encode(item) : item,\n );\n const totalLength = encoded.reduce(\n (acc, bytes) => acc + bytes.length + 1,\n 0,\n );\n if (totalLength > this.tmpStringBufferSize) {\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n }\n this.tmpStringBufferPtr = this.ocgcoreModule._malloc(totalLength);\n this.tmpStringBufferSize = totalLength;\n }\n\n let offset = 0;\n const ptrs = encoded.map((bytes) => {\n const ptr = this.tmpStringBufferPtr + offset;\n this.heapU8.set(bytes, ptr);\n this.heapU8[ptr + bytes.length] = 0;\n offset += bytes.length + 1;\n return ptr;\n });\n\n return cb(...ptrs);\n }\n\n private createFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n addFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n removeFunction(index: number): void {\n this.ocgcoreModule.removeFunction(index);\n }\n\n createDuel(seed: number): OcgcoreDuel {\n const duelPtr = this.ocgcoreModule._create_duel(seed);\n return this.getOrCreateDuel(duelPtr);\n }\n\n createDuelV2(seedSequence: number[]): OcgcoreDuel {\n const count = seedSequence.length;\n const byteLength = count * 4;\n const ptr = this.ocgcoreModule._malloc(byteLength);\n const view = new Uint32Array(this.heapU8.buffer, ptr, count);\n for (let i = 0; i < count; i++) {\n view[i] = seedSequence[i] >>> 0;\n }\n const duelPtr = this.ocgcoreModule._create_duel_v2(ptr);\n this.ocgcoreModule._free(ptr);\n return this.getOrCreateDuel(duelPtr);\n }\n\n _defaultScriptReader(namePtr: number, dataPtr: number): number {\n return this.ocgcoreModule._default_script_reader(namePtr, dataPtr);\n }\n\n malloc(size: number): number {\n return this.ocgcoreModule._malloc(size);\n }\n\n free(ptr: number): void {\n this.ocgcoreModule._free(ptr);\n }\n\n _stdioExit(): void {\n this.ocgcoreModule.___stdio_exit();\n }\n\n setScriptReader(reader: ScriptReader, reset = false): this {\n if (reset) {\n this.scriptReaders = [];\n }\n this.scriptReaders.push(reader);\n return this;\n }\n\n setCardReader(reader: CardReader, reset = false): this {\n if (reset) {\n this.cardReaders = [];\n }\n this.cardReaders.push(reader);\n return this;\n }\n\n setMessageHandler(handler: MessageHandler, reset = false): this {\n if (reset) {\n this.messageHandlers = [];\n }\n this.messageHandlers.push(handler);\n return this;\n }\n\n getOrCreateDuel(duelPtr: number): OcgcoreDuel {\n const existing = this.duels.get(duelPtr);\n if (existing) {\n return existing;\n }\n const duel = new OcgcoreDuel(this, duelPtr);\n this.duels.set(duelPtr, duel);\n return duel;\n }\n\n forgetDuel(duelPtr: number): void {\n this.duels.delete(duelPtr);\n }\n\n finalize(): void {\n if (this.scriptReaderFunc) {\n this.ocgcoreModule.removeFunction(this.scriptReaderFunc);\n this.scriptReaderFunc = 0;\n }\n if (this.cardReaderFunc) {\n this.ocgcoreModule.removeFunction(this.cardReaderFunc);\n this.cardReaderFunc = 0;\n }\n if (this.messageHandlerFunc) {\n this.ocgcoreModule.removeFunction(this.messageHandlerFunc);\n this.messageHandlerFunc = 0;\n }\n\n if (this.scriptBufferPtr) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = 0;\n this.scriptBufferSize = 0;\n }\n if (this.logBufferPtr) {\n this.ocgcoreModule._free(this.logBufferPtr);\n this.logBufferPtr = 0;\n this.logBufferSize = 0;\n }\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n this.tmpStringBufferPtr = 0;\n this.tmpStringBufferSize = 0;\n }\n }\n}\n", "export enum OcgcoreMessageType {\n ScriptError = 'ScriptError',\n DebugMessage = 'DebugMessage',\n}\n\nexport enum OcgcoreDuelRule {\n Rule1 = 1,\n Rule2 = 2,\n MasterRule3 = 3,\n NewMasterRule = 4,\n MasterRule2020 = 5,\n}\n\nexport enum OcgcoreDuelOptionFlag {\n TestMode = 0x01,\n AttackFirstTurn = 0x02,\n ObsoleteRuling = 0x08,\n PseudoShuffle = 0x10,\n TagMode = 0x20,\n SimpleAI = 0x40,\n ReturnDeckTop = 0x80,\n RevealDeckSeq = 0x100,\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\n\ntype OcgcoreFactoryModule = { default?: OcgcoreFactory } | OcgcoreFactory;\n\nexport function normalizeOcgcoreFactory(mod: unknown): OcgcoreFactory {\n const typed = mod as OcgcoreFactoryModule;\n if (typeof typed === 'function') {\n return typed as OcgcoreFactory;\n }\n if (typed && typeof (typed as { default?: unknown }).default === 'function') {\n return (typed as { default: OcgcoreFactory }).default;\n }\n throw new Error('Invalid ocgcore factory module');\n}\n", "export function loadNodeModule<T>(id: string, altId?: string): T | null {\n const req =\n typeof module.require !== 'undefined' ? module.require : undefined;\n if (!req) {\n return null;\n }\n try {\n return req(id) as T;\n } catch {\n if (!altId) return null;\n try {\n return req(altId) as T;\n } catch {\n return null;\n }\n }\n}\n", "type NodeStats = {\n isFile: () => boolean;\n};\n\ntype NodeFsPromises = {\n readFile: (path: string) => Promise<Uint8Array>;\n readdir: (path: string) => Promise<string[]>;\n stat: (path: string) => Promise<NodeStats>;\n access: (path: string) => Promise<void>;\n};\n\nexport type NodeFs = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string) => Uint8Array;\n promises: NodeFsPromises;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodeFs(noThrow = false): NodeFs | null {\n const mod = loadNodeModule<NodeFs>('node:fs', 'fs');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js fs module is not available.');\n}\n", "export type NodePath = {\n join: (...parts: string[]) => string;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodePath(noThrow = false): NodePath | null {\n const mod = loadNodeModule<NodePath>('node:path', 'path');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js path module is not available.');\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\nimport { normalizeOcgcoreFactory } from './ocgcore-wrapper-utils';\nimport { getNodeFs } from './utility/node-fs';\nimport { getNodePath } from './utility/node-path';\n\nexport async function loadOcgcoreFactory(): Promise<OcgcoreFactory> {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require('./vendor/wasm_cjs/libocgcore.cjs') as unknown;\n const baseFactory = normalizeOcgcoreFactory(mod);\n\n const fs = getNodeFs(true);\n if (!fs) {\n return baseFactory;\n }\n\n const pathMod = getNodePath(true);\n if (!pathMod) {\n return baseFactory;\n }\n let defaultWasmBinary: Uint8Array | null = null;\n const wasmPath = pathMod.join(\n __dirname,\n 'vendor',\n 'wasm_cjs',\n 'libocgcore.wasm',\n );\n if (fs.existsSync(wasmPath)) {\n defaultWasmBinary = fs.readFileSync(wasmPath);\n }\n\n if (!defaultWasmBinary) {\n return baseFactory;\n }\n\n return async (overrides) => {\n if (!overrides?.wasmBinary && !overrides?.locateFile) {\n return baseFactory({\n ...overrides,\n wasmBinary: defaultWasmBinary.buffer as ArrayBuffer,\n });\n }\n return baseFactory(overrides);\n };\n}\n", "import type { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { loadOcgcoreFactory } from './load-ocgcore-factory';\n\nexport interface CreateOcgcoreWrapperOptions {\n moduleOverrides?: Partial<OcgcoreModule>;\n wasmBinary?: Uint8Array;\n locateFile?: (path: string, prefix?: string) => string;\n}\n\nexport async function createOcgcoreWrapper(\n options: CreateOcgcoreWrapperOptions = {},\n): Promise<OcgcoreWrapper> {\n const factory = await loadOcgcoreFactory();\n const overrides: Partial<OcgcoreModule> = {\n ...options.moduleOverrides,\n };\n if (options.wasmBinary) {\n overrides.wasmBinary =\n options.wasmBinary as unknown as OcgcoreModule['wasmBinary'];\n }\n if (options.locateFile) {\n overrides.locateFile =\n options.locateFile as unknown as OcgcoreModule['locateFile'];\n }\n const moduleInstance = await factory(overrides);\n return new OcgcoreWrapper(moduleInstance);\n}\n", "import JSZip from 'jszip';\n\nimport { ScriptReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\n\nconst SCRIPT_PREFIX = './script/';\n\nfunction normalizePath(input: string): string {\n let path = input.replace(/\\\\/g, '/');\n if (path.startsWith(SCRIPT_PREFIX)) {\n path = path.slice(SCRIPT_PREFIX.length);\n }\n return path;\n}\n\nfunction buildCandidates(filename: string): string[] {\n const entries = [\n filename,\n `specials/${filename}`,\n `expansions/script/${filename}`,\n `script/${filename}`,\n ];\n const candidates: string[] = [];\n for (const entry of entries) {\n candidates.push(entry);\n if (!entry.startsWith('./')) {\n const dotEntry = entry.startsWith('/')\n ? `./${entry.slice(1)}`\n : `./${entry}`;\n candidates.push(dotEntry);\n }\n }\n return candidates;\n}\n\nfunction joinPath(baseDir: string, relativePath: string): string {\n const pathMod = getNodePath();\n if (pathMod) {\n return pathMod.join(baseDir, relativePath);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = relativePath.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nexport function MapScriptReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const candidate of candidates) {\n for (const map of maps) {\n if (map.has(candidate)) {\n return map.get(candidate) ?? null;\n }\n }\n }\n return null;\n };\n}\n\nexport function DirScriptReader(...baseDirs: string[]): ScriptReader {\n const fs = getNodeFs();\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const baseDir of baseDirs) {\n for (const candidate of candidates) {\n const normalized = candidate.startsWith('/')\n ? candidate.slice(1)\n : candidate;\n const fullPath = joinPath(baseDir, normalized);\n if (fs.existsSync(fullPath)) {\n return fs.readFileSync(fullPath);\n }\n }\n }\n return null;\n };\n}\n\nfunction normalizeZipEntryName(name: string): string[] {\n const normalized = name.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n const names = new Set<string>();\n names.add(normalized);\n if (normalized.startsWith('script/')) {\n names.add(normalized.slice('script/'.length));\n }\n return Array.from(names);\n}\n\nexport async function ZipScriptReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n const maps = await Promise.all(\n inputs.map(async (data) => {\n const zip = await JSZip.loadAsync(data);\n const map = new Map<string, string | Uint8Array>();\n const entries = Object.values(zip.files);\n await Promise.all(\n entries.map(async (entry) => {\n if (entry.dir) {\n return;\n }\n if (!entry.name.toLowerCase().endsWith('.lua')) {\n return;\n }\n const content = await entry.async('uint8array');\n for (const name of normalizeZipEntryName(entry.name)) {\n map.set(name, content);\n }\n }),\n );\n return map;\n }),\n );\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use MapScriptReader instead. */\nexport function MapReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use DirScriptReader instead. */\nexport function DirReader(...baseDirs: string[]): ScriptReader {\n return DirScriptReader(...baseDirs);\n}\n\n/** @deprecated Use ZipScriptReader instead. */\nexport async function ZipReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n return ZipScriptReader(...inputs);\n}\n", "import { getNodeFs } from './node-fs';\nimport { getNodePath } from './node-path';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function searchZips(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const results: string[] = [];\n const rootEntries = await safeReadDir(fs, baseDir);\n for (const entry of rootEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, baseDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n const expansionEntries = await safeReadDir(fs, expansionsDir);\n for (const entry of expansionEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, expansionsDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n return results;\n}\n", "import type { ScriptReader } from '../types/callback';\nimport { DirScriptReader, ZipScriptReader } from './script-readers';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nexport async function DirScriptReaderEx(\n ...baseDirs: string[]\n): Promise<ScriptReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirScriptReaderEx');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirScriptReaderEx');\n const fsReader = DirScriptReader(...baseDirs);\n\n const zipInputs: Uint8Array[] = [];\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n zipInputs.push(await fs.promises.readFile(zipPath));\n } catch {\n continue;\n }\n }\n }\n\n if (zipInputs.length === 0) {\n return fsReader;\n }\n\n const zipReader = await ZipScriptReader(...zipInputs);\n return (path) => fsReader(path) ?? zipReader(path);\n}\n", "import type { Database } from 'sql.js';\nimport { OcgcoreCommonConstants } from '../vendor';\nimport type { CardData } from 'ygopro-msg-encode';\nimport type { CardReader } from '../types/callback';\n\ntype SqljsRow = {\n id: number;\n alias: number;\n setcode: number | bigint;\n type: number;\n atk: number;\n def: number;\n level: number;\n race: number;\n attribute: number;\n};\n\nfunction toNumberArrayFromSetcode(value: number | bigint): number[] {\n let raw = typeof value === 'bigint' ? value : BigInt(value >>> 0);\n const list: number[] = [];\n while (raw !== 0n && list.length < 16) {\n const chunk = raw & 0xffffn;\n if (chunk !== 0n) {\n list.push(Number(chunk));\n }\n raw >>= 16n;\n }\n return list;\n}\n\nfunction mapRowToCardData(row: SqljsRow): Partial<CardData> {\n const type = (row.type ?? 0) >>> 0;\n const attack = row.atk ?? 0;\n let defense = row.def ?? 0;\n let linkMarker = 0;\n if ((type & OcgcoreCommonConstants.TYPE_LINK) >>> 0 !== 0) {\n linkMarker = defense;\n defense = 0;\n }\n const levelRaw = (row.level ?? 0) >>> 0;\n const level = (levelRaw & 0xff) >>> 0;\n const lscale = ((levelRaw >>> 24) & 0xff) >>> 0;\n const rscale = ((levelRaw >>> 16) & 0xff) >>> 0;\n\n return {\n code: row.id,\n alias: row.alias ?? 0,\n setcode: toNumberArrayFromSetcode(row.setcode ?? 0),\n type,\n level,\n attribute: (row.attribute ?? 0) >>> 0,\n race: (row.race ?? 0) >>> 0,\n attack,\n defense,\n lscale,\n rscale,\n linkMarker,\n };\n}\n\nfunction queryOne(db: Database, cardId: number): Partial<CardData> | null {\n if (typeof db.prepare === 'function') {\n const stmt = db.prepare(\n 'SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ?',\n );\n try {\n stmt.bind([cardId]);\n if (!stmt.step()) {\n return null;\n }\n const row = stmt.getAsObject() as unknown as SqljsRow;\n if (!row || row.id == null) {\n return null;\n }\n return mapRowToCardData(row);\n } finally {\n stmt.free();\n }\n }\n\n const res = db.exec(\n `SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ${cardId}`,\n );\n if (\n !res ||\n res.length === 0 ||\n !res[0].values ||\n res[0].values.length === 0\n ) {\n return null;\n }\n const row = res[0].values[0] as unknown[];\n return mapRowToCardData({\n id: row[0] as number,\n alias: row[1] as number,\n setcode: row[2] as number,\n type: row[3] as number,\n atk: row[4] as number,\n def: row[5] as number,\n level: row[6] as number,\n race: row[7] as number,\n attribute: row[8] as number,\n });\n}\n\nexport function SqljsCardReader(...dbs: Database[]): CardReader {\n return (cardId: number) => {\n for (const db of dbs) {\n const data = queryOne(db, cardId);\n if (data) {\n return data;\n }\n }\n return null;\n };\n}\n\n/** @deprecated Use SqljsCardReader instead. */\nexport function createSqljsCardReader(...dbs: Database[]): CardReader {\n return SqljsCardReader(...dbs);\n}\n", "import JSZip from 'jszip';\n\nimport type { CardReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\nimport { SqljsCardReader } from './sqljs-card-reader';\nimport type { SqlJsStatic } from 'sql.js';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nasync function collectFsDbPaths(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const collectCdbFiles = async (dirPath: string): Promise<string[]> => {\n const paths: string[] = [];\n const entries = await safeReadDir(fs, dirPath);\n for (const entry of entries) {\n if (!entry.toLowerCase().endsWith('.cdb')) {\n continue;\n }\n const fullPath = joinPath(pathMod, dirPath, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n paths.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n return paths;\n };\n\n const results: string[] = [];\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n results.push(...(await collectCdbFiles(expansionsDir)));\n\n results.push(...(await collectCdbFiles(baseDir)));\n\n return results;\n}\n\nfunction isRootCdbEntry(entryName: string): boolean {\n const normalized = entryName.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n return !normalized.includes('/') && normalized.toLowerCase().endsWith('.cdb');\n}\n\nexport async function DirCardReader(\n sqljs: SqlJsStatic,\n ...baseDirs: string[]\n): Promise<CardReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirCardReader');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirCardReader');\n\n const dbs: unknown[] = [];\n for (const baseDir of baseDirs) {\n const dbPaths = await collectFsDbPaths(fs, pathMod, baseDir);\n for (const dbPath of dbPaths) {\n try {\n const bytes = await fs.promises.readFile(dbPath);\n dbs.push(new sqljs.Database(bytes));\n } catch {\n continue;\n }\n }\n }\n\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n const bytes = await fs.promises.readFile(zipPath);\n const zip = await JSZip.loadAsync(bytes);\n const entries = Object.values(zip.files);\n for (const entry of entries) {\n if (entry.dir || !isRootCdbEntry(entry.name)) {\n continue;\n }\n try {\n const content = await entry.async('uint8array');\n dbs.push(new sqljs.Database(content));\n } catch {\n continue;\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n return SqljsCardReader(...(dbs as Parameters<typeof SqljsCardReader>));\n}\n", "import { YGOProYrp } from 'ygopro-yrp-encode';\n\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreProcessResult } from './types';\n\nconst { LOCATION_DECK, LOCATION_EXTRA, POS_FACEDOWN_DEFENSE } =\n OcgcoreScriptConstants;\n\nfunction normalizeYrp(input: YGOProYrp | Uint8Array): YGOProYrp {\n if (input instanceof YGOProYrp) {\n return input;\n }\n return new YGOProYrp().fromYrp(input);\n}\n\nfunction loadDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n player: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_EXTRA,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n}\n\nfunction loadTagDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_DECK,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_EXTRA,\n });\n }\n}\n\nfunction setRegistryValue(duel: OcgcoreDuel, key: string, value: string): void {\n duel.setRegistryValue(key, value);\n}\n\nexport function createDuelFromYrp(\n wrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const yrp = normalizeYrp(yrpInput);\n const header = yrp.header;\n const seedSequence = header?.seedSequence ?? [];\n const duel =\n seedSequence.length > 0\n ? wrapper.createDuelV2(seedSequence)\n : wrapper.createDuel(header?.seed ?? 0);\n\n setRegistryValue(duel, 'duel_mode', yrp.isTag ? 'tag' : 'single');\n setRegistryValue(duel, 'start_lp', String(yrp.startLp));\n setRegistryValue(duel, 'start_hand', String(yrp.startHand));\n setRegistryValue(duel, 'draw_count', String(yrp.drawCount));\n\n const playerNames = yrp.isTag\n ? [\n yrp.hostName,\n yrp.tagHostName ?? '',\n yrp.tagClientName ?? '',\n yrp.clientName,\n ]\n : [yrp.hostName, yrp.clientName];\n for (let i = 0; i < playerNames.length; i++) {\n setRegistryValue(duel, `player_name_${i}`, playerNames[i] ?? '');\n }\n setRegistryValue(duel, 'player_type_0', '0');\n setRegistryValue(duel, 'player_type_1', '1');\n\n duel.setPlayerInfo({\n player: 0,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n duel.setPlayerInfo({\n player: 1,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n\n duel.preloadScript('./script/patches/entry.lua');\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n\n if (yrp.isSingleMode && yrp.singleScript) {\n duel.preloadScript(`./single/${yrp.singleScript}`);\n } else if (yrp.isTag) {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadTagDeck(duel, yrp.tagHostDeck, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n loadTagDeck(duel, yrp.tagClientDeck, 1);\n } else {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n }\n\n duel.startDuel(yrp.opt >>> 0);\n return { yrp, duel };\n}\n\nexport function consumeResponseFromOcgcoreProcess(\n duel: OcgcoreDuel,\n result: OcgcoreProcessResult,\n responses: Uint8Array[],\n) {\n if (\n result.raw.length > 0 &&\n result.raw[0] === OcgcoreCommonConstants.MSG_RETRY\n ) {\n throw new Error('Got MSG_RETRY');\n }\n\n if (result.status === 0) {\n return false;\n }\n if (result.status === 1) {\n if (result.raw.length === 0) {\n return false;\n }\n const response = responses.shift();\n if (!response) {\n return true;\n }\n duel.setResponse(response);\n return false;\n }\n return true;\n}\n\nexport function* processYrpDuelStep(duel: OcgcoreDuel, yrp: YGOProYrp) {\n const responses = yrp.responses.slice();\n\n while (true) {\n const result = duel.process();\n yield {\n duel,\n result,\n responses,\n };\n\n if (consumeResponseFromOcgcoreProcess(duel, result, responses)) {\n break;\n }\n }\n}\n\nexport function* playYrpStep(\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const { yrp, duel } = createDuelFromYrp(ocgcoreWrapper, yrpInput);\n\n try {\n for (const stepResult of processYrpDuelStep(duel, yrp)) {\n yield stepResult;\n }\n } finally {\n duel.endDuel();\n }\n}\n\nexport const playYrp = (\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) => {\n const results: Uint8Array[] = [];\n for (const result of playYrpStep(ocgcoreWrapper, yrpInput)) {\n results.push(result.result.raw);\n }\n return results;\n};\n", "import { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\n\nconst { LOCATION_DECK, POS_FACEUP_ATTACK } = OcgcoreScriptConstants;\n\nexport interface TestCardMessage {\n type: OcgcoreMessageType;\n message: string;\n}\n\nexport function testCard(\n ocgcoreWrapper: OcgcoreWrapper,\n ...ids: number[]\n): TestCardMessage[] {\n const logs: TestCardMessage[] = [];\n const duel = ocgcoreWrapper.createDuelV2(\n Array.from(\n { length: 8 },\n () => Math.floor(Math.random() * 0xffffffff) >>> 0,\n ),\n );\n\n ocgcoreWrapper.setMessageHandler((_duel, message, type) => {\n if (duel.duelPtr !== _duel.duelPtr) return;\n logs.push({ type, message });\n });\n\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n duel.setPlayerInfo({ player: 0, lp: 8000, startHand: 5, drawCount: 1 });\n duel.setPlayerInfo({ player: 1, lp: 8000, startHand: 5, drawCount: 1 });\n\n for (const code of ids) {\n duel.newCard({\n code,\n owner: 0,\n player: 0,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEUP_ATTACK,\n });\n }\n\n duel.startDuel(0);\n\n while (true) {\n const { status, raw } = duel.process();\n if (raw.length > 0 && raw[0] === OcgcoreCommonConstants.MSG_RETRY) {\n break;\n }\n if (status === 0) {\n continue;\n }\n break;\n }\n\n duel.endDuel();\n return logs;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_ygopro_msg_encode", "import_ygopro_msg_encode", "import_ygopro_msg_encode", "OcgcoreMessageType", "OcgcoreDuelRule", "OcgcoreDuelOptionFlag", "JSZip", "joinPath", "row", "import_jszip", "joinPath", "getNodeModuleOrThrow", "safeReadDir", "JSZip", "LOCATION_DECK"]
|
|
4
|
+
"sourcesContent": ["import { Buffer } from 'buffer';\n\nif (\n typeof globalThis !== 'undefined' &&\n !(globalThis as { Buffer?: unknown }).Buffer\n) {\n (globalThis as { Buffer?: unknown }).Buffer = Buffer;\n}\n\nexport * from './src/ocgcore-wrapper';\nexport * from './src/ocgcore-duel';\nexport * from './src/create-ocgcore-wrapper';\nexport * from './src/types';\nexport * from './src/adapters';\nexport * from './src/constants';\n// export * from './src/utility';\nexport * as _OcgcoreConstants from './src/vendor';\nexport * from './src/script-reader';\nexport * from './src/card-reader';\nexport * from './src/play-yrp';\nexport * from './src/test-card';\n", "export {\n OcgcoreCommonConstants,\n OcgcoreScriptConstants,\n} from 'ygopro-msg-encode';\n", "import { OcgcoreCommonConstants } from '../vendor';\n\nexport const MESSAGE_BUFFER_SIZE = OcgcoreCommonConstants.SIZE_MESSAGE_BUFFER;\nexport const QUERY_BUFFER_SIZE = 0x4000;\nexport const REGISTRY_BUFFER_SIZE = 0x2000;\n\nexport const LEN_FAIL = 0;\nexport const LEN_EMPTY = 4;\nexport const LEN_HEADER = 8;\n", "export function readU8(buf: Uint8Array, offset: number): number {\n return buf[offset] ?? 0;\n}\n\nexport function readU16(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint16(\n offset,\n true,\n );\n}\n\nexport function readI32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getInt32(\n offset,\n true,\n );\n}\n\nexport function readU32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint32(\n offset,\n true,\n );\n}\n", "const encoder = new TextEncoder();\nconst decoder = new TextDecoder('utf-8');\n\nexport function encodeUtf8(value: string): Uint8Array {\n return encoder.encode(value);\n}\n\nexport function decodeUtf8(value: Uint8Array): string {\n return decoder.decode(value);\n}\n", "import { LEN_HEADER } from '../constants';\nimport { readI32, readU16 } from '../utility/binary';\nimport { decodeUtf8 } from '../utility/utf8';\nimport { CardQuery, YGOProMsgReloadField } from 'ygopro-msg-encode';\n\n// Internal interface for registry parsing\ninterface RegistryDumpEntry {\n key: string;\n value: Uint8Array;\n valueText?: string;\n}\n\nexport function parseCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery | null {\n if (length <= LEN_HEADER) {\n return null;\n }\n const payload = raw.subarray(4, length);\n return new CardQuery().fromPayload(payload);\n}\n\nexport function parseFieldCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery[] {\n const cards: CardQuery[] = [];\n let offset = 0;\n while (offset + 4 <= length) {\n const chunkLen = readI32(raw, offset);\n if (chunkLen <= 0) {\n break;\n }\n const end = Math.min(length, offset + chunkLen);\n if (chunkLen <= LEN_HEADER) {\n const emptyCard = new CardQuery();\n emptyCard.flags = 0;\n emptyCard.empty = true;\n cards.push(emptyCard);\n } else {\n const payload = raw.subarray(offset + 4, end);\n cards.push(new CardQuery().fromPayload(payload));\n }\n offset += chunkLen;\n }\n return cards;\n}\n\nexport function parseFieldInfo(raw: Uint8Array): YGOProMsgReloadField {\n // query_field_info() in ocgcore returns data that starts with MSG_RELOAD_FIELD (162) byte\n // Format: [MSG_RELOAD_FIELD][duel_rule][player0_data][player1_data][chains]\n // YGOProMsgReloadField.fromPayload() expects the full message including the identifier\n return new YGOProMsgReloadField().fromPayload(raw);\n}\n\nexport function parseRegistryKeys(raw: Uint8Array): string[] {\n const keys: string[] = [];\n let offset = 0;\n while (offset + 2 <= raw.length) {\n const len = readU16(raw, offset);\n offset += 2;\n if (offset + len > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + len);\n offset += len;\n keys.push(decodeUtf8(keyBytes));\n }\n return keys;\n}\n\nexport function parseRegistryDump(raw: Uint8Array): RegistryDumpEntry[] {\n const entries: RegistryDumpEntry[] = [];\n let offset = 0;\n while (offset + 4 <= raw.length) {\n const keyLen = readU16(raw, offset);\n const valLen = readU16(raw, offset + 2);\n offset += 4;\n if (offset + keyLen + valLen > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + keyLen);\n offset += keyLen;\n const valueBytes = raw.subarray(offset, offset + valLen);\n offset += valLen;\n const entry: RegistryDumpEntry = {\n key: decodeUtf8(keyBytes),\n value: valueBytes,\n };\n entry.valueText = decodeUtf8(valueBytes);\n entries.push(entry);\n }\n return entries;\n}\n", "import { OcgcoreStartDuelOptions } from '../types/ocgcore-params';\n\nexport function normalizeStartDuelOptions(\n options: number | OcgcoreStartDuelOptions,\n): number {\n if (typeof options === 'number') {\n return options;\n }\n const duelRule = options.rule ?? 0;\n let duelOptions = options.options ?? 0;\n if (options.flags?.length) {\n for (const flag of options.flags) {\n duelOptions = (duelOptions | flag) >>> 0;\n }\n }\n return (((duelRule & 0xffff) << 16) | (duelOptions & 0xffff)) >>> 0;\n}\n", "import {\n OcgcoreCardQueryResult,\n OcgcoreFieldCardQueryResult,\n OcgcoreFieldInfoResult,\n OcgcoreMessageResult,\n OcgcoreProcessResult,\n OcgcoreRegistryDumpResult,\n OcgcoreRegistryKeysResult,\n OcgcoreRegistryValueResult,\n} from './types/ocgcore-results';\nimport {\n OcgcoreNewCardParams,\n OcgcoreNewTagCardParams,\n OcgcoreQueryCardParams,\n OcgcoreQueryFieldCardParams,\n OcgcoreQueryFieldCountParams,\n OcgcoreSetPlayerInfoParams,\n OcgcoreStartDuelOptions,\n} from './types/ocgcore-params';\nimport {\n MESSAGE_BUFFER_SIZE,\n QUERY_BUFFER_SIZE,\n REGISTRY_BUFFER_SIZE,\n LEN_HEADER,\n} from './constants';\nimport {\n parseCardQuery,\n parseFieldCardQuery,\n parseFieldInfo,\n parseRegistryDump,\n parseRegistryKeys,\n} from './adapters/ocgcore-parsers';\nimport { normalizeStartDuelOptions } from './adapters/start-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { decodeUtf8 } from './utility/utf8';\nimport {\n YGOProMessages,\n YGOProMsgBase,\n YGOProMsgRetry,\n} from 'ygopro-msg-encode';\n\nexport class OcgcoreDuel {\n private returnPtr = 0;\n private returnSize = 512;\n\n constructor(\n public ocgcoreWrapper: OcgcoreWrapper,\n public duelPtr: number,\n ) {}\n\n startDuel(options: number | OcgcoreStartDuelOptions): void {\n if (!this.returnPtr) {\n this.returnPtr = this.ocgcoreWrapper.malloc(this.returnSize);\n }\n const optionValue = normalizeStartDuelOptions(options);\n this.ocgcoreWrapper.ocgcoreModule._start_duel(this.duelPtr, optionValue);\n }\n\n ended = false;\n\n endDuel(): void {\n if (this.ended) return;\n this.ended = true;\n this.ocgcoreWrapper.ocgcoreModule._end_duel(this.duelPtr);\n if (this.returnPtr) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = 0;\n }\n this.ocgcoreWrapper.forgetDuel(this.duelPtr);\n }\n\n setPlayerInfo(info: OcgcoreSetPlayerInfoParams): void {\n this.ocgcoreWrapper.ocgcoreModule._set_player_info(\n this.duelPtr,\n info.player,\n info.lp,\n info.startHand,\n info.drawCount,\n );\n }\n\n _getLogMessage(bufPtr: number): number {\n return this.ocgcoreWrapper.ocgcoreModule._get_log_message(\n this.duelPtr,\n bufPtr,\n );\n }\n\n private getMessage(length: number): OcgcoreMessageResult {\n const ptr = this.ocgcoreWrapper.malloc(MESSAGE_BUFFER_SIZE);\n this.ocgcoreWrapper.ocgcoreModule._get_message(this.duelPtr, ptr);\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n return { length, raw };\n }\n\n process(): OcgcoreProcessResult {\n const result = this.ocgcoreWrapper.ocgcoreModule._process(this.duelPtr);\n const length = (result & 0x0fffffff) >>> 0;\n const status = ((result >>> 28) & 0x0f) >>> 0;\n const messageData = this.getMessage(length);\n\n // Parse message using YGOProMessages (only one message per process call)\n let parsedMessage: YGOProMsgBase | undefined;\n if (messageData.raw.length > 0) {\n try {\n parsedMessage = YGOProMessages.getInstanceFromPayload(messageData.raw);\n } catch (e) {\n // If parsing fails, parsedMessage remains undefined\n }\n }\n\n return {\n length: messageData.length,\n raw: messageData.raw,\n status,\n message: parsedMessage,\n };\n }\n\n *advance(advancor?: () => Uint8Array | void | null | undefined) {\n while (true) {\n const res = this.process();\n yield res;\n if (res.status === 2 || res.message instanceof YGOProMsgRetry) {\n break;\n }\n\n if (res.status === 1 && res.raw.length > 0) {\n const response = advancor?.();\n if (!response) {\n break;\n }\n this.setResponse(response);\n }\n }\n }\n\n newCard(card: OcgcoreNewCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.player,\n card.location,\n card.sequence,\n card.position,\n );\n }\n\n newTagCard(card: OcgcoreNewTagCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_tag_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.location,\n );\n }\n\n queryCard(query: OcgcoreQueryCardParams): OcgcoreCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_card(\n this.duelPtr,\n query.player,\n query.location,\n query.sequence,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const card = length <= LEN_HEADER ? null : parseCardQuery(raw, length);\n return { length, raw, card };\n }\n\n queryFieldCount(query: OcgcoreQueryFieldCountParams): number {\n return this.ocgcoreWrapper.ocgcoreModule._query_field_count(\n this.duelPtr,\n query.player,\n query.location,\n );\n }\n\n queryFieldCard(\n query: OcgcoreQueryFieldCardParams,\n ): OcgcoreFieldCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_card(\n this.duelPtr,\n query.player,\n query.location,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const cards = parseFieldCardQuery(raw, length);\n return { length, raw, cards };\n }\n\n queryFieldInfo(): OcgcoreFieldInfoResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_info(\n this.duelPtr,\n ptr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const field = parseFieldInfo(raw);\n return { length, raw, field };\n }\n\n setResponseInt(value: number): void {\n this.ocgcoreWrapper.ocgcoreModule._set_responsei(this.duelPtr, value);\n }\n\n setResponse(response: Uint8Array | number): void {\n if (typeof response === 'number') {\n this.setResponseInt(response);\n return;\n }\n if (response.length > this.returnSize) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = this.ocgcoreWrapper.malloc(response.length);\n this.returnSize = response.length;\n }\n this.ocgcoreWrapper.setHeap(this.returnPtr, response);\n this.ocgcoreWrapper.ocgcoreModule._set_responseb(\n this.duelPtr,\n this.returnPtr,\n );\n }\n\n preloadScript(scriptPath: string): void {\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._preload_script(this.duelPtr, ptr),\n scriptPath,\n );\n }\n\n getRegistryValue(key: string): OcgcoreRegistryValueResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.useTmpData(\n (keyPtr) =>\n this.ocgcoreWrapper.ocgcoreModule._get_registry_value(\n this.duelPtr,\n keyPtr,\n outPtr,\n ),\n key,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const value = raw;\n const text = length >= 0 ? decodeUtf8(raw) : undefined;\n return { length, raw, value, text };\n }\n\n setRegistryValue(key: string, value: string): void {\n this.ocgcoreWrapper.useTmpData(\n (keyPtr, valuePtr) =>\n this.ocgcoreWrapper.ocgcoreModule._set_registry_value(\n this.duelPtr,\n keyPtr,\n valuePtr,\n ),\n key,\n value,\n );\n }\n\n getRegistryKeys(): OcgcoreRegistryKeysResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._get_registry_keys(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const keys = length >= 0 ? parseRegistryKeys(raw) : [];\n return { length, raw, keys };\n }\n\n clearRegistry(): void {\n this.ocgcoreWrapper.ocgcoreModule._clear_registry(this.duelPtr);\n }\n\n dumpRegistry(): OcgcoreRegistryDumpResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._dump_registry(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n\n // Parse directly into dict\n const dict: Record<string, string> = {};\n if (length > 0) {\n const entries = parseRegistryDump(raw);\n for (const entry of entries) {\n if (entry.valueText !== undefined) {\n dict[entry.key] = entry.valueText;\n }\n }\n }\n\n return { length, raw, dict };\n }\n\n loadRegistry(input: Uint8Array | Record<string, string>): void {\n if (input instanceof Uint8Array) {\n // Load from binary format\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._load_registry(\n this.duelPtr,\n ptr,\n input.length,\n ),\n input,\n );\n } else {\n // Load from dict format\n for (const [key, value] of Object.entries(input)) {\n this.setRegistryValue(key, value);\n }\n }\n }\n}\n", "import { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { CardData } from 'ygopro-msg-encode';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\nimport { CardReader, MessageHandler, ScriptReader } from './types/callback';\n\nexport class OcgcoreWrapper {\n private scriptBufferPtr = 0;\n private scriptBufferSize = 0;\n private logBufferPtr = 0;\n private logBufferSize = 0;\n private tmpStringBufferPtr = 0;\n private tmpStringBufferSize = 0;\n\n private scriptReaderFunc = 0;\n private cardReaderFunc = 0;\n private messageHandlerFunc = 0;\n\n public scriptReaders: ScriptReader[] = [];\n public cardReaders: CardReader[] = [];\n public messageHandlers: MessageHandler[] = [];\n\n private heapU8: Uint8Array;\n private heapView: DataView;\n private encoder = new TextEncoder();\n private decoder = new TextDecoder('utf-8');\n private duels = new Map<number, OcgcoreDuel>();\n\n constructor(\n public ocgcoreModule: OcgcoreModule,\n options?: { scriptBufferSize?: number; logBufferSize?: number },\n ) {\n this.heapU8 = ocgcoreModule.HEAPU8 as Uint8Array;\n this.heapView = new DataView(this.heapU8.buffer);\n this.scriptBufferSize = options?.scriptBufferSize ?? 0x100000;\n this.logBufferSize = options?.logBufferSize ?? 1024;\n\n this.scriptReaderFunc = this.createFunction((scriptPtr, lenPtr) => {\n const scriptPath = this.getUTF8String(scriptPtr);\n const content = this.readScript(scriptPath);\n if (content == null) {\n return 0;\n }\n\n if (!this.scriptBufferPtr) {\n this.scriptBufferPtr = this.ocgcoreModule._malloc(\n this.scriptBufferSize,\n );\n }\n\n const bytes = content;\n if (bytes.length > this.scriptBufferSize) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = this.ocgcoreModule._malloc(bytes.length);\n this.scriptBufferSize = bytes.length;\n }\n\n this.heapU8.set(bytes, this.scriptBufferPtr);\n this.heapView.setInt32(lenPtr, bytes.length, true);\n return this.scriptBufferPtr;\n }, 'iii');\n this.ocgcoreModule._set_script_reader(this.scriptReaderFunc);\n\n this.cardReaderFunc = this.createFunction((cardId, cardDataPtr) => {\n const data = this.readCard(cardId);\n if (!data) {\n return 0;\n }\n\n const buf = new CardData().fromPartial(data).toPayload();\n this.heapU8.set(buf, cardDataPtr);\n return 0;\n }, 'iii');\n this.ocgcoreModule._set_card_reader(this.cardReaderFunc);\n\n this.messageHandlerFunc = this.createFunction((duelPtr, messageType) => {\n if (!this.logBufferPtr) {\n this.logBufferPtr = this.ocgcoreModule._malloc(this.logBufferSize);\n }\n this.ocgcoreModule._get_log_message(duelPtr, this.logBufferPtr);\n const message = this.getUTF8String(this.logBufferPtr);\n const type =\n messageType === 2\n ? OcgcoreMessageType.DebugMessage\n : OcgcoreMessageType.ScriptError;\n const duel = this.getOrCreateDuel(duelPtr);\n this.handleMessage(duel, message, type);\n }, 'iii');\n this.ocgcoreModule._set_message_handler(this.messageHandlerFunc);\n }\n\n readScript(scriptPath: string): Uint8Array | null {\n let content: string | Uint8Array | null | undefined;\n for (const reader of this.scriptReaders) {\n try {\n content = reader(scriptPath);\n } catch {\n content = null;\n }\n if (content != null) {\n break;\n }\n }\n return typeof content === 'string'\n ? this.encoder.encode(content)\n : (content ?? null);\n }\n\n readCard(cardId: number): Partial<CardData> | null {\n let data: Partial<CardData> | null | undefined;\n for (const reader of this.cardReaders) {\n try {\n data = reader(cardId);\n } catch {\n data = null;\n }\n if (data) {\n break;\n }\n }\n return data ?? null;\n }\n\n handleMessage(\n duel: OcgcoreDuel,\n message: string,\n type: OcgcoreMessageType,\n ): void {\n for (const handler of this.messageHandlers) {\n try {\n handler(duel, message, type);\n } catch {\n // ignore handler errors\n }\n }\n }\n\n getUTF8String(ptr: number): string {\n let length = 0;\n while (this.heapU8[ptr + length] !== 0) {\n length++;\n }\n return this.decoder.decode(this.heapU8.subarray(ptr, ptr + length));\n }\n\n setHeap(ptr: number, data: Uint8Array): void {\n this.heapU8.set(data, ptr);\n }\n\n copyHeap(ptr: number, length: number): Uint8Array {\n return this.heapU8.slice(ptr, ptr + length);\n }\n\n useTmpData<R>(\n cb: (...args: number[]) => R,\n ...args: Array<string | Uint8Array>\n ): R {\n const encoded = args.map((item) =>\n typeof item === 'string' ? this.encoder.encode(item) : item,\n );\n const totalLength = encoded.reduce(\n (acc, bytes) => acc + bytes.length + 1,\n 0,\n );\n if (totalLength > this.tmpStringBufferSize) {\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n }\n this.tmpStringBufferPtr = this.ocgcoreModule._malloc(totalLength);\n this.tmpStringBufferSize = totalLength;\n }\n\n let offset = 0;\n const ptrs = encoded.map((bytes) => {\n const ptr = this.tmpStringBufferPtr + offset;\n this.heapU8.set(bytes, ptr);\n this.heapU8[ptr + bytes.length] = 0;\n offset += bytes.length + 1;\n return ptr;\n });\n\n return cb(...ptrs);\n }\n\n private createFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n addFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n removeFunction(index: number): void {\n this.ocgcoreModule.removeFunction(index);\n }\n\n createDuel(seed: number): OcgcoreDuel {\n const duelPtr = this.ocgcoreModule._create_duel(seed);\n return this.getOrCreateDuel(duelPtr);\n }\n\n createDuelV2(seedSequence: number[]): OcgcoreDuel {\n const count = seedSequence.length;\n const byteLength = count * 4;\n const ptr = this.ocgcoreModule._malloc(byteLength);\n const view = new Uint32Array(this.heapU8.buffer, ptr, count);\n for (let i = 0; i < count; i++) {\n view[i] = seedSequence[i] >>> 0;\n }\n const duelPtr = this.ocgcoreModule._create_duel_v2(ptr);\n this.ocgcoreModule._free(ptr);\n return this.getOrCreateDuel(duelPtr);\n }\n\n _defaultScriptReader(namePtr: number, dataPtr: number): number {\n return this.ocgcoreModule._default_script_reader(namePtr, dataPtr);\n }\n\n malloc(size: number): number {\n return this.ocgcoreModule._malloc(size);\n }\n\n free(ptr: number): void {\n this.ocgcoreModule._free(ptr);\n }\n\n _stdioExit(): void {\n this.ocgcoreModule.___stdio_exit();\n }\n\n setScriptReader(reader: ScriptReader, reset = false): this {\n if (reset) {\n this.scriptReaders = [];\n }\n this.scriptReaders.push(reader);\n return this;\n }\n\n setCardReader(reader: CardReader, reset = false): this {\n if (reset) {\n this.cardReaders = [];\n }\n this.cardReaders.push(reader);\n return this;\n }\n\n setMessageHandler(handler: MessageHandler, reset = false): this {\n if (reset) {\n this.messageHandlers = [];\n }\n this.messageHandlers.push(handler);\n return this;\n }\n\n getOrCreateDuel(duelPtr: number): OcgcoreDuel {\n const existing = this.duels.get(duelPtr);\n if (existing) {\n return existing;\n }\n const duel = new OcgcoreDuel(this, duelPtr);\n this.duels.set(duelPtr, duel);\n return duel;\n }\n\n forgetDuel(duelPtr: number): void {\n this.duels.delete(duelPtr);\n }\n\n finalize(): void {\n if (this.scriptReaderFunc) {\n this.ocgcoreModule.removeFunction(this.scriptReaderFunc);\n this.scriptReaderFunc = 0;\n }\n if (this.cardReaderFunc) {\n this.ocgcoreModule.removeFunction(this.cardReaderFunc);\n this.cardReaderFunc = 0;\n }\n if (this.messageHandlerFunc) {\n this.ocgcoreModule.removeFunction(this.messageHandlerFunc);\n this.messageHandlerFunc = 0;\n }\n\n if (this.scriptBufferPtr) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = 0;\n this.scriptBufferSize = 0;\n }\n if (this.logBufferPtr) {\n this.ocgcoreModule._free(this.logBufferPtr);\n this.logBufferPtr = 0;\n this.logBufferSize = 0;\n }\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n this.tmpStringBufferPtr = 0;\n this.tmpStringBufferSize = 0;\n }\n }\n}\n", "export enum OcgcoreMessageType {\n ScriptError = 'ScriptError',\n DebugMessage = 'DebugMessage',\n}\n\nexport enum OcgcoreDuelRule {\n Rule1 = 1,\n Rule2 = 2,\n MasterRule3 = 3,\n NewMasterRule = 4,\n MasterRule2020 = 5,\n}\n\nexport enum OcgcoreDuelOptionFlag {\n TestMode = 0x01,\n AttackFirstTurn = 0x02,\n ObsoleteRuling = 0x08,\n PseudoShuffle = 0x10,\n TagMode = 0x20,\n SimpleAI = 0x40,\n ReturnDeckTop = 0x80,\n RevealDeckSeq = 0x100,\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\n\ntype OcgcoreFactoryModule = { default?: OcgcoreFactory } | OcgcoreFactory;\n\nexport function normalizeOcgcoreFactory(mod: unknown): OcgcoreFactory {\n const typed = mod as OcgcoreFactoryModule;\n if (typeof typed === 'function') {\n return typed as OcgcoreFactory;\n }\n if (typed && typeof (typed as { default?: unknown }).default === 'function') {\n return (typed as { default: OcgcoreFactory }).default;\n }\n throw new Error('Invalid ocgcore factory module');\n}\n", "export function loadNodeModule<T>(id: string, altId?: string): T | null {\n const req =\n typeof module.require !== 'undefined' ? module.require : undefined;\n if (!req) {\n return null;\n }\n try {\n return req(id) as T;\n } catch {\n if (!altId) return null;\n try {\n return req(altId) as T;\n } catch {\n return null;\n }\n }\n}\n", "type NodeStats = {\n isFile: () => boolean;\n};\n\ntype NodeFsPromises = {\n readFile: (path: string) => Promise<Uint8Array>;\n readdir: (path: string) => Promise<string[]>;\n stat: (path: string) => Promise<NodeStats>;\n access: (path: string) => Promise<void>;\n};\n\nexport type NodeFs = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string) => Uint8Array;\n promises: NodeFsPromises;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodeFs(noThrow = false): NodeFs | null {\n const mod = loadNodeModule<NodeFs>('node:fs', 'fs');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js fs module is not available.');\n}\n", "export type NodePath = {\n join: (...parts: string[]) => string;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodePath(noThrow = false): NodePath | null {\n const mod = loadNodeModule<NodePath>('node:path', 'path');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js path module is not available.');\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\nimport { normalizeOcgcoreFactory } from './ocgcore-wrapper-utils';\nimport { getNodeFs } from './utility/node-fs';\nimport { getNodePath } from './utility/node-path';\n\nexport async function loadOcgcoreFactory(): Promise<OcgcoreFactory> {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require('./vendor/wasm_cjs/libocgcore.cjs') as unknown;\n const baseFactory = normalizeOcgcoreFactory(mod);\n\n const fs = getNodeFs(true);\n if (!fs) {\n return baseFactory;\n }\n\n const pathMod = getNodePath(true);\n if (!pathMod) {\n return baseFactory;\n }\n let defaultWasmBinary: Uint8Array | null = null;\n const wasmPath = pathMod.join(\n __dirname,\n 'vendor',\n 'wasm_cjs',\n 'libocgcore.wasm',\n );\n if (fs.existsSync(wasmPath)) {\n defaultWasmBinary = fs.readFileSync(wasmPath);\n }\n\n if (!defaultWasmBinary) {\n return baseFactory;\n }\n\n return async (overrides) => {\n if (!overrides?.wasmBinary && !overrides?.locateFile) {\n return baseFactory({\n ...overrides,\n wasmBinary: defaultWasmBinary.buffer as ArrayBuffer,\n });\n }\n return baseFactory(overrides);\n };\n}\n", "import type { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { loadOcgcoreFactory } from './load-ocgcore-factory';\n\nexport interface CreateOcgcoreWrapperOptions {\n moduleOverrides?: Partial<OcgcoreModule>;\n wasmBinary?: Uint8Array;\n locateFile?: (path: string, prefix?: string) => string;\n}\n\nexport async function createOcgcoreWrapper(\n options: CreateOcgcoreWrapperOptions = {},\n): Promise<OcgcoreWrapper> {\n const factory = await loadOcgcoreFactory();\n const overrides: Partial<OcgcoreModule> = {\n ...options.moduleOverrides,\n };\n if (options.wasmBinary) {\n overrides.wasmBinary =\n options.wasmBinary as unknown as OcgcoreModule['wasmBinary'];\n }\n if (options.locateFile) {\n overrides.locateFile =\n options.locateFile as unknown as OcgcoreModule['locateFile'];\n }\n const moduleInstance = await factory(overrides);\n return new OcgcoreWrapper(moduleInstance);\n}\n", "import JSZip from 'jszip';\n\nimport { ScriptReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\n\nconst SCRIPT_PREFIX = './script/';\n\nfunction normalizePath(input: string): string {\n let path = input.replace(/\\\\/g, '/');\n if (path.startsWith(SCRIPT_PREFIX)) {\n path = path.slice(SCRIPT_PREFIX.length);\n }\n return path;\n}\n\nfunction buildCandidates(filename: string): string[] {\n const entries = [\n filename,\n `specials/${filename}`,\n `expansions/script/${filename}`,\n `script/${filename}`,\n ];\n const candidates: string[] = [];\n for (const entry of entries) {\n candidates.push(entry);\n if (!entry.startsWith('./')) {\n const dotEntry = entry.startsWith('/')\n ? `./${entry.slice(1)}`\n : `./${entry}`;\n candidates.push(dotEntry);\n }\n }\n return candidates;\n}\n\nfunction joinPath(baseDir: string, relativePath: string): string {\n const pathMod = getNodePath();\n if (pathMod) {\n return pathMod.join(baseDir, relativePath);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = relativePath.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nexport function MapScriptReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const candidate of candidates) {\n for (const map of maps) {\n if (map.has(candidate)) {\n return map.get(candidate) ?? null;\n }\n }\n }\n return null;\n };\n}\n\nexport function DirScriptReader(...baseDirs: string[]): ScriptReader {\n const fs = getNodeFs();\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const baseDir of baseDirs) {\n for (const candidate of candidates) {\n const normalized = candidate.startsWith('/')\n ? candidate.slice(1)\n : candidate;\n const fullPath = joinPath(baseDir, normalized);\n if (fs.existsSync(fullPath)) {\n return fs.readFileSync(fullPath);\n }\n }\n }\n return null;\n };\n}\n\nfunction normalizeZipEntryName(name: string): string[] {\n const normalized = name.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n const names = new Set<string>();\n names.add(normalized);\n if (normalized.startsWith('script/')) {\n names.add(normalized.slice('script/'.length));\n }\n return Array.from(names);\n}\n\nexport async function ZipScriptReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n const maps = await Promise.all(\n inputs.map(async (data) => {\n const zip = await JSZip.loadAsync(data);\n const map = new Map<string, string | Uint8Array>();\n const entries = Object.values(zip.files);\n await Promise.all(\n entries.map(async (entry) => {\n if (entry.dir) {\n return;\n }\n if (!entry.name.toLowerCase().endsWith('.lua')) {\n return;\n }\n const content = await entry.async('uint8array');\n for (const name of normalizeZipEntryName(entry.name)) {\n map.set(name, content);\n }\n }),\n );\n return map;\n }),\n );\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use MapScriptReader instead. */\nexport function MapReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use DirScriptReader instead. */\nexport function DirReader(...baseDirs: string[]): ScriptReader {\n return DirScriptReader(...baseDirs);\n}\n\n/** @deprecated Use ZipScriptReader instead. */\nexport async function ZipReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n return ZipScriptReader(...inputs);\n}\n", "import { getNodeFs } from './node-fs';\nimport { getNodePath } from './node-path';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function searchZips(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const results: string[] = [];\n const rootEntries = await safeReadDir(fs, baseDir);\n for (const entry of rootEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, baseDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n const expansionEntries = await safeReadDir(fs, expansionsDir);\n for (const entry of expansionEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, expansionsDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n return results;\n}\n", "import type { ScriptReader } from '../types/callback';\nimport { DirScriptReader, ZipScriptReader } from './script-readers';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nexport async function DirScriptReaderEx(\n ...baseDirs: string[]\n): Promise<ScriptReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirScriptReaderEx');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirScriptReaderEx');\n const fsReader = DirScriptReader(...baseDirs);\n\n const zipInputs: Uint8Array[] = [];\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n zipInputs.push(await fs.promises.readFile(zipPath));\n } catch {\n continue;\n }\n }\n }\n\n if (zipInputs.length === 0) {\n return fsReader;\n }\n\n const zipReader = await ZipScriptReader(...zipInputs);\n return (path) => fsReader(path) ?? zipReader(path);\n}\n", "import type { Database } from 'sql.js';\nimport { OcgcoreCommonConstants } from '../vendor';\nimport type { CardData } from 'ygopro-msg-encode';\nimport type { CardReader } from '../types/callback';\n\ntype SqljsRow = {\n id: number;\n alias: number;\n setcode: number | bigint;\n type: number;\n atk: number;\n def: number;\n level: number;\n race: number;\n attribute: number;\n};\n\nfunction toNumberArrayFromSetcode(value: number | bigint): number[] {\n let raw = typeof value === 'bigint' ? value : BigInt(value >>> 0);\n const list: number[] = [];\n while (raw !== 0n && list.length < 16) {\n const chunk = raw & 0xffffn;\n if (chunk !== 0n) {\n list.push(Number(chunk));\n }\n raw >>= 16n;\n }\n return list;\n}\n\nfunction mapRowToCardData(row: SqljsRow): Partial<CardData> {\n const type = (row.type ?? 0) >>> 0;\n const attack = row.atk ?? 0;\n let defense = row.def ?? 0;\n let linkMarker = 0;\n if ((type & OcgcoreCommonConstants.TYPE_LINK) >>> 0 !== 0) {\n linkMarker = defense;\n defense = 0;\n }\n const levelRaw = (row.level ?? 0) >>> 0;\n const level = (levelRaw & 0xff) >>> 0;\n const lscale = ((levelRaw >>> 24) & 0xff) >>> 0;\n const rscale = ((levelRaw >>> 16) & 0xff) >>> 0;\n\n return {\n code: row.id,\n alias: row.alias ?? 0,\n setcode: toNumberArrayFromSetcode(row.setcode ?? 0),\n type,\n level,\n attribute: (row.attribute ?? 0) >>> 0,\n race: (row.race ?? 0) >>> 0,\n attack,\n defense,\n lscale,\n rscale,\n linkMarker,\n };\n}\n\nfunction queryOne(db: Database, cardId: number): Partial<CardData> | null {\n if (typeof db.prepare === 'function') {\n const stmt = db.prepare(\n 'SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ?',\n );\n try {\n stmt.bind([cardId]);\n if (!stmt.step()) {\n return null;\n }\n const row = stmt.getAsObject() as unknown as SqljsRow;\n if (!row || row.id == null) {\n return null;\n }\n return mapRowToCardData(row);\n } finally {\n stmt.free();\n }\n }\n\n const res = db.exec(\n `SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ${cardId}`,\n );\n if (\n !res ||\n res.length === 0 ||\n !res[0].values ||\n res[0].values.length === 0\n ) {\n return null;\n }\n const row = res[0].values[0] as unknown[];\n return mapRowToCardData({\n id: row[0] as number,\n alias: row[1] as number,\n setcode: row[2] as number,\n type: row[3] as number,\n atk: row[4] as number,\n def: row[5] as number,\n level: row[6] as number,\n race: row[7] as number,\n attribute: row[8] as number,\n });\n}\n\nexport function SqljsCardReader(...dbs: Database[]): CardReader {\n return (cardId: number) => {\n for (const db of dbs) {\n const data = queryOne(db, cardId);\n if (data) {\n return data;\n }\n }\n return null;\n };\n}\n\n/** @deprecated Use SqljsCardReader instead. */\nexport function createSqljsCardReader(...dbs: Database[]): CardReader {\n return SqljsCardReader(...dbs);\n}\n", "import JSZip from 'jszip';\n\nimport type { CardReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\nimport { SqljsCardReader } from './sqljs-card-reader';\nimport type { SqlJsStatic } from 'sql.js';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nasync function collectFsDbPaths(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const collectCdbFiles = async (dirPath: string): Promise<string[]> => {\n const paths: string[] = [];\n const entries = await safeReadDir(fs, dirPath);\n for (const entry of entries) {\n if (!entry.toLowerCase().endsWith('.cdb')) {\n continue;\n }\n const fullPath = joinPath(pathMod, dirPath, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n paths.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n return paths;\n };\n\n const results: string[] = [];\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n results.push(...(await collectCdbFiles(expansionsDir)));\n\n results.push(...(await collectCdbFiles(baseDir)));\n\n return results;\n}\n\nfunction isRootCdbEntry(entryName: string): boolean {\n const normalized = entryName.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n return !normalized.includes('/') && normalized.toLowerCase().endsWith('.cdb');\n}\n\nexport async function DirCardReader(\n sqljs: SqlJsStatic,\n ...baseDirs: string[]\n): Promise<CardReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirCardReader');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirCardReader');\n\n const dbs: unknown[] = [];\n for (const baseDir of baseDirs) {\n const dbPaths = await collectFsDbPaths(fs, pathMod, baseDir);\n for (const dbPath of dbPaths) {\n try {\n const bytes = await fs.promises.readFile(dbPath);\n dbs.push(new sqljs.Database(bytes));\n } catch {\n continue;\n }\n }\n }\n\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n const bytes = await fs.promises.readFile(zipPath);\n const zip = await JSZip.loadAsync(bytes);\n const entries = Object.values(zip.files);\n for (const entry of entries) {\n if (entry.dir || !isRootCdbEntry(entry.name)) {\n continue;\n }\n try {\n const content = await entry.async('uint8array');\n dbs.push(new sqljs.Database(content));\n } catch {\n continue;\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n return SqljsCardReader(...(dbs as Parameters<typeof SqljsCardReader>));\n}\n", "import { YGOProYrp } from 'ygopro-yrp-encode';\n\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreProcessResult } from './types';\nimport { YGOProMsgRetry } from 'ygopro-msg-encode';\n\nconst { LOCATION_DECK, LOCATION_EXTRA, POS_FACEDOWN_DEFENSE } =\n OcgcoreScriptConstants;\n\nfunction normalizeYrp(input: YGOProYrp | Uint8Array): YGOProYrp {\n if (input instanceof YGOProYrp) {\n return input;\n }\n return new YGOProYrp().fromYrp(input);\n}\n\nfunction loadDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n player: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_EXTRA,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n}\n\nfunction loadTagDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_DECK,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_EXTRA,\n });\n }\n}\n\nfunction setRegistryValue(duel: OcgcoreDuel, key: string, value: string): void {\n duel.setRegistryValue(key, value);\n}\n\nexport function createDuelFromYrp(\n wrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const yrp = normalizeYrp(yrpInput);\n const header = yrp.header;\n const seedSequence = header?.seedSequence ?? [];\n const duel =\n seedSequence.length > 0\n ? wrapper.createDuelV2(seedSequence)\n : wrapper.createDuel(header?.seed ?? 0);\n\n setRegistryValue(duel, 'duel_mode', yrp.isTag ? 'tag' : 'single');\n setRegistryValue(duel, 'start_lp', String(yrp.startLp));\n setRegistryValue(duel, 'start_hand', String(yrp.startHand));\n setRegistryValue(duel, 'draw_count', String(yrp.drawCount));\n\n const playerNames = yrp.isTag\n ? [\n yrp.hostName,\n yrp.tagHostName ?? '',\n yrp.tagClientName ?? '',\n yrp.clientName,\n ]\n : [yrp.hostName, yrp.clientName];\n for (let i = 0; i < playerNames.length; i++) {\n setRegistryValue(duel, `player_name_${i}`, playerNames[i] ?? '');\n }\n setRegistryValue(duel, 'player_type_0', '0');\n setRegistryValue(duel, 'player_type_1', '1');\n\n duel.setPlayerInfo({\n player: 0,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n duel.setPlayerInfo({\n player: 1,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n\n duel.preloadScript('./script/patches/entry.lua');\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n\n if (yrp.isSingleMode && yrp.singleScript) {\n duel.preloadScript(`./single/${yrp.singleScript}`);\n } else if (yrp.isTag) {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadTagDeck(duel, yrp.tagHostDeck, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n loadTagDeck(duel, yrp.tagClientDeck, 1);\n } else {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n }\n\n duel.startDuel(yrp.opt >>> 0);\n return { yrp, duel };\n}\n\nexport function* playYrpStep(\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const { yrp, duel } = createDuelFromYrp(ocgcoreWrapper, yrpInput);\n\n const responses = yrp.responses.slice();\n try {\n for (const result of duel.advance(() => responses.shift())) {\n yield {\n duel,\n result,\n responses,\n };\n if (result.message instanceof YGOProMsgRetry) {\n throw new Error('Got MSG_RETRY');\n }\n }\n } finally {\n duel.endDuel();\n }\n}\n\nexport const playYrp = (\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) => {\n const results: Uint8Array[] = [];\n for (const result of playYrpStep(ocgcoreWrapper, yrpInput)) {\n results.push(result.result.raw);\n }\n return results;\n};\n", "import { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\n\nconst { LOCATION_DECK, POS_FACEUP_ATTACK } = OcgcoreScriptConstants;\n\nexport interface TestCardMessage {\n type: OcgcoreMessageType;\n message: string;\n}\n\nexport function testCard(\n ocgcoreWrapper: OcgcoreWrapper,\n ...ids: number[]\n): TestCardMessage[] {\n const logs: TestCardMessage[] = [];\n const duel = ocgcoreWrapper.createDuelV2(\n Array.from(\n { length: 8 },\n () => Math.floor(Math.random() * 0xffffffff) >>> 0,\n ),\n );\n\n ocgcoreWrapper.setMessageHandler((_duel, message, type) => {\n if (duel.duelPtr !== _duel.duelPtr) return;\n logs.push({ type, message });\n });\n\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n duel.setPlayerInfo({ player: 0, lp: 8000, startHand: 5, drawCount: 1 });\n duel.setPlayerInfo({ player: 1, lp: 8000, startHand: 5, drawCount: 1 });\n\n for (const code of ids) {\n duel.newCard({\n code,\n owner: 0,\n player: 0,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEUP_ATTACK,\n });\n }\n\n duel.startDuel(0);\n\n while (true) {\n const { status, raw } = duel.process();\n if (raw.length > 0 && raw[0] === OcgcoreCommonConstants.MSG_RETRY) {\n break;\n }\n if (status === 0) {\n continue;\n }\n break;\n }\n\n duel.endDuel();\n return logs;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;;;ACAvB;AAAA;AAAA;AAAA;AAAA;AAAA,+BAGO;;;ACDA,IAAM,sBAAsB,gDAAuB;AACnD,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAE7B,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,aAAa;;;ACJnB,SAAS,QAAQ,KAAiB,QAAwB;AAC/D,SAAO,IAAI,SAAS,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU,EAAE;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,QAAQ,KAAiB,QAAwB;AAC/D,SAAO,IAAI,SAAS,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU,EAAE;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACF;;;AChBA,IAAM,UAAU,IAAI,YAAY;AAChC,IAAM,UAAU,IAAI,YAAY,OAAO;AAMhC,SAAS,WAAW,OAA2B;AACpD,SAAO,QAAQ,OAAO,KAAK;AAC7B;;;ACNA,IAAAA,4BAAgD;AASzC,SAAS,eACd,KACA,QACkB;AAClB,MAAI,UAAU,YAAY;AACxB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,SAAS,GAAG,MAAM;AACtC,SAAO,IAAI,oCAAU,EAAE,YAAY,OAAO;AAC5C;AAEO,SAAS,oBACd,KACA,QACa;AACb,QAAM,QAAqB,CAAC;AAC5B,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,QAAQ;AAC3B,UAAM,WAAW,QAAQ,KAAK,MAAM;AACpC,QAAI,YAAY,GAAG;AACjB;AAAA,IACF;AACA,UAAM,MAAM,KAAK,IAAI,QAAQ,SAAS,QAAQ;AAC9C,QAAI,YAAY,YAAY;AAC1B,YAAM,YAAY,IAAI,oCAAU;AAChC,gBAAU,QAAQ;AAClB,gBAAU,QAAQ;AAClB,YAAM,KAAK,SAAS;AAAA,IACtB,OAAO;AACL,YAAM,UAAU,IAAI,SAAS,SAAS,GAAG,GAAG;AAC5C,YAAM,KAAK,IAAI,oCAAU,EAAE,YAAY,OAAO,CAAC;AAAA,IACjD;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEO,SAAS,eAAe,KAAuC;AAIpE,SAAO,IAAI,+CAAqB,EAAE,YAAY,GAAG;AACnD;AAEO,SAAS,kBAAkB,KAA2B;AAC3D,QAAM,OAAiB,CAAC;AACxB,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,IAAI,QAAQ;AAC/B,UAAM,MAAM,QAAQ,KAAK,MAAM;AAC/B,cAAU;AACV,QAAI,SAAS,MAAM,IAAI,QAAQ;AAC7B;AAAA,IACF;AACA,UAAM,WAAW,IAAI,SAAS,QAAQ,SAAS,GAAG;AAClD,cAAU;AACV,SAAK,KAAK,WAAW,QAAQ,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,KAAsC;AACtE,QAAM,UAA+B,CAAC;AACtC,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,IAAI,QAAQ;AAC/B,UAAM,SAAS,QAAQ,KAAK,MAAM;AAClC,UAAM,SAAS,QAAQ,KAAK,SAAS,CAAC;AACtC,cAAU;AACV,QAAI,SAAS,SAAS,SAAS,IAAI,QAAQ;AACzC;AAAA,IACF;AACA,UAAM,WAAW,IAAI,SAAS,QAAQ,SAAS,MAAM;AACrD,cAAU;AACV,UAAM,aAAa,IAAI,SAAS,QAAQ,SAAS,MAAM;AACvD,cAAU;AACV,UAAM,QAA2B;AAAA,MAC/B,KAAK,WAAW,QAAQ;AAAA,MACxB,OAAO;AAAA,IACT;AACA,UAAM,YAAY,WAAW,UAAU;AACvC,YAAQ,KAAK,KAAK;AAAA,EACpB;AACA,SAAO;AACT;;;AC5FO,SAAS,0BACd,SACQ;AACR,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,QAAQ;AACjC,MAAI,cAAc,QAAQ,WAAW;AACrC,MAAI,QAAQ,OAAO,QAAQ;AACzB,eAAW,QAAQ,QAAQ,OAAO;AAChC,qBAAe,cAAc,UAAU;AAAA,IACzC;AAAA,EACF;AACA,WAAU,WAAW,UAAW,KAAO,cAAc,WAAa;AACpE;;;ACmBA,IAAAC,4BAIO;AAEA,IAAM,cAAN,MAAkB;AAAA,EAIvB,YACS,gBACA,SACP;AAFO;AACA;AALT,SAAQ,YAAY;AACpB,SAAQ,aAAa;AAerB,iBAAQ;AAAA,EAVL;AAAA,EAEH,UAAU,SAAiD;AACzD,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,KAAK,eAAe,OAAO,KAAK,UAAU;AAAA,IAC7D;AACA,UAAM,cAAc,0BAA0B,OAAO;AACrD,SAAK,eAAe,cAAc,YAAY,KAAK,SAAS,WAAW;AAAA,EACzE;AAAA,EAIA,UAAgB;AACd,QAAI,KAAK,MAAO;AAChB,SAAK,QAAQ;AACb,SAAK,eAAe,cAAc,UAAU,KAAK,OAAO;AACxD,QAAI,KAAK,WAAW;AAClB,WAAK,eAAe,KAAK,KAAK,SAAS;AACvC,WAAK,YAAY;AAAA,IACnB;AACA,SAAK,eAAe,WAAW,KAAK,OAAO;AAAA,EAC7C;AAAA,EAEA,cAAc,MAAwC;AACpD,SAAK,eAAe,cAAc;AAAA,MAChC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,eAAe,QAAwB;AACrC,WAAO,KAAK,eAAe,cAAc;AAAA,MACvC,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,QAAsC;AACvD,UAAM,MAAM,KAAK,eAAe,OAAO,mBAAmB;AAC1D,SAAK,eAAe,cAAc,aAAa,KAAK,SAAS,GAAG;AAChE,UAAM,MAAM,KAAK,eAAe,SAAS,KAAK,MAAM;AACpD,SAAK,eAAe,KAAK,GAAG;AAC5B,WAAO,EAAE,QAAQ,IAAI;AAAA,EACvB;AAAA,EAEA,UAAgC;AAC9B,UAAM,SAAS,KAAK,eAAe,cAAc,SAAS,KAAK,OAAO;AACtE,UAAM,UAAU,SAAS,eAAgB;AACzC,UAAM,UAAW,WAAW,KAAM,QAAU;AAC5C,UAAM,cAAc,KAAK,WAAW,MAAM;AAG1C,QAAI;AACJ,QAAI,YAAY,IAAI,SAAS,GAAG;AAC9B,UAAI;AACF,wBAAgB,yCAAe,uBAAuB,YAAY,GAAG;AAAA,MACvE,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ,YAAY;AAAA,MACpB,KAAK,YAAY;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,CAAC,QAAQ,UAAuD;AAC9D,WAAO,MAAM;AACX,YAAM,MAAM,KAAK,QAAQ;AACzB,YAAM;AACN,UAAI,IAAI,WAAW,KAAK,IAAI,mBAAmB,0CAAgB;AAC7D;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,KAAK,IAAI,IAAI,SAAS,GAAG;AAC1C,cAAM,WAAW,WAAW;AAC5B,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AACA,aAAK,YAAY,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,MAAkC;AACxC,SAAK,eAAe,cAAc;AAAA,MAChC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,WAAW,MAAqC;AAC9C,SAAK,eAAe,cAAc;AAAA,MAChC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,UAAU,OAAuD;AAC/D,UAAM,MAAM,KAAK,eAAe,OAAO,iBAAiB;AACxD,UAAM,SAAS,KAAK,eAAe,cAAc;AAAA,MAC/C,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,MAAM,YAAY;AAAA,IACpB;AACA,UAAM,MAAM,KAAK,eAAe,SAAS,KAAK,MAAM;AACpD,SAAK,eAAe,KAAK,GAAG;AAC5B,UAAM,OAAO,UAAU,aAAa,OAAO,eAAe,KAAK,MAAM;AACrE,WAAO,EAAE,QAAQ,KAAK,KAAK;AAAA,EAC7B;AAAA,EAEA,gBAAgB,OAA6C;AAC3D,WAAO,KAAK,eAAe,cAAc;AAAA,MACvC,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,eACE,OAC6B;AAC7B,UAAM,MAAM,KAAK,eAAe,OAAO,iBAAiB;AACxD,UAAM,SAAS,KAAK,eAAe,cAAc;AAAA,MAC/C,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,MAAM,YAAY;AAAA,IACpB;AACA,UAAM,MAAM,KAAK,eAAe,SAAS,KAAK,MAAM;AACpD,SAAK,eAAe,KAAK,GAAG;AAC5B,UAAM,QAAQ,oBAAoB,KAAK,MAAM;AAC7C,WAAO,EAAE,QAAQ,KAAK,MAAM;AAAA,EAC9B;AAAA,EAEA,iBAAyC;AACvC,UAAM,MAAM,KAAK,eAAe,OAAO,iBAAiB;AACxD,UAAM,SAAS,KAAK,eAAe,cAAc;AAAA,MAC/C,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,MAAM,KAAK,eAAe,SAAS,KAAK,MAAM;AACpD,SAAK,eAAe,KAAK,GAAG;AAC5B,UAAM,QAAQ,eAAe,GAAG;AAChC,WAAO,EAAE,QAAQ,KAAK,MAAM;AAAA,EAC9B;AAAA,EAEA,eAAe,OAAqB;AAClC,SAAK,eAAe,cAAc,eAAe,KAAK,SAAS,KAAK;AAAA,EACtE;AAAA,EAEA,YAAY,UAAqC;AAC/C,QAAI,OAAO,aAAa,UAAU;AAChC,WAAK,eAAe,QAAQ;AAC5B;AAAA,IACF;AACA,QAAI,SAAS,SAAS,KAAK,YAAY;AACrC,WAAK,eAAe,KAAK,KAAK,SAAS;AACvC,WAAK,YAAY,KAAK,eAAe,OAAO,SAAS,MAAM;AAC3D,WAAK,aAAa,SAAS;AAAA,IAC7B;AACA,SAAK,eAAe,QAAQ,KAAK,WAAW,QAAQ;AACpD,SAAK,eAAe,cAAc;AAAA,MAChC,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,cAAc,YAA0B;AACtC,SAAK,eAAe;AAAA,MAClB,CAAC,QACC,KAAK,eAAe,cAAc,gBAAgB,KAAK,SAAS,GAAG;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB,KAAyC;AACxD,UAAM,SAAS,KAAK,eAAe,OAAO,oBAAoB;AAC9D,UAAM,SAAS,KAAK,eAAe;AAAA,MACjC,CAAC,WACC,KAAK,eAAe,cAAc;AAAA,QAChC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,MAAM,KAAK,eAAe,SAAS,QAAQ,KAAK,IAAI,GAAG,MAAM,CAAC;AACpE,SAAK,eAAe,KAAK,MAAM;AAC/B,UAAM,QAAQ;AACd,UAAM,OAAO,UAAU,IAAI,WAAW,GAAG,IAAI;AAC7C,WAAO,EAAE,QAAQ,KAAK,OAAO,KAAK;AAAA,EACpC;AAAA,EAEA,iBAAiB,KAAa,OAAqB;AACjD,SAAK,eAAe;AAAA,MAClB,CAAC,QAAQ,aACP,KAAK,eAAe,cAAc;AAAA,QAChC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,kBAA6C;AAC3C,UAAM,SAAS,KAAK,eAAe,OAAO,oBAAoB;AAC9D,UAAM,SAAS,KAAK,eAAe,cAAc;AAAA,MAC/C,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,MAAM,KAAK,eAAe,SAAS,QAAQ,KAAK,IAAI,GAAG,MAAM,CAAC;AACpE,SAAK,eAAe,KAAK,MAAM;AAC/B,UAAM,OAAO,UAAU,IAAI,kBAAkB,GAAG,IAAI,CAAC;AACrD,WAAO,EAAE,QAAQ,KAAK,KAAK;AAAA,EAC7B;AAAA,EAEA,gBAAsB;AACpB,SAAK,eAAe,cAAc,gBAAgB,KAAK,OAAO;AAAA,EAChE;AAAA,EAEA,eAA0C;AACxC,UAAM,SAAS,KAAK,eAAe,OAAO,oBAAoB;AAC9D,UAAM,SAAS,KAAK,eAAe,cAAc;AAAA,MAC/C,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,MAAM,KAAK,eAAe,SAAS,QAAQ,KAAK,IAAI,GAAG,MAAM,CAAC;AACpE,SAAK,eAAe,KAAK,MAAM;AAG/B,UAAM,OAA+B,CAAC;AACtC,QAAI,SAAS,GAAG;AACd,YAAM,UAAU,kBAAkB,GAAG;AACrC,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,cAAc,QAAW;AACjC,eAAK,MAAM,GAAG,IAAI,MAAM;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK,KAAK;AAAA,EAC7B;AAAA,EAEA,aAAa,OAAkD;AAC7D,QAAI,iBAAiB,YAAY;AAE/B,WAAK,eAAe;AAAA,QAClB,CAAC,QACC,KAAK,eAAe,cAAc;AAAA,UAChC,KAAK;AAAA,UACL;AAAA,UACA,MAAM;AAAA,QACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AAEL,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,aAAK,iBAAiB,KAAK,KAAK;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;;;AC1UA,IAAAC,4BAAyB;;;ACFlB,IAAK,qBAAL,kBAAKC,wBAAL;AACL,EAAAA,oBAAA,iBAAc;AACd,EAAAA,oBAAA,kBAAe;AAFL,SAAAA;AAAA,GAAA;AAKL,IAAK,kBAAL,kBAAKC,qBAAL;AACL,EAAAA,kCAAA,WAAQ,KAAR;AACA,EAAAA,kCAAA,WAAQ,KAAR;AACA,EAAAA,kCAAA,iBAAc,KAAd;AACA,EAAAA,kCAAA,mBAAgB,KAAhB;AACA,EAAAA,kCAAA,oBAAiB,KAAjB;AALU,SAAAA;AAAA,GAAA;AAQL,IAAK,wBAAL,kBAAKC,2BAAL;AACL,EAAAA,8CAAA,cAAW,KAAX;AACA,EAAAA,8CAAA,qBAAkB,KAAlB;AACA,EAAAA,8CAAA,oBAAiB,KAAjB;AACA,EAAAA,8CAAA,mBAAgB,MAAhB;AACA,EAAAA,8CAAA,aAAU,MAAV;AACA,EAAAA,8CAAA,cAAW,MAAX;AACA,EAAAA,8CAAA,mBAAgB,OAAhB;AACA,EAAAA,8CAAA,mBAAgB,OAAhB;AARU,SAAAA;AAAA,GAAA;;;ADPL,IAAM,iBAAN,MAAqB;AAAA,EAsB1B,YACS,eACP,SACA;AAFO;AAtBT,SAAQ,kBAAkB;AAC1B,SAAQ,mBAAmB;AAC3B,SAAQ,eAAe;AACvB,SAAQ,gBAAgB;AACxB,SAAQ,qBAAqB;AAC7B,SAAQ,sBAAsB;AAE9B,SAAQ,mBAAmB;AAC3B,SAAQ,iBAAiB;AACzB,SAAQ,qBAAqB;AAE7B,SAAO,gBAAgC,CAAC;AACxC,SAAO,cAA4B,CAAC;AACpC,SAAO,kBAAoC,CAAC;AAI5C,SAAQ,UAAU,IAAI,YAAY;AAClC,SAAQ,UAAU,IAAI,YAAY,OAAO;AACzC,SAAQ,QAAQ,oBAAI,IAAyB;AAM3C,SAAK,SAAS,cAAc;AAC5B,SAAK,WAAW,IAAI,SAAS,KAAK,OAAO,MAAM;AAC/C,SAAK,mBAAmB,SAAS,oBAAoB;AACrD,SAAK,gBAAgB,SAAS,iBAAiB;AAE/C,SAAK,mBAAmB,KAAK,eAAe,CAAC,WAAW,WAAW;AACjE,YAAM,aAAa,KAAK,cAAc,SAAS;AAC/C,YAAM,UAAU,KAAK,WAAW,UAAU;AAC1C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,KAAK,iBAAiB;AACzB,aAAK,kBAAkB,KAAK,cAAc;AAAA,UACxC,KAAK;AAAA,QACP;AAAA,MACF;AAEA,YAAM,QAAQ;AACd,UAAI,MAAM,SAAS,KAAK,kBAAkB;AACxC,aAAK,cAAc,MAAM,KAAK,eAAe;AAC7C,aAAK,kBAAkB,KAAK,cAAc,QAAQ,MAAM,MAAM;AAC9D,aAAK,mBAAmB,MAAM;AAAA,MAChC;AAEA,WAAK,OAAO,IAAI,OAAO,KAAK,eAAe;AAC3C,WAAK,SAAS,SAAS,QAAQ,MAAM,QAAQ,IAAI;AACjD,aAAO,KAAK;AAAA,IACd,GAAG,KAAK;AACR,SAAK,cAAc,mBAAmB,KAAK,gBAAgB;AAE3D,SAAK,iBAAiB,KAAK,eAAe,CAAC,QAAQ,gBAAgB;AACjE,YAAM,OAAO,KAAK,SAAS,MAAM;AACjC,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,IAAI,mCAAS,EAAE,YAAY,IAAI,EAAE,UAAU;AACvD,WAAK,OAAO,IAAI,KAAK,WAAW;AAChC,aAAO;AAAA,IACT,GAAG,KAAK;AACR,SAAK,cAAc,iBAAiB,KAAK,cAAc;AAEvD,SAAK,qBAAqB,KAAK,eAAe,CAAC,SAAS,gBAAgB;AACtE,UAAI,CAAC,KAAK,cAAc;AACtB,aAAK,eAAe,KAAK,cAAc,QAAQ,KAAK,aAAa;AAAA,MACnE;AACA,WAAK,cAAc,iBAAiB,SAAS,KAAK,YAAY;AAC9D,YAAM,UAAU,KAAK,cAAc,KAAK,YAAY;AACpD,YAAM,OACJ,gBAAgB;AAGlB,YAAM,OAAO,KAAK,gBAAgB,OAAO;AACzC,WAAK,cAAc,MAAM,SAAS,IAAI;AAAA,IACxC,GAAG,KAAK;AACR,SAAK,cAAc,qBAAqB,KAAK,kBAAkB;AAAA,EACjE;AAAA,EAEA,WAAW,YAAuC;AAChD,QAAI;AACJ,eAAW,UAAU,KAAK,eAAe;AACvC,UAAI;AACF,kBAAU,OAAO,UAAU;AAAA,MAC7B,QAAQ;AACN,kBAAU;AAAA,MACZ;AACA,UAAI,WAAW,MAAM;AACnB;AAAA,MACF;AAAA,IACF;AACA,WAAO,OAAO,YAAY,WACtB,KAAK,QAAQ,OAAO,OAAO,IAC1B,WAAW;AAAA,EAClB;AAAA,EAEA,SAAS,QAA0C;AACjD,QAAI;AACJ,eAAW,UAAU,KAAK,aAAa;AACrC,UAAI;AACF,eAAO,OAAO,MAAM;AAAA,MACtB,QAAQ;AACN,eAAO;AAAA,MACT;AACA,UAAI,MAAM;AACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,cACE,MACA,SACA,MACM;AACN,eAAW,WAAW,KAAK,iBAAiB;AAC1C,UAAI;AACF,gBAAQ,MAAM,SAAS,IAAI;AAAA,MAC7B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,KAAqB;AACjC,QAAI,SAAS;AACb,WAAO,KAAK,OAAO,MAAM,MAAM,MAAM,GAAG;AACtC;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,OAAO,KAAK,OAAO,SAAS,KAAK,MAAM,MAAM,CAAC;AAAA,EACpE;AAAA,EAEA,QAAQ,KAAa,MAAwB;AAC3C,SAAK,OAAO,IAAI,MAAM,GAAG;AAAA,EAC3B;AAAA,EAEA,SAAS,KAAa,QAA4B;AAChD,WAAO,KAAK,OAAO,MAAM,KAAK,MAAM,MAAM;AAAA,EAC5C;AAAA,EAEA,WACE,OACG,MACA;AACH,UAAM,UAAU,KAAK;AAAA,MAAI,CAAC,SACxB,OAAO,SAAS,WAAW,KAAK,QAAQ,OAAO,IAAI,IAAI;AAAA,IACzD;AACA,UAAM,cAAc,QAAQ;AAAA,MAC1B,CAAC,KAAK,UAAU,MAAM,MAAM,SAAS;AAAA,MACrC;AAAA,IACF;AACA,QAAI,cAAc,KAAK,qBAAqB;AAC1C,UAAI,KAAK,oBAAoB;AAC3B,aAAK,cAAc,MAAM,KAAK,kBAAkB;AAAA,MAClD;AACA,WAAK,qBAAqB,KAAK,cAAc,QAAQ,WAAW;AAChE,WAAK,sBAAsB;AAAA,IAC7B;AAEA,QAAI,SAAS;AACb,UAAM,OAAO,QAAQ,IAAI,CAAC,UAAU;AAClC,YAAM,MAAM,KAAK,qBAAqB;AACtC,WAAK,OAAO,IAAI,OAAO,GAAG;AAC1B,WAAK,OAAO,MAAM,MAAM,MAAM,IAAI;AAClC,gBAAU,MAAM,SAAS;AACzB,aAAO;AAAA,IACT,CAAC;AAED,WAAO,GAAG,GAAG,IAAI;AAAA,EACnB;AAAA,EAEQ,eACN,IACA,WACQ;AACR,WAAO,KAAK,cAAc,YAAY,IAAI,SAAS;AAAA,EACrD;AAAA,EAEA,YACE,IACA,WACQ;AACR,WAAO,KAAK,cAAc,YAAY,IAAI,SAAS;AAAA,EACrD;AAAA,EAEA,eAAe,OAAqB;AAClC,SAAK,cAAc,eAAe,KAAK;AAAA,EACzC;AAAA,EAEA,WAAW,MAA2B;AACpC,UAAM,UAAU,KAAK,cAAc,aAAa,IAAI;AACpD,WAAO,KAAK,gBAAgB,OAAO;AAAA,EACrC;AAAA,EAEA,aAAa,cAAqC;AAChD,UAAM,QAAQ,aAAa;AAC3B,UAAM,aAAa,QAAQ;AAC3B,UAAM,MAAM,KAAK,cAAc,QAAQ,UAAU;AACjD,UAAM,OAAO,IAAI,YAAY,KAAK,OAAO,QAAQ,KAAK,KAAK;AAC3D,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,WAAK,CAAC,IAAI,aAAa,CAAC,MAAM;AAAA,IAChC;AACA,UAAM,UAAU,KAAK,cAAc,gBAAgB,GAAG;AACtD,SAAK,cAAc,MAAM,GAAG;AAC5B,WAAO,KAAK,gBAAgB,OAAO;AAAA,EACrC;AAAA,EAEA,qBAAqB,SAAiB,SAAyB;AAC7D,WAAO,KAAK,cAAc,uBAAuB,SAAS,OAAO;AAAA,EACnE;AAAA,EAEA,OAAO,MAAsB;AAC3B,WAAO,KAAK,cAAc,QAAQ,IAAI;AAAA,EACxC;AAAA,EAEA,KAAK,KAAmB;AACtB,SAAK,cAAc,MAAM,GAAG;AAAA,EAC9B;AAAA,EAEA,aAAmB;AACjB,SAAK,cAAc,cAAc;AAAA,EACnC;AAAA,EAEA,gBAAgB,QAAsB,QAAQ,OAAa;AACzD,QAAI,OAAO;AACT,WAAK,gBAAgB,CAAC;AAAA,IACxB;AACA,SAAK,cAAc,KAAK,MAAM;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,QAAoB,QAAQ,OAAa;AACrD,QAAI,OAAO;AACT,WAAK,cAAc,CAAC;AAAA,IACtB;AACA,SAAK,YAAY,KAAK,MAAM;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,SAAyB,QAAQ,OAAa;AAC9D,QAAI,OAAO;AACT,WAAK,kBAAkB,CAAC;AAAA,IAC1B;AACA,SAAK,gBAAgB,KAAK,OAAO;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,SAA8B;AAC5C,UAAM,WAAW,KAAK,MAAM,IAAI,OAAO;AACvC,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AACA,UAAM,OAAO,IAAI,YAAY,MAAM,OAAO;AAC1C,SAAK,MAAM,IAAI,SAAS,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,SAAuB;AAChC,SAAK,MAAM,OAAO,OAAO;AAAA,EAC3B;AAAA,EAEA,WAAiB;AACf,QAAI,KAAK,kBAAkB;AACzB,WAAK,cAAc,eAAe,KAAK,gBAAgB;AACvD,WAAK,mBAAmB;AAAA,IAC1B;AACA,QAAI,KAAK,gBAAgB;AACvB,WAAK,cAAc,eAAe,KAAK,cAAc;AACrD,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,KAAK,oBAAoB;AAC3B,WAAK,cAAc,eAAe,KAAK,kBAAkB;AACzD,WAAK,qBAAqB;AAAA,IAC5B;AAEA,QAAI,KAAK,iBAAiB;AACxB,WAAK,cAAc,MAAM,KAAK,eAAe;AAC7C,WAAK,kBAAkB;AACvB,WAAK,mBAAmB;AAAA,IAC1B;AACA,QAAI,KAAK,cAAc;AACrB,WAAK,cAAc,MAAM,KAAK,YAAY;AAC1C,WAAK,eAAe;AACpB,WAAK,gBAAgB;AAAA,IACvB;AACA,QAAI,KAAK,oBAAoB;AAC3B,WAAK,cAAc,MAAM,KAAK,kBAAkB;AAChD,WAAK,qBAAqB;AAC1B,WAAK,sBAAsB;AAAA,IAC7B;AAAA,EACF;AACF;;;AE5SO,SAAS,wBAAwB,KAA8B;AACpE,QAAM,QAAQ;AACd,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAQ,MAAgC,YAAY,YAAY;AAC3E,WAAQ,MAAsC;AAAA,EAChD;AACA,QAAM,IAAI,MAAM,gCAAgC;AAClD;;;ACbO,SAAS,eAAkB,IAAY,OAA0B;AACtE,QAAM,MACJ,OAAO,OAAO,YAAY,cAAc,OAAO,UAAU;AAC3D,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,IAAI,EAAE;AAAA,EACf,QAAQ;AACN,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI;AACF,aAAO,IAAI,KAAK;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACGO,SAAS,UAAU,UAAU,OAAsB;AACxD,QAAM,MAAM,eAAuB,WAAW,IAAI;AAClD,MAAI,IAAK,QAAO;AAChB,MAAI,QAAS,QAAO;AACpB,QAAM,IAAI,MAAM,qCAAqC;AACvD;;;AClBO,SAAS,YAAY,UAAU,OAAwB;AAC5D,QAAM,MAAM,eAAyB,aAAa,MAAM;AACxD,MAAI,IAAK,QAAO;AAChB,MAAI,QAAS,QAAO;AACpB,QAAM,IAAI,MAAM,uCAAuC;AACzD;;;ACNA,eAAsB,qBAA8C;AAElE,QAAM,MAAM,QAAQ,kCAAkC;AACtD,QAAM,cAAc,wBAAwB,GAAG;AAE/C,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,YAAY,IAAI;AAChC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,oBAAuC;AAC3C,QAAM,WAAW,QAAQ;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,wBAAoB,GAAG,aAAa,QAAQ;AAAA,EAC9C;AAEA,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,cAAc;AAC1B,QAAI,CAAC,WAAW,cAAc,CAAC,WAAW,YAAY;AACpD,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,YAAY,kBAAkB;AAAA,MAChC,CAAC;AAAA,IACH;AACA,WAAO,YAAY,SAAS;AAAA,EAC9B;AACF;;;ACjCA,eAAsB,qBACpB,UAAuC,CAAC,GACf;AACzB,QAAM,UAAU,MAAM,mBAAmB;AACzC,QAAM,YAAoC;AAAA,IACxC,GAAG,QAAQ;AAAA,EACb;AACA,MAAI,QAAQ,YAAY;AACtB,cAAU,aACR,QAAQ;AAAA,EACZ;AACA,MAAI,QAAQ,YAAY;AACtB,cAAU,aACR,QAAQ;AAAA,EACZ;AACA,QAAM,iBAAiB,MAAM,QAAQ,SAAS;AAC9C,SAAO,IAAI,eAAe,cAAc;AAC1C;;;AC3BA,mBAAkB;AAMlB,IAAM,gBAAgB;AAEtB,SAAS,cAAc,OAAuB;AAC5C,MAAI,OAAO,MAAM,QAAQ,OAAO,GAAG;AACnC,MAAI,KAAK,WAAW,aAAa,GAAG;AAClC,WAAO,KAAK,MAAM,cAAc,MAAM;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAA4B;AACnD,QAAM,UAAU;AAAA,IACd;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,qBAAqB,QAAQ;AAAA,IAC7B,UAAU,QAAQ;AAAA,EACpB;AACA,QAAM,aAAuB,CAAC;AAC9B,aAAW,SAAS,SAAS;AAC3B,eAAW,KAAK,KAAK;AACrB,QAAI,CAAC,MAAM,WAAW,IAAI,GAAG;AAC3B,YAAM,WAAW,MAAM,WAAW,GAAG,IACjC,KAAK,MAAM,MAAM,CAAC,CAAC,KACnB,KAAK,KAAK;AACd,iBAAW,KAAK,QAAQ;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,SAAiB,cAA8B;AAC/D,QAAM,UAAU,YAAY;AAC5B,MAAI,SAAS;AACX,WAAO,QAAQ,KAAK,SAAS,YAAY;AAAA,EAC3C;AACA,QAAM,cAAc,QAAQ,QAAQ,WAAW,EAAE;AACjD,QAAM,aAAa,aAAa,QAAQ,WAAW,EAAE;AACrD,SAAO,GAAG,WAAW,IAAI,UAAU;AACrC;AAEO,SAAS,mBACX,MACW;AACd,SAAO,CAAC,SAAS;AACf,UAAM,WAAW,cAAc,IAAI;AACnC,QAAI,CAAC,SAAS,YAAY,EAAE,SAAS,MAAM,GAAG;AAC5C,aAAO;AAAA,IACT;AACA,UAAM,aAAa,gBAAgB,QAAQ;AAC3C,eAAW,aAAa,YAAY;AAClC,iBAAW,OAAO,MAAM;AACtB,YAAI,IAAI,IAAI,SAAS,GAAG;AACtB,iBAAO,IAAI,IAAI,SAAS,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,UAAkC;AACnE,QAAM,KAAK,UAAU;AACrB,SAAO,CAAC,SAAS;AACf,UAAM,WAAW,cAAc,IAAI;AACnC,QAAI,CAAC,SAAS,YAAY,EAAE,SAAS,MAAM,GAAG;AAC5C,aAAO;AAAA,IACT;AACA,UAAM,aAAa,gBAAgB,QAAQ;AAC3C,eAAW,WAAW,UAAU;AAC9B,iBAAW,aAAa,YAAY;AAClC,cAAM,aAAa,UAAU,WAAW,GAAG,IACvC,UAAU,MAAM,CAAC,IACjB;AACJ,cAAM,WAAW,SAAS,SAAS,UAAU;AAC7C,YAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,iBAAO,GAAG,aAAa,QAAQ;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBAAsB,MAAwB;AACrD,QAAM,aAAa,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,UAAU,EAAE;AAChE,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,IAAI,UAAU;AACpB,MAAI,WAAW,WAAW,SAAS,GAAG;AACpC,UAAM,IAAI,WAAW,MAAM,UAAU,MAAM,CAAC;AAAA,EAC9C;AACA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,eAAsB,mBACjB,QACoB;AACvB,QAAM,OAAO,MAAM,QAAQ;AAAA,IACzB,OAAO,IAAI,OAAO,SAAS;AACzB,YAAM,MAAM,MAAM,aAAAC,QAAM,UAAU,IAAI;AACtC,YAAM,MAAM,oBAAI,IAAiC;AACjD,YAAM,UAAU,OAAO,OAAO,IAAI,KAAK;AACvC,YAAM,QAAQ;AAAA,QACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAI,MAAM,KAAK;AACb;AAAA,UACF;AACA,cAAI,CAAC,MAAM,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AAC9C;AAAA,UACF;AACA,gBAAM,UAAU,MAAM,MAAM,MAAM,YAAY;AAC9C,qBAAW,QAAQ,sBAAsB,MAAM,IAAI,GAAG;AACpD,gBAAI,IAAI,MAAM,OAAO;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,SAAO,gBAAgB,GAAG,IAAI;AAChC;AAGO,SAAS,aACX,MACW;AACd,SAAO,gBAAgB,GAAG,IAAI;AAChC;AAGO,SAAS,aAAa,UAAkC;AAC7D,SAAO,gBAAgB,GAAG,QAAQ;AACpC;AAGA,eAAsB,aACjB,QACoB;AACvB,SAAO,gBAAgB,GAAG,MAAM;AAClC;;;AC1IA,SAASC,UACP,SACA,SACA,KACQ;AACR,MAAI,SAAS;AACX,WAAO,QAAQ,KAAK,SAAS,GAAG;AAAA,EAClC;AACA,QAAM,cAAc,QAAQ,QAAQ,WAAW,EAAE;AACjD,QAAM,aAAa,IAAI,QAAQ,WAAW,EAAE;AAC5C,SAAO,GAAG,WAAW,IAAI,UAAU;AACrC;AAEA,eAAe,YAAY,IAAY,SAAoC;AACzE,MAAI;AACF,WAAO,MAAM,GAAG,SAAS,QAAQ,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,WACpB,IACA,SACA,SACmB;AACnB,QAAM,UAAoB,CAAC;AAC3B,QAAM,cAAc,MAAM,YAAY,IAAI,OAAO;AACjD,aAAW,SAAS,aAAa;AAC/B,UAAM,QAAQ,MAAM,YAAY;AAChC,QAAI,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC,MAAM,SAAS,MAAM,GAAG;AACtD;AAAA,IACF;AACA,UAAM,WAAWA,UAAS,SAAS,SAAS,KAAK;AACjD,QAAI;AACF,YAAM,QAAQ,MAAM,GAAG,SAAS,KAAK,QAAQ;AAC7C,UAAI,MAAM,OAAO,GAAG;AAClB,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgBA,UAAS,SAAS,SAAS,YAAY;AAC7D,QAAM,mBAAmB,MAAM,YAAY,IAAI,aAAa;AAC5D,aAAW,SAAS,kBAAkB;AACpC,UAAM,QAAQ,MAAM,YAAY;AAChC,QAAI,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC,MAAM,SAAS,MAAM,GAAG;AACtD;AAAA,IACF;AACA,UAAM,WAAWA,UAAS,SAAS,eAAe,KAAK;AACvD,QAAI;AACF,YAAM,QAAQ,MAAM,GAAG,SAAS,KAAK,QAAQ;AAC7C,UAAI,MAAM,OAAO,GAAG;AAClB,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC/DA,SAAS,qBAAwB,OAAiB,OAAkB;AAClE,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,GAAG,KAAK,oCAAoC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,eAAsB,qBACjB,UACoB;AACvB,QAAM,KAAK,qBAAqB,UAAU,GAAG,mBAAmB;AAChE,QAAM,UAAU,qBAAqB,YAAY,GAAG,mBAAmB;AACvE,QAAM,WAAW,gBAAgB,GAAG,QAAQ;AAE5C,QAAM,YAA0B,CAAC;AACjC,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,MAAM,WAAW,IAAI,SAAS,OAAO;AACtD,eAAW,WAAW,UAAU;AAC9B,UAAI;AACF,kBAAU,KAAK,MAAM,GAAG,SAAS,SAAS,OAAO,CAAC;AAAA,MACpD,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,gBAAgB,GAAG,SAAS;AACpD,SAAO,CAAC,SAAS,SAAS,IAAI,KAAK,UAAU,IAAI;AACnD;;;ACrBA,SAAS,yBAAyB,OAAkC;AAClE,MAAI,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,UAAU,CAAC;AAChE,QAAM,OAAiB,CAAC;AACxB,SAAO,QAAQ,MAAM,KAAK,SAAS,IAAI;AACrC,UAAM,QAAQ,MAAM;AACpB,QAAI,UAAU,IAAI;AAChB,WAAK,KAAK,OAAO,KAAK,CAAC;AAAA,IACzB;AACA,YAAQ;AAAA,EACV;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAkC;AAC1D,QAAM,QAAQ,IAAI,QAAQ,OAAO;AACjC,QAAM,SAAS,IAAI,OAAO;AAC1B,MAAI,UAAU,IAAI,OAAO;AACzB,MAAI,aAAa;AACjB,OAAK,OAAO,gDAAuB,eAAe,MAAM,GAAG;AACzD,iBAAa;AACb,cAAU;AAAA,EACZ;AACA,QAAM,YAAY,IAAI,SAAS,OAAO;AACtC,QAAM,SAAS,WAAW,SAAU;AACpC,QAAM,UAAW,aAAa,KAAM,SAAU;AAC9C,QAAM,UAAW,aAAa,KAAM,SAAU;AAE9C,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,OAAO,IAAI,SAAS;AAAA,IACpB,SAAS,yBAAyB,IAAI,WAAW,CAAC;AAAA,IAClD;AAAA,IACA;AAAA,IACA,YAAY,IAAI,aAAa,OAAO;AAAA,IACpC,OAAO,IAAI,QAAQ,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,SAAS,IAAc,QAA0C;AACxE,MAAI,OAAO,GAAG,YAAY,YAAY;AACpC,UAAM,OAAO,GAAG;AAAA,MACd;AAAA,IACF;AACA,QAAI;AACF,WAAK,KAAK,CAAC,MAAM,CAAC;AAClB,UAAI,CAAC,KAAK,KAAK,GAAG;AAChB,eAAO;AAAA,MACT;AACA,YAAMC,OAAM,KAAK,YAAY;AAC7B,UAAI,CAACA,QAAOA,KAAI,MAAM,MAAM;AAC1B,eAAO;AAAA,MACT;AACA,aAAO,iBAAiBA,IAAG;AAAA,IAC7B,UAAE;AACA,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,MAAM,GAAG;AAAA,IACb,2FAA2F,MAAM;AAAA,EACnG;AACA,MACE,CAAC,OACD,IAAI,WAAW,KACf,CAAC,IAAI,CAAC,EAAE,UACR,IAAI,CAAC,EAAE,OAAO,WAAW,GACzB;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC;AAC3B,SAAO,iBAAiB;AAAA,IACtB,IAAI,IAAI,CAAC;AAAA,IACT,OAAO,IAAI,CAAC;AAAA,IACZ,SAAS,IAAI,CAAC;AAAA,IACd,MAAM,IAAI,CAAC;AAAA,IACX,KAAK,IAAI,CAAC;AAAA,IACV,KAAK,IAAI,CAAC;AAAA,IACV,OAAO,IAAI,CAAC;AAAA,IACZ,MAAM,IAAI,CAAC;AAAA,IACX,WAAW,IAAI,CAAC;AAAA,EAClB,CAAC;AACH;AAEO,SAAS,mBAAmB,KAA6B;AAC9D,SAAO,CAAC,WAAmB;AACzB,eAAW,MAAM,KAAK;AACpB,YAAM,OAAO,SAAS,IAAI,MAAM;AAChC,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAGO,SAAS,yBAAyB,KAA6B;AACpE,SAAO,gBAAgB,GAAG,GAAG;AAC/B;;;ACxHA,IAAAC,gBAAkB;AAYlB,SAASC,UACP,SACA,SACA,KACQ;AACR,MAAI,SAAS;AACX,WAAO,QAAQ,KAAK,SAAS,GAAG;AAAA,EAClC;AACA,QAAM,cAAc,QAAQ,QAAQ,WAAW,EAAE;AACjD,QAAM,aAAa,IAAI,QAAQ,WAAW,EAAE;AAC5C,SAAO,GAAG,WAAW,IAAI,UAAU;AACrC;AAEA,SAASC,sBAAwB,OAAiB,OAAkB;AAClE,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,GAAG,KAAK,oCAAoC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,eAAeC,aAAY,IAAY,SAAoC;AACzE,MAAI;AACF,WAAO,MAAM,GAAG,SAAS,QAAQ,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,iBACb,IACA,SACA,SACmB;AACnB,QAAM,kBAAkB,OAAO,YAAuC;AACpE,UAAM,QAAkB,CAAC;AACzB,UAAM,UAAU,MAAMA,aAAY,IAAI,OAAO;AAC7C,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAE,SAAS,MAAM,GAAG;AACzC;AAAA,MACF;AACA,YAAM,WAAWF,UAAS,SAAS,SAAS,KAAK;AACjD,UAAI;AACF,cAAM,QAAQ,MAAM,GAAG,SAAS,KAAK,QAAQ;AAC7C,YAAI,MAAM,OAAO,GAAG;AAClB,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MACF,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAoB,CAAC;AAE3B,QAAM,gBAAgBA,UAAS,SAAS,SAAS,YAAY;AAC7D,UAAQ,KAAK,GAAI,MAAM,gBAAgB,aAAa,CAAE;AAEtD,UAAQ,KAAK,GAAI,MAAM,gBAAgB,OAAO,CAAE;AAEhD,SAAO;AACT;AAEA,SAAS,eAAe,WAA4B;AAClD,QAAM,aAAa,UAAU,QAAQ,OAAO,GAAG,EAAE,QAAQ,UAAU,EAAE;AACrE,SAAO,CAAC,WAAW,SAAS,GAAG,KAAK,WAAW,YAAY,EAAE,SAAS,MAAM;AAC9E;AAEA,eAAsB,cACpB,UACG,UACkB;AACrB,QAAM,KAAKC,sBAAqB,UAAU,GAAG,eAAe;AAC5D,QAAM,UAAUA,sBAAqB,YAAY,GAAG,eAAe;AAEnE,QAAM,MAAiB,CAAC;AACxB,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,MAAM,iBAAiB,IAAI,SAAS,OAAO;AAC3D,eAAW,UAAU,SAAS;AAC5B,UAAI;AACF,cAAM,QAAQ,MAAM,GAAG,SAAS,SAAS,MAAM;AAC/C,YAAI,KAAK,IAAI,MAAM,SAAS,KAAK,CAAC;AAAA,MACpC,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,MAAM,WAAW,IAAI,SAAS,OAAO;AACtD,eAAW,WAAW,UAAU;AAC9B,UAAI;AACF,cAAM,QAAQ,MAAM,GAAG,SAAS,SAAS,OAAO;AAChD,cAAM,MAAM,MAAM,cAAAE,QAAM,UAAU,KAAK;AACvC,cAAM,UAAU,OAAO,OAAO,IAAI,KAAK;AACvC,mBAAW,SAAS,SAAS;AAC3B,cAAI,MAAM,OAAO,CAAC,eAAe,MAAM,IAAI,GAAG;AAC5C;AAAA,UACF;AACA,cAAI;AACF,kBAAM,UAAU,MAAM,MAAM,MAAM,YAAY;AAC9C,gBAAI,KAAK,IAAI,MAAM,SAAS,OAAO,CAAC;AAAA,UACtC,QAAQ;AACN;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,gBAAgB,GAAI,GAA0C;AACvE;;;AC7HA,+BAA0B;AAM1B,IAAAC,4BAA+B;AAE/B,IAAM,EAAE,eAAe,gBAAgB,qBAAqB,IAC1D;AAEF,SAAS,aAAa,OAA0C;AAC9D,MAAI,iBAAiB,oCAAW;AAC9B,WAAO;AAAA,EACT;AACA,SAAO,IAAI,mCAAU,EAAE,QAAQ,KAAK;AACtC;AAEA,SAAS,SACP,MACA,MACA,OACA,QACM;AACN,MAAI,CAAC,KAAM;AACX,aAAW,QAAQ,KAAK,QAAQ,CAAC,GAAG;AAClC,SAAK,QAAQ;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,aAAW,QAAQ,KAAK,SAAS,CAAC,GAAG;AACnC,SAAK,QAAQ;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YACP,MACA,MACA,OACM;AACN,MAAI,CAAC,KAAM;AACX,aAAW,QAAQ,KAAK,QAAQ,CAAC,GAAG;AAClC,SAAK,WAAW;AAAA,MACd;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,aAAW,QAAQ,KAAK,SAAS,CAAC,GAAG;AACnC,SAAK,WAAW;AAAA,MACd;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iBAAiB,MAAmB,KAAa,OAAqB;AAC7E,OAAK,iBAAiB,KAAK,KAAK;AAClC;AAEO,SAAS,kBACd,SACA,UACA;AACA,QAAM,MAAM,aAAa,QAAQ;AACjC,QAAM,SAAS,IAAI;AACnB,QAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,QAAM,OACJ,aAAa,SAAS,IAClB,QAAQ,aAAa,YAAY,IACjC,QAAQ,WAAW,QAAQ,QAAQ,CAAC;AAE1C,mBAAiB,MAAM,aAAa,IAAI,QAAQ,QAAQ,QAAQ;AAChE,mBAAiB,MAAM,YAAY,OAAO,IAAI,OAAO,CAAC;AACtD,mBAAiB,MAAM,cAAc,OAAO,IAAI,SAAS,CAAC;AAC1D,mBAAiB,MAAM,cAAc,OAAO,IAAI,SAAS,CAAC;AAE1D,QAAM,cAAc,IAAI,QACpB;AAAA,IACE,IAAI;AAAA,IACJ,IAAI,eAAe;AAAA,IACnB,IAAI,iBAAiB;AAAA,IACrB,IAAI;AAAA,EACN,IACA,CAAC,IAAI,UAAU,IAAI,UAAU;AACjC,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,qBAAiB,MAAM,eAAe,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE;AAAA,EACjE;AACA,mBAAiB,MAAM,iBAAiB,GAAG;AAC3C,mBAAiB,MAAM,iBAAiB,GAAG;AAE3C,OAAK,cAAc;AAAA,IACjB,QAAQ;AAAA,IACR,IAAI,IAAI;AAAA,IACR,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,EACjB,CAAC;AACD,OAAK,cAAc;AAAA,IACjB,QAAQ;AAAA,IACR,IAAI,IAAI;AAAA,IACR,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,EACjB,CAAC;AAED,OAAK,cAAc,4BAA4B;AAC/C,OAAK,cAAc,sBAAsB;AACzC,OAAK,cAAc,mBAAmB;AAEtC,MAAI,IAAI,gBAAgB,IAAI,cAAc;AACxC,SAAK,cAAc,YAAY,IAAI,YAAY,EAAE;AAAA,EACnD,WAAW,IAAI,OAAO;AACpB,aAAS,MAAM,IAAI,UAAU,GAAG,CAAC;AACjC,gBAAY,MAAM,IAAI,aAAa,CAAC;AACpC,aAAS,MAAM,IAAI,YAAY,GAAG,CAAC;AACnC,gBAAY,MAAM,IAAI,eAAe,CAAC;AAAA,EACxC,OAAO;AACL,aAAS,MAAM,IAAI,UAAU,GAAG,CAAC;AACjC,aAAS,MAAM,IAAI,YAAY,GAAG,CAAC;AAAA,EACrC;AAEA,OAAK,UAAU,IAAI,QAAQ,CAAC;AAC5B,SAAO,EAAE,KAAK,KAAK;AACrB;AAEO,UAAU,YACf,gBACA,UACA;AACA,QAAM,EAAE,KAAK,KAAK,IAAI,kBAAkB,gBAAgB,QAAQ;AAEhE,QAAM,YAAY,IAAI,UAAU,MAAM;AACtC,MAAI;AACF,eAAW,UAAU,KAAK,QAAQ,MAAM,UAAU,MAAM,CAAC,GAAG;AAC1D,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,OAAO,mBAAmB,0CAAgB;AAC5C,cAAM,IAAI,MAAM,eAAe;AAAA,MACjC;AAAA,IACF;AAAA,EACF,UAAE;AACA,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,IAAM,UAAU,CACrB,gBACA,aACG;AACH,QAAM,UAAwB,CAAC;AAC/B,aAAW,UAAU,YAAY,gBAAgB,QAAQ,GAAG;AAC1D,YAAQ,KAAK,OAAO,OAAO,GAAG;AAAA,EAChC;AACA,SAAO;AACT;;;ACrKA,IAAM,EAAE,eAAAC,gBAAe,kBAAkB,IAAI;AAOtC,SAAS,SACd,mBACG,KACgB;AACnB,QAAM,OAA0B,CAAC;AACjC,QAAM,OAAO,eAAe;AAAA,IAC1B,MAAM;AAAA,MACJ,EAAE,QAAQ,EAAE;AAAA,MACZ,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,UAAU,MAAM;AAAA,IACnD;AAAA,EACF;AAEA,iBAAe,kBAAkB,CAAC,OAAO,SAAS,SAAS;AACzD,QAAI,KAAK,YAAY,MAAM,QAAS;AACpC,SAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC7B,CAAC;AAED,OAAK,cAAc,sBAAsB;AACzC,OAAK,cAAc,mBAAmB;AACtC,OAAK,cAAc,EAAE,QAAQ,GAAG,IAAI,KAAM,WAAW,GAAG,WAAW,EAAE,CAAC;AACtE,OAAK,cAAc,EAAE,QAAQ,GAAG,IAAI,KAAM,WAAW,GAAG,WAAW,EAAE,CAAC;AAEtE,aAAW,QAAQ,KAAK;AACtB,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAUA;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,OAAK,UAAU,CAAC;AAEhB,SAAO,MAAM;AACX,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,QAAQ;AACrC,QAAI,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,gDAAuB,WAAW;AACjE;AAAA,IACF;AACA,QAAI,WAAW,GAAG;AAChB;AAAA,IACF;AACA;AAAA,EACF;AAEA,OAAK,QAAQ;AACb,SAAO;AACT;;;AtBzDA,IACE,OAAO,eAAe,eACtB,CAAE,WAAoC,QACtC;AACA,EAAC,WAAoC,SAAS;AAChD;",
|
|
6
|
+
"names": ["import_ygopro_msg_encode", "import_ygopro_msg_encode", "import_ygopro_msg_encode", "OcgcoreMessageType", "OcgcoreDuelRule", "OcgcoreDuelOptionFlag", "JSZip", "joinPath", "row", "import_jszip", "joinPath", "getNodeModuleOrThrow", "safeReadDir", "JSZip", "import_ygopro_msg_encode", "LOCATION_DECK"]
|
|
7
7
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -136,7 +136,10 @@ function normalizeStartDuelOptions(options) {
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
// src/ocgcore-duel.ts
|
|
139
|
-
import {
|
|
139
|
+
import {
|
|
140
|
+
YGOProMessages,
|
|
141
|
+
YGOProMsgRetry
|
|
142
|
+
} from "ygopro-msg-encode";
|
|
140
143
|
var OcgcoreDuel = class {
|
|
141
144
|
constructor(ocgcoreWrapper, duelPtr) {
|
|
142
145
|
this.ocgcoreWrapper = ocgcoreWrapper;
|
|
@@ -203,6 +206,22 @@ var OcgcoreDuel = class {
|
|
|
203
206
|
message: parsedMessage
|
|
204
207
|
};
|
|
205
208
|
}
|
|
209
|
+
*advance(advancor) {
|
|
210
|
+
while (true) {
|
|
211
|
+
const res = this.process();
|
|
212
|
+
yield res;
|
|
213
|
+
if (res.status === 2 || res.message instanceof YGOProMsgRetry) {
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
if (res.status === 1 && res.raw.length > 0) {
|
|
217
|
+
const response = advancor?.();
|
|
218
|
+
if (!response) {
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
this.setResponse(response);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
206
225
|
newCard(card) {
|
|
207
226
|
this.ocgcoreWrapper.ocgcoreModule._new_card(
|
|
208
227
|
this.duelPtr,
|
|
@@ -1107,6 +1126,7 @@ async function DirCardReader(sqljs, ...baseDirs) {
|
|
|
1107
1126
|
|
|
1108
1127
|
// src/play-yrp.ts
|
|
1109
1128
|
import { YGOProYrp } from "ygopro-yrp-encode";
|
|
1129
|
+
import { YGOProMsgRetry as YGOProMsgRetry2 } from "ygopro-msg-encode";
|
|
1110
1130
|
var { LOCATION_DECK, LOCATION_EXTRA, POS_FACEDOWN_DEFENSE } = OcgcoreScriptConstants;
|
|
1111
1131
|
function normalizeYrp(input) {
|
|
1112
1132
|
if (input instanceof YGOProYrp) {
|
|
@@ -1206,45 +1226,19 @@ function createDuelFromYrp(wrapper, yrpInput) {
|
|
|
1206
1226
|
duel.startDuel(yrp.opt >>> 0);
|
|
1207
1227
|
return { yrp, duel };
|
|
1208
1228
|
}
|
|
1209
|
-
function consumeResponseFromOcgcoreProcess(duel, result, responses) {
|
|
1210
|
-
if (result.raw.length > 0 && result.raw[0] === OcgcoreCommonConstants.MSG_RETRY) {
|
|
1211
|
-
throw new Error("Got MSG_RETRY");
|
|
1212
|
-
}
|
|
1213
|
-
if (result.status === 0) {
|
|
1214
|
-
return false;
|
|
1215
|
-
}
|
|
1216
|
-
if (result.status === 1) {
|
|
1217
|
-
if (result.raw.length === 0) {
|
|
1218
|
-
return false;
|
|
1219
|
-
}
|
|
1220
|
-
const response = responses.shift();
|
|
1221
|
-
if (!response) {
|
|
1222
|
-
return true;
|
|
1223
|
-
}
|
|
1224
|
-
duel.setResponse(response);
|
|
1225
|
-
return false;
|
|
1226
|
-
}
|
|
1227
|
-
return true;
|
|
1228
|
-
}
|
|
1229
|
-
function* processYrpDuelStep(duel, yrp) {
|
|
1230
|
-
const responses = yrp.responses.slice();
|
|
1231
|
-
while (true) {
|
|
1232
|
-
const result = duel.process();
|
|
1233
|
-
yield {
|
|
1234
|
-
duel,
|
|
1235
|
-
result,
|
|
1236
|
-
responses
|
|
1237
|
-
};
|
|
1238
|
-
if (consumeResponseFromOcgcoreProcess(duel, result, responses)) {
|
|
1239
|
-
break;
|
|
1240
|
-
}
|
|
1241
|
-
}
|
|
1242
|
-
}
|
|
1243
1229
|
function* playYrpStep(ocgcoreWrapper, yrpInput) {
|
|
1244
1230
|
const { yrp, duel } = createDuelFromYrp(ocgcoreWrapper, yrpInput);
|
|
1231
|
+
const responses = yrp.responses.slice();
|
|
1245
1232
|
try {
|
|
1246
|
-
for (const
|
|
1247
|
-
yield
|
|
1233
|
+
for (const result of duel.advance(() => responses.shift())) {
|
|
1234
|
+
yield {
|
|
1235
|
+
duel,
|
|
1236
|
+
result,
|
|
1237
|
+
responses
|
|
1238
|
+
};
|
|
1239
|
+
if (result.message instanceof YGOProMsgRetry2) {
|
|
1240
|
+
throw new Error("Got MSG_RETRY");
|
|
1241
|
+
}
|
|
1248
1242
|
}
|
|
1249
1243
|
} finally {
|
|
1250
1244
|
duel.endDuel();
|
|
@@ -1327,7 +1321,6 @@ export {
|
|
|
1327
1321
|
ZipReader,
|
|
1328
1322
|
ZipScriptReader,
|
|
1329
1323
|
vendor_exports as _OcgcoreConstants,
|
|
1330
|
-
consumeResponseFromOcgcoreProcess,
|
|
1331
1324
|
createDuelFromYrp,
|
|
1332
1325
|
createOcgcoreWrapper,
|
|
1333
1326
|
createSqljsCardReader,
|
|
@@ -1339,7 +1332,6 @@ export {
|
|
|
1339
1332
|
parseRegistryKeys,
|
|
1340
1333
|
playYrp,
|
|
1341
1334
|
playYrpStep,
|
|
1342
|
-
processYrpDuelStep,
|
|
1343
1335
|
testCard
|
|
1344
1336
|
};
|
|
1345
1337
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../index.ts", "../src/vendor/index.ts", "../src/constants/ocgcore.ts", "../src/utility/binary.ts", "../src/utility/utf8.ts", "../src/adapters/ocgcore-parsers.ts", "../src/adapters/start-duel.ts", "../src/ocgcore-duel.ts", "../src/ocgcore-wrapper.ts", "../src/types/ocgcore-enums.ts", "../src/load-ocgcore-factory.esm.ts", "../src/ocgcore-wrapper-utils.ts", "../src/create-ocgcore-wrapper.ts", "../src/script-reader/script-readers.ts", "../src/utility/load-node-module.ts", "../src/utility/node-fs.ts", "../src/utility/node-path.ts", "../src/utility/search-zips.ts", "../src/script-reader/dir-script-reader-ex.ts", "../src/card-reader/sqljs-card-reader.ts", "../src/card-reader/dir-card-reader.ts", "../src/play-yrp.ts", "../src/test-card.ts"],
|
|
4
|
-
"sourcesContent": ["import { Buffer } from 'buffer';\n\nif (\n typeof globalThis !== 'undefined' &&\n !(globalThis as { Buffer?: unknown }).Buffer\n) {\n (globalThis as { Buffer?: unknown }).Buffer = Buffer;\n}\n\nexport * from './src/ocgcore-wrapper';\nexport * from './src/ocgcore-duel';\nexport * from './src/create-ocgcore-wrapper';\nexport * from './src/types';\nexport * from './src/adapters';\nexport * from './src/constants';\n// export * from './src/utility';\nexport * as _OcgcoreConstants from './src/vendor';\nexport * from './src/script-reader';\nexport * from './src/card-reader';\nexport * from './src/play-yrp';\nexport * from './src/test-card';\n", "export {\n OcgcoreCommonConstants,\n OcgcoreScriptConstants,\n} from 'ygopro-msg-encode';\n", "import { OcgcoreCommonConstants } from '../vendor';\n\nexport const MESSAGE_BUFFER_SIZE = OcgcoreCommonConstants.SIZE_MESSAGE_BUFFER;\nexport const QUERY_BUFFER_SIZE = 0x4000;\nexport const REGISTRY_BUFFER_SIZE = 0x2000;\n\nexport const LEN_FAIL = 0;\nexport const LEN_EMPTY = 4;\nexport const LEN_HEADER = 8;\n", "export function readU8(buf: Uint8Array, offset: number): number {\n return buf[offset] ?? 0;\n}\n\nexport function readU16(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint16(\n offset,\n true,\n );\n}\n\nexport function readI32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getInt32(\n offset,\n true,\n );\n}\n\nexport function readU32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint32(\n offset,\n true,\n );\n}\n", "const encoder = new TextEncoder();\nconst decoder = new TextDecoder('utf-8');\n\nexport function encodeUtf8(value: string): Uint8Array {\n return encoder.encode(value);\n}\n\nexport function decodeUtf8(value: Uint8Array): string {\n return decoder.decode(value);\n}\n", "import { LEN_HEADER } from '../constants';\nimport { readI32, readU16 } from '../utility/binary';\nimport { decodeUtf8 } from '../utility/utf8';\nimport { CardQuery, YGOProMsgReloadField } from 'ygopro-msg-encode';\n\n// Internal interface for registry parsing\ninterface RegistryDumpEntry {\n key: string;\n value: Uint8Array;\n valueText?: string;\n}\n\nexport function parseCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery | null {\n if (length <= LEN_HEADER) {\n return null;\n }\n const payload = raw.subarray(4, length);\n return new CardQuery().fromPayload(payload);\n}\n\nexport function parseFieldCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery[] {\n const cards: CardQuery[] = [];\n let offset = 0;\n while (offset + 4 <= length) {\n const chunkLen = readI32(raw, offset);\n if (chunkLen <= 0) {\n break;\n }\n const end = Math.min(length, offset + chunkLen);\n if (chunkLen <= LEN_HEADER) {\n const emptyCard = new CardQuery();\n emptyCard.flags = 0;\n emptyCard.empty = true;\n cards.push(emptyCard);\n } else {\n const payload = raw.subarray(offset + 4, end);\n cards.push(new CardQuery().fromPayload(payload));\n }\n offset += chunkLen;\n }\n return cards;\n}\n\nexport function parseFieldInfo(raw: Uint8Array): YGOProMsgReloadField {\n // query_field_info() in ocgcore returns data that starts with MSG_RELOAD_FIELD (162) byte\n // Format: [MSG_RELOAD_FIELD][duel_rule][player0_data][player1_data][chains]\n // YGOProMsgReloadField.fromPayload() expects the full message including the identifier\n return new YGOProMsgReloadField().fromPayload(raw);\n}\n\nexport function parseRegistryKeys(raw: Uint8Array): string[] {\n const keys: string[] = [];\n let offset = 0;\n while (offset + 2 <= raw.length) {\n const len = readU16(raw, offset);\n offset += 2;\n if (offset + len > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + len);\n offset += len;\n keys.push(decodeUtf8(keyBytes));\n }\n return keys;\n}\n\nexport function parseRegistryDump(raw: Uint8Array): RegistryDumpEntry[] {\n const entries: RegistryDumpEntry[] = [];\n let offset = 0;\n while (offset + 4 <= raw.length) {\n const keyLen = readU16(raw, offset);\n const valLen = readU16(raw, offset + 2);\n offset += 4;\n if (offset + keyLen + valLen > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + keyLen);\n offset += keyLen;\n const valueBytes = raw.subarray(offset, offset + valLen);\n offset += valLen;\n const entry: RegistryDumpEntry = {\n key: decodeUtf8(keyBytes),\n value: valueBytes,\n };\n entry.valueText = decodeUtf8(valueBytes);\n entries.push(entry);\n }\n return entries;\n}\n", "import { OcgcoreStartDuelOptions } from '../types/ocgcore-params';\n\nexport function normalizeStartDuelOptions(\n options: number | OcgcoreStartDuelOptions,\n): number {\n if (typeof options === 'number') {\n return options;\n }\n const duelRule = options.rule ?? 0;\n let duelOptions = options.options ?? 0;\n if (options.flags?.length) {\n for (const flag of options.flags) {\n duelOptions = (duelOptions | flag) >>> 0;\n }\n }\n return (((duelRule & 0xffff) << 16) | (duelOptions & 0xffff)) >>> 0;\n}\n", "import {\n OcgcoreCardQueryResult,\n OcgcoreFieldCardQueryResult,\n OcgcoreFieldInfoResult,\n OcgcoreMessageResult,\n OcgcoreProcessResult,\n OcgcoreRegistryDumpResult,\n OcgcoreRegistryKeysResult,\n OcgcoreRegistryValueResult,\n} from './types/ocgcore-results';\nimport {\n OcgcoreNewCardParams,\n OcgcoreNewTagCardParams,\n OcgcoreQueryCardParams,\n OcgcoreQueryFieldCardParams,\n OcgcoreQueryFieldCountParams,\n OcgcoreSetPlayerInfoParams,\n OcgcoreStartDuelOptions,\n} from './types/ocgcore-params';\nimport {\n MESSAGE_BUFFER_SIZE,\n QUERY_BUFFER_SIZE,\n REGISTRY_BUFFER_SIZE,\n LEN_HEADER,\n} from './constants';\nimport {\n parseCardQuery,\n parseFieldCardQuery,\n parseFieldInfo,\n parseRegistryDump,\n parseRegistryKeys,\n} from './adapters/ocgcore-parsers';\nimport { normalizeStartDuelOptions } from './adapters/start-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { decodeUtf8 } from './utility/utf8';\nimport { YGOProMessages, YGOProMsgBase } from 'ygopro-msg-encode';\n\nexport class OcgcoreDuel {\n private returnPtr = 0;\n private returnSize = 512;\n\n constructor(\n public ocgcoreWrapper: OcgcoreWrapper,\n public duelPtr: number,\n ) {}\n\n startDuel(options: number | OcgcoreStartDuelOptions): void {\n if (!this.returnPtr) {\n this.returnPtr = this.ocgcoreWrapper.malloc(this.returnSize);\n }\n const optionValue = normalizeStartDuelOptions(options);\n this.ocgcoreWrapper.ocgcoreModule._start_duel(this.duelPtr, optionValue);\n }\n\n ended = false;\n\n endDuel(): void {\n if (this.ended) return;\n this.ended = true;\n this.ocgcoreWrapper.ocgcoreModule._end_duel(this.duelPtr);\n if (this.returnPtr) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = 0;\n }\n this.ocgcoreWrapper.forgetDuel(this.duelPtr);\n }\n\n setPlayerInfo(info: OcgcoreSetPlayerInfoParams): void {\n this.ocgcoreWrapper.ocgcoreModule._set_player_info(\n this.duelPtr,\n info.player,\n info.lp,\n info.startHand,\n info.drawCount,\n );\n }\n\n _getLogMessage(bufPtr: number): number {\n return this.ocgcoreWrapper.ocgcoreModule._get_log_message(\n this.duelPtr,\n bufPtr,\n );\n }\n\n private getMessage(length: number): OcgcoreMessageResult {\n const ptr = this.ocgcoreWrapper.malloc(MESSAGE_BUFFER_SIZE);\n this.ocgcoreWrapper.ocgcoreModule._get_message(this.duelPtr, ptr);\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n return { length, raw };\n }\n\n process(): OcgcoreProcessResult {\n const result = this.ocgcoreWrapper.ocgcoreModule._process(this.duelPtr);\n const length = (result & 0x0fffffff) >>> 0;\n const status = ((result >>> 28) & 0x0f) >>> 0;\n const messageData = this.getMessage(length);\n\n // Parse message using YGOProMessages (only one message per process call)\n let parsedMessage: YGOProMsgBase | undefined;\n if (messageData.raw.length > 0) {\n try {\n parsedMessage = YGOProMessages.getInstanceFromPayload(messageData.raw);\n } catch (e) {\n // If parsing fails, parsedMessage remains undefined\n }\n }\n\n return {\n length: messageData.length,\n raw: messageData.raw,\n status,\n message: parsedMessage,\n };\n }\n\n newCard(card: OcgcoreNewCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.player,\n card.location,\n card.sequence,\n card.position,\n );\n }\n\n newTagCard(card: OcgcoreNewTagCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_tag_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.location,\n );\n }\n\n queryCard(query: OcgcoreQueryCardParams): OcgcoreCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_card(\n this.duelPtr,\n query.player,\n query.location,\n query.sequence,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const card = length <= LEN_HEADER ? null : parseCardQuery(raw, length);\n return { length, raw, card };\n }\n\n queryFieldCount(query: OcgcoreQueryFieldCountParams): number {\n return this.ocgcoreWrapper.ocgcoreModule._query_field_count(\n this.duelPtr,\n query.player,\n query.location,\n );\n }\n\n queryFieldCard(\n query: OcgcoreQueryFieldCardParams,\n ): OcgcoreFieldCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_card(\n this.duelPtr,\n query.player,\n query.location,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const cards = parseFieldCardQuery(raw, length);\n return { length, raw, cards };\n }\n\n queryFieldInfo(): OcgcoreFieldInfoResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_info(\n this.duelPtr,\n ptr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const field = parseFieldInfo(raw);\n return { length, raw, field };\n }\n\n setResponseInt(value: number): void {\n this.ocgcoreWrapper.ocgcoreModule._set_responsei(this.duelPtr, value);\n }\n\n setResponse(response: Uint8Array | number): void {\n if (typeof response === 'number') {\n this.setResponseInt(response);\n return;\n }\n if (response.length > this.returnSize) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = this.ocgcoreWrapper.malloc(response.length);\n this.returnSize = response.length;\n }\n this.ocgcoreWrapper.setHeap(this.returnPtr, response);\n this.ocgcoreWrapper.ocgcoreModule._set_responseb(\n this.duelPtr,\n this.returnPtr,\n );\n }\n\n preloadScript(scriptPath: string): void {\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._preload_script(this.duelPtr, ptr),\n scriptPath,\n );\n }\n\n getRegistryValue(key: string): OcgcoreRegistryValueResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.useTmpData(\n (keyPtr) =>\n this.ocgcoreWrapper.ocgcoreModule._get_registry_value(\n this.duelPtr,\n keyPtr,\n outPtr,\n ),\n key,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const value = raw;\n const text = length >= 0 ? decodeUtf8(raw) : undefined;\n return { length, raw, value, text };\n }\n\n setRegistryValue(key: string, value: string): void {\n this.ocgcoreWrapper.useTmpData(\n (keyPtr, valuePtr) =>\n this.ocgcoreWrapper.ocgcoreModule._set_registry_value(\n this.duelPtr,\n keyPtr,\n valuePtr,\n ),\n key,\n value,\n );\n }\n\n getRegistryKeys(): OcgcoreRegistryKeysResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._get_registry_keys(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const keys = length >= 0 ? parseRegistryKeys(raw) : [];\n return { length, raw, keys };\n }\n\n clearRegistry(): void {\n this.ocgcoreWrapper.ocgcoreModule._clear_registry(this.duelPtr);\n }\n\n dumpRegistry(): OcgcoreRegistryDumpResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._dump_registry(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n\n // Parse directly into dict\n const dict: Record<string, string> = {};\n if (length > 0) {\n const entries = parseRegistryDump(raw);\n for (const entry of entries) {\n if (entry.valueText !== undefined) {\n dict[entry.key] = entry.valueText;\n }\n }\n }\n\n return { length, raw, dict };\n }\n\n loadRegistry(input: Uint8Array | Record<string, string>): void {\n if (input instanceof Uint8Array) {\n // Load from binary format\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._load_registry(\n this.duelPtr,\n ptr,\n input.length,\n ),\n input,\n );\n } else {\n // Load from dict format\n for (const [key, value] of Object.entries(input)) {\n this.setRegistryValue(key, value);\n }\n }\n }\n}\n", "import { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { CardData } from 'ygopro-msg-encode';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\nimport { CardReader, MessageHandler, ScriptReader } from './types/callback';\n\nexport class OcgcoreWrapper {\n private scriptBufferPtr = 0;\n private scriptBufferSize = 0;\n private logBufferPtr = 0;\n private logBufferSize = 0;\n private tmpStringBufferPtr = 0;\n private tmpStringBufferSize = 0;\n\n private scriptReaderFunc = 0;\n private cardReaderFunc = 0;\n private messageHandlerFunc = 0;\n\n public scriptReaders: ScriptReader[] = [];\n public cardReaders: CardReader[] = [];\n public messageHandlers: MessageHandler[] = [];\n\n private heapU8: Uint8Array;\n private heapView: DataView;\n private encoder = new TextEncoder();\n private decoder = new TextDecoder('utf-8');\n private duels = new Map<number, OcgcoreDuel>();\n\n constructor(\n public ocgcoreModule: OcgcoreModule,\n options?: { scriptBufferSize?: number; logBufferSize?: number },\n ) {\n this.heapU8 = ocgcoreModule.HEAPU8 as Uint8Array;\n this.heapView = new DataView(this.heapU8.buffer);\n this.scriptBufferSize = options?.scriptBufferSize ?? 0x100000;\n this.logBufferSize = options?.logBufferSize ?? 1024;\n\n this.scriptReaderFunc = this.createFunction((scriptPtr, lenPtr) => {\n const scriptPath = this.getUTF8String(scriptPtr);\n const content = this.readScript(scriptPath);\n if (content == null) {\n return 0;\n }\n\n if (!this.scriptBufferPtr) {\n this.scriptBufferPtr = this.ocgcoreModule._malloc(\n this.scriptBufferSize,\n );\n }\n\n const bytes = content;\n if (bytes.length > this.scriptBufferSize) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = this.ocgcoreModule._malloc(bytes.length);\n this.scriptBufferSize = bytes.length;\n }\n\n this.heapU8.set(bytes, this.scriptBufferPtr);\n this.heapView.setInt32(lenPtr, bytes.length, true);\n return this.scriptBufferPtr;\n }, 'iii');\n this.ocgcoreModule._set_script_reader(this.scriptReaderFunc);\n\n this.cardReaderFunc = this.createFunction((cardId, cardDataPtr) => {\n const data = this.readCard(cardId);\n if (!data) {\n return 0;\n }\n\n const buf = new CardData().fromPartial(data).toPayload();\n this.heapU8.set(buf, cardDataPtr);\n return 0;\n }, 'iii');\n this.ocgcoreModule._set_card_reader(this.cardReaderFunc);\n\n this.messageHandlerFunc = this.createFunction((duelPtr, messageType) => {\n if (!this.logBufferPtr) {\n this.logBufferPtr = this.ocgcoreModule._malloc(this.logBufferSize);\n }\n this.ocgcoreModule._get_log_message(duelPtr, this.logBufferPtr);\n const message = this.getUTF8String(this.logBufferPtr);\n const type =\n messageType === 2\n ? OcgcoreMessageType.DebugMessage\n : OcgcoreMessageType.ScriptError;\n const duel = this.getOrCreateDuel(duelPtr);\n this.handleMessage(duel, message, type);\n }, 'iii');\n this.ocgcoreModule._set_message_handler(this.messageHandlerFunc);\n }\n\n readScript(scriptPath: string): Uint8Array | null {\n let content: string | Uint8Array | null | undefined;\n for (const reader of this.scriptReaders) {\n try {\n content = reader(scriptPath);\n } catch {\n content = null;\n }\n if (content != null) {\n break;\n }\n }\n return typeof content === 'string'\n ? this.encoder.encode(content)\n : (content ?? null);\n }\n\n readCard(cardId: number): Partial<CardData> | null {\n let data: Partial<CardData> | null | undefined;\n for (const reader of this.cardReaders) {\n try {\n data = reader(cardId);\n } catch {\n data = null;\n }\n if (data) {\n break;\n }\n }\n return data ?? null;\n }\n\n handleMessage(\n duel: OcgcoreDuel,\n message: string,\n type: OcgcoreMessageType,\n ): void {\n for (const handler of this.messageHandlers) {\n try {\n handler(duel, message, type);\n } catch {\n // ignore handler errors\n }\n }\n }\n\n getUTF8String(ptr: number): string {\n let length = 0;\n while (this.heapU8[ptr + length] !== 0) {\n length++;\n }\n return this.decoder.decode(this.heapU8.subarray(ptr, ptr + length));\n }\n\n setHeap(ptr: number, data: Uint8Array): void {\n this.heapU8.set(data, ptr);\n }\n\n copyHeap(ptr: number, length: number): Uint8Array {\n return this.heapU8.slice(ptr, ptr + length);\n }\n\n useTmpData<R>(\n cb: (...args: number[]) => R,\n ...args: Array<string | Uint8Array>\n ): R {\n const encoded = args.map((item) =>\n typeof item === 'string' ? this.encoder.encode(item) : item,\n );\n const totalLength = encoded.reduce(\n (acc, bytes) => acc + bytes.length + 1,\n 0,\n );\n if (totalLength > this.tmpStringBufferSize) {\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n }\n this.tmpStringBufferPtr = this.ocgcoreModule._malloc(totalLength);\n this.tmpStringBufferSize = totalLength;\n }\n\n let offset = 0;\n const ptrs = encoded.map((bytes) => {\n const ptr = this.tmpStringBufferPtr + offset;\n this.heapU8.set(bytes, ptr);\n this.heapU8[ptr + bytes.length] = 0;\n offset += bytes.length + 1;\n return ptr;\n });\n\n return cb(...ptrs);\n }\n\n private createFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n addFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n removeFunction(index: number): void {\n this.ocgcoreModule.removeFunction(index);\n }\n\n createDuel(seed: number): OcgcoreDuel {\n const duelPtr = this.ocgcoreModule._create_duel(seed);\n return this.getOrCreateDuel(duelPtr);\n }\n\n createDuelV2(seedSequence: number[]): OcgcoreDuel {\n const count = seedSequence.length;\n const byteLength = count * 4;\n const ptr = this.ocgcoreModule._malloc(byteLength);\n const view = new Uint32Array(this.heapU8.buffer, ptr, count);\n for (let i = 0; i < count; i++) {\n view[i] = seedSequence[i] >>> 0;\n }\n const duelPtr = this.ocgcoreModule._create_duel_v2(ptr);\n this.ocgcoreModule._free(ptr);\n return this.getOrCreateDuel(duelPtr);\n }\n\n _defaultScriptReader(namePtr: number, dataPtr: number): number {\n return this.ocgcoreModule._default_script_reader(namePtr, dataPtr);\n }\n\n malloc(size: number): number {\n return this.ocgcoreModule._malloc(size);\n }\n\n free(ptr: number): void {\n this.ocgcoreModule._free(ptr);\n }\n\n _stdioExit(): void {\n this.ocgcoreModule.___stdio_exit();\n }\n\n setScriptReader(reader: ScriptReader, reset = false): this {\n if (reset) {\n this.scriptReaders = [];\n }\n this.scriptReaders.push(reader);\n return this;\n }\n\n setCardReader(reader: CardReader, reset = false): this {\n if (reset) {\n this.cardReaders = [];\n }\n this.cardReaders.push(reader);\n return this;\n }\n\n setMessageHandler(handler: MessageHandler, reset = false): this {\n if (reset) {\n this.messageHandlers = [];\n }\n this.messageHandlers.push(handler);\n return this;\n }\n\n getOrCreateDuel(duelPtr: number): OcgcoreDuel {\n const existing = this.duels.get(duelPtr);\n if (existing) {\n return existing;\n }\n const duel = new OcgcoreDuel(this, duelPtr);\n this.duels.set(duelPtr, duel);\n return duel;\n }\n\n forgetDuel(duelPtr: number): void {\n this.duels.delete(duelPtr);\n }\n\n finalize(): void {\n if (this.scriptReaderFunc) {\n this.ocgcoreModule.removeFunction(this.scriptReaderFunc);\n this.scriptReaderFunc = 0;\n }\n if (this.cardReaderFunc) {\n this.ocgcoreModule.removeFunction(this.cardReaderFunc);\n this.cardReaderFunc = 0;\n }\n if (this.messageHandlerFunc) {\n this.ocgcoreModule.removeFunction(this.messageHandlerFunc);\n this.messageHandlerFunc = 0;\n }\n\n if (this.scriptBufferPtr) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = 0;\n this.scriptBufferSize = 0;\n }\n if (this.logBufferPtr) {\n this.ocgcoreModule._free(this.logBufferPtr);\n this.logBufferPtr = 0;\n this.logBufferSize = 0;\n }\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n this.tmpStringBufferPtr = 0;\n this.tmpStringBufferSize = 0;\n }\n }\n}\n", "export enum OcgcoreMessageType {\n ScriptError = 'ScriptError',\n DebugMessage = 'DebugMessage',\n}\n\nexport enum OcgcoreDuelRule {\n Rule1 = 1,\n Rule2 = 2,\n MasterRule3 = 3,\n NewMasterRule = 4,\n MasterRule2020 = 5,\n}\n\nexport enum OcgcoreDuelOptionFlag {\n TestMode = 0x01,\n AttackFirstTurn = 0x02,\n ObsoleteRuling = 0x08,\n PseudoShuffle = 0x10,\n TagMode = 0x20,\n SimpleAI = 0x40,\n ReturnDeckTop = 0x80,\n RevealDeckSeq = 0x100,\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\nimport createOcgcore from './vendor/wasm_esm/libocgcore.mjs';\nimport { normalizeOcgcoreFactory } from './ocgcore-wrapper-utils';\n\nexport async function loadOcgcoreFactory(): Promise<OcgcoreFactory> {\n return normalizeOcgcoreFactory(createOcgcore as unknown);\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\n\ntype OcgcoreFactoryModule = { default?: OcgcoreFactory } | OcgcoreFactory;\n\nexport function normalizeOcgcoreFactory(mod: unknown): OcgcoreFactory {\n const typed = mod as OcgcoreFactoryModule;\n if (typeof typed === 'function') {\n return typed as OcgcoreFactory;\n }\n if (typed && typeof (typed as { default?: unknown }).default === 'function') {\n return (typed as { default: OcgcoreFactory }).default;\n }\n throw new Error('Invalid ocgcore factory module');\n}\n", "import type { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { loadOcgcoreFactory } from './load-ocgcore-factory';\n\nexport interface CreateOcgcoreWrapperOptions {\n moduleOverrides?: Partial<OcgcoreModule>;\n wasmBinary?: Uint8Array;\n locateFile?: (path: string, prefix?: string) => string;\n}\n\nexport async function createOcgcoreWrapper(\n options: CreateOcgcoreWrapperOptions = {},\n): Promise<OcgcoreWrapper> {\n const factory = await loadOcgcoreFactory();\n const overrides: Partial<OcgcoreModule> = {\n ...options.moduleOverrides,\n };\n if (options.wasmBinary) {\n overrides.wasmBinary =\n options.wasmBinary as unknown as OcgcoreModule['wasmBinary'];\n }\n if (options.locateFile) {\n overrides.locateFile =\n options.locateFile as unknown as OcgcoreModule['locateFile'];\n }\n const moduleInstance = await factory(overrides);\n return new OcgcoreWrapper(moduleInstance);\n}\n", "import JSZip from 'jszip';\n\nimport { ScriptReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\n\nconst SCRIPT_PREFIX = './script/';\n\nfunction normalizePath(input: string): string {\n let path = input.replace(/\\\\/g, '/');\n if (path.startsWith(SCRIPT_PREFIX)) {\n path = path.slice(SCRIPT_PREFIX.length);\n }\n return path;\n}\n\nfunction buildCandidates(filename: string): string[] {\n const entries = [\n filename,\n `specials/${filename}`,\n `expansions/script/${filename}`,\n `script/${filename}`,\n ];\n const candidates: string[] = [];\n for (const entry of entries) {\n candidates.push(entry);\n if (!entry.startsWith('./')) {\n const dotEntry = entry.startsWith('/')\n ? `./${entry.slice(1)}`\n : `./${entry}`;\n candidates.push(dotEntry);\n }\n }\n return candidates;\n}\n\nfunction joinPath(baseDir: string, relativePath: string): string {\n const pathMod = getNodePath();\n if (pathMod) {\n return pathMod.join(baseDir, relativePath);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = relativePath.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nexport function MapScriptReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const candidate of candidates) {\n for (const map of maps) {\n if (map.has(candidate)) {\n return map.get(candidate) ?? null;\n }\n }\n }\n return null;\n };\n}\n\nexport function DirScriptReader(...baseDirs: string[]): ScriptReader {\n const fs = getNodeFs();\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const baseDir of baseDirs) {\n for (const candidate of candidates) {\n const normalized = candidate.startsWith('/')\n ? candidate.slice(1)\n : candidate;\n const fullPath = joinPath(baseDir, normalized);\n if (fs.existsSync(fullPath)) {\n return fs.readFileSync(fullPath);\n }\n }\n }\n return null;\n };\n}\n\nfunction normalizeZipEntryName(name: string): string[] {\n const normalized = name.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n const names = new Set<string>();\n names.add(normalized);\n if (normalized.startsWith('script/')) {\n names.add(normalized.slice('script/'.length));\n }\n return Array.from(names);\n}\n\nexport async function ZipScriptReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n const maps = await Promise.all(\n inputs.map(async (data) => {\n const zip = await JSZip.loadAsync(data);\n const map = new Map<string, string | Uint8Array>();\n const entries = Object.values(zip.files);\n await Promise.all(\n entries.map(async (entry) => {\n if (entry.dir) {\n return;\n }\n if (!entry.name.toLowerCase().endsWith('.lua')) {\n return;\n }\n const content = await entry.async('uint8array');\n for (const name of normalizeZipEntryName(entry.name)) {\n map.set(name, content);\n }\n }),\n );\n return map;\n }),\n );\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use MapScriptReader instead. */\nexport function MapReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use DirScriptReader instead. */\nexport function DirReader(...baseDirs: string[]): ScriptReader {\n return DirScriptReader(...baseDirs);\n}\n\n/** @deprecated Use ZipScriptReader instead. */\nexport async function ZipReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n return ZipScriptReader(...inputs);\n}\n", "export function loadNodeModule<T>(id: string, altId?: string): T | null {\n const req =\n typeof module.require !== 'undefined' ? module.require : undefined;\n if (!req) {\n return null;\n }\n try {\n return req(id) as T;\n } catch {\n if (!altId) return null;\n try {\n return req(altId) as T;\n } catch {\n return null;\n }\n }\n}\n", "type NodeStats = {\n isFile: () => boolean;\n};\n\ntype NodeFsPromises = {\n readFile: (path: string) => Promise<Uint8Array>;\n readdir: (path: string) => Promise<string[]>;\n stat: (path: string) => Promise<NodeStats>;\n access: (path: string) => Promise<void>;\n};\n\nexport type NodeFs = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string) => Uint8Array;\n promises: NodeFsPromises;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodeFs(noThrow = false): NodeFs | null {\n const mod = loadNodeModule<NodeFs>('node:fs', 'fs');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js fs module is not available.');\n}\n", "export type NodePath = {\n join: (...parts: string[]) => string;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodePath(noThrow = false): NodePath | null {\n const mod = loadNodeModule<NodePath>('node:path', 'path');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js path module is not available.');\n}\n", "import { getNodeFs } from './node-fs';\nimport { getNodePath } from './node-path';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function searchZips(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const results: string[] = [];\n const rootEntries = await safeReadDir(fs, baseDir);\n for (const entry of rootEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, baseDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n const expansionEntries = await safeReadDir(fs, expansionsDir);\n for (const entry of expansionEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, expansionsDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n return results;\n}\n", "import type { ScriptReader } from '../types/callback';\nimport { DirScriptReader, ZipScriptReader } from './script-readers';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nexport async function DirScriptReaderEx(\n ...baseDirs: string[]\n): Promise<ScriptReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirScriptReaderEx');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirScriptReaderEx');\n const fsReader = DirScriptReader(...baseDirs);\n\n const zipInputs: Uint8Array[] = [];\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n zipInputs.push(await fs.promises.readFile(zipPath));\n } catch {\n continue;\n }\n }\n }\n\n if (zipInputs.length === 0) {\n return fsReader;\n }\n\n const zipReader = await ZipScriptReader(...zipInputs);\n return (path) => fsReader(path) ?? zipReader(path);\n}\n", "import type { Database } from 'sql.js';\nimport { OcgcoreCommonConstants } from '../vendor';\nimport type { CardData } from 'ygopro-msg-encode';\nimport type { CardReader } from '../types/callback';\n\ntype SqljsRow = {\n id: number;\n alias: number;\n setcode: number | bigint;\n type: number;\n atk: number;\n def: number;\n level: number;\n race: number;\n attribute: number;\n};\n\nfunction toNumberArrayFromSetcode(value: number | bigint): number[] {\n let raw = typeof value === 'bigint' ? value : BigInt(value >>> 0);\n const list: number[] = [];\n while (raw !== 0n && list.length < 16) {\n const chunk = raw & 0xffffn;\n if (chunk !== 0n) {\n list.push(Number(chunk));\n }\n raw >>= 16n;\n }\n return list;\n}\n\nfunction mapRowToCardData(row: SqljsRow): Partial<CardData> {\n const type = (row.type ?? 0) >>> 0;\n const attack = row.atk ?? 0;\n let defense = row.def ?? 0;\n let linkMarker = 0;\n if ((type & OcgcoreCommonConstants.TYPE_LINK) >>> 0 !== 0) {\n linkMarker = defense;\n defense = 0;\n }\n const levelRaw = (row.level ?? 0) >>> 0;\n const level = (levelRaw & 0xff) >>> 0;\n const lscale = ((levelRaw >>> 24) & 0xff) >>> 0;\n const rscale = ((levelRaw >>> 16) & 0xff) >>> 0;\n\n return {\n code: row.id,\n alias: row.alias ?? 0,\n setcode: toNumberArrayFromSetcode(row.setcode ?? 0),\n type,\n level,\n attribute: (row.attribute ?? 0) >>> 0,\n race: (row.race ?? 0) >>> 0,\n attack,\n defense,\n lscale,\n rscale,\n linkMarker,\n };\n}\n\nfunction queryOne(db: Database, cardId: number): Partial<CardData> | null {\n if (typeof db.prepare === 'function') {\n const stmt = db.prepare(\n 'SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ?',\n );\n try {\n stmt.bind([cardId]);\n if (!stmt.step()) {\n return null;\n }\n const row = stmt.getAsObject() as unknown as SqljsRow;\n if (!row || row.id == null) {\n return null;\n }\n return mapRowToCardData(row);\n } finally {\n stmt.free();\n }\n }\n\n const res = db.exec(\n `SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ${cardId}`,\n );\n if (\n !res ||\n res.length === 0 ||\n !res[0].values ||\n res[0].values.length === 0\n ) {\n return null;\n }\n const row = res[0].values[0] as unknown[];\n return mapRowToCardData({\n id: row[0] as number,\n alias: row[1] as number,\n setcode: row[2] as number,\n type: row[3] as number,\n atk: row[4] as number,\n def: row[5] as number,\n level: row[6] as number,\n race: row[7] as number,\n attribute: row[8] as number,\n });\n}\n\nexport function SqljsCardReader(...dbs: Database[]): CardReader {\n return (cardId: number) => {\n for (const db of dbs) {\n const data = queryOne(db, cardId);\n if (data) {\n return data;\n }\n }\n return null;\n };\n}\n\n/** @deprecated Use SqljsCardReader instead. */\nexport function createSqljsCardReader(...dbs: Database[]): CardReader {\n return SqljsCardReader(...dbs);\n}\n", "import JSZip from 'jszip';\n\nimport type { CardReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\nimport { SqljsCardReader } from './sqljs-card-reader';\nimport type { SqlJsStatic } from 'sql.js';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nasync function collectFsDbPaths(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const collectCdbFiles = async (dirPath: string): Promise<string[]> => {\n const paths: string[] = [];\n const entries = await safeReadDir(fs, dirPath);\n for (const entry of entries) {\n if (!entry.toLowerCase().endsWith('.cdb')) {\n continue;\n }\n const fullPath = joinPath(pathMod, dirPath, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n paths.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n return paths;\n };\n\n const results: string[] = [];\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n results.push(...(await collectCdbFiles(expansionsDir)));\n\n results.push(...(await collectCdbFiles(baseDir)));\n\n return results;\n}\n\nfunction isRootCdbEntry(entryName: string): boolean {\n const normalized = entryName.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n return !normalized.includes('/') && normalized.toLowerCase().endsWith('.cdb');\n}\n\nexport async function DirCardReader(\n sqljs: SqlJsStatic,\n ...baseDirs: string[]\n): Promise<CardReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirCardReader');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirCardReader');\n\n const dbs: unknown[] = [];\n for (const baseDir of baseDirs) {\n const dbPaths = await collectFsDbPaths(fs, pathMod, baseDir);\n for (const dbPath of dbPaths) {\n try {\n const bytes = await fs.promises.readFile(dbPath);\n dbs.push(new sqljs.Database(bytes));\n } catch {\n continue;\n }\n }\n }\n\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n const bytes = await fs.promises.readFile(zipPath);\n const zip = await JSZip.loadAsync(bytes);\n const entries = Object.values(zip.files);\n for (const entry of entries) {\n if (entry.dir || !isRootCdbEntry(entry.name)) {\n continue;\n }\n try {\n const content = await entry.async('uint8array');\n dbs.push(new sqljs.Database(content));\n } catch {\n continue;\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n return SqljsCardReader(...(dbs as Parameters<typeof SqljsCardReader>));\n}\n", "import { YGOProYrp } from 'ygopro-yrp-encode';\n\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreProcessResult } from './types';\n\nconst { LOCATION_DECK, LOCATION_EXTRA, POS_FACEDOWN_DEFENSE } =\n OcgcoreScriptConstants;\n\nfunction normalizeYrp(input: YGOProYrp | Uint8Array): YGOProYrp {\n if (input instanceof YGOProYrp) {\n return input;\n }\n return new YGOProYrp().fromYrp(input);\n}\n\nfunction loadDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n player: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_EXTRA,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n}\n\nfunction loadTagDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_DECK,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_EXTRA,\n });\n }\n}\n\nfunction setRegistryValue(duel: OcgcoreDuel, key: string, value: string): void {\n duel.setRegistryValue(key, value);\n}\n\nexport function createDuelFromYrp(\n wrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const yrp = normalizeYrp(yrpInput);\n const header = yrp.header;\n const seedSequence = header?.seedSequence ?? [];\n const duel =\n seedSequence.length > 0\n ? wrapper.createDuelV2(seedSequence)\n : wrapper.createDuel(header?.seed ?? 0);\n\n setRegistryValue(duel, 'duel_mode', yrp.isTag ? 'tag' : 'single');\n setRegistryValue(duel, 'start_lp', String(yrp.startLp));\n setRegistryValue(duel, 'start_hand', String(yrp.startHand));\n setRegistryValue(duel, 'draw_count', String(yrp.drawCount));\n\n const playerNames = yrp.isTag\n ? [\n yrp.hostName,\n yrp.tagHostName ?? '',\n yrp.tagClientName ?? '',\n yrp.clientName,\n ]\n : [yrp.hostName, yrp.clientName];\n for (let i = 0; i < playerNames.length; i++) {\n setRegistryValue(duel, `player_name_${i}`, playerNames[i] ?? '');\n }\n setRegistryValue(duel, 'player_type_0', '0');\n setRegistryValue(duel, 'player_type_1', '1');\n\n duel.setPlayerInfo({\n player: 0,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n duel.setPlayerInfo({\n player: 1,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n\n duel.preloadScript('./script/patches/entry.lua');\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n\n if (yrp.isSingleMode && yrp.singleScript) {\n duel.preloadScript(`./single/${yrp.singleScript}`);\n } else if (yrp.isTag) {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadTagDeck(duel, yrp.tagHostDeck, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n loadTagDeck(duel, yrp.tagClientDeck, 1);\n } else {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n }\n\n duel.startDuel(yrp.opt >>> 0);\n return { yrp, duel };\n}\n\nexport function consumeResponseFromOcgcoreProcess(\n duel: OcgcoreDuel,\n result: OcgcoreProcessResult,\n responses: Uint8Array[],\n) {\n if (\n result.raw.length > 0 &&\n result.raw[0] === OcgcoreCommonConstants.MSG_RETRY\n ) {\n throw new Error('Got MSG_RETRY');\n }\n\n if (result.status === 0) {\n return false;\n }\n if (result.status === 1) {\n if (result.raw.length === 0) {\n return false;\n }\n const response = responses.shift();\n if (!response) {\n return true;\n }\n duel.setResponse(response);\n return false;\n }\n return true;\n}\n\nexport function* processYrpDuelStep(duel: OcgcoreDuel, yrp: YGOProYrp) {\n const responses = yrp.responses.slice();\n\n while (true) {\n const result = duel.process();\n yield {\n duel,\n result,\n responses,\n };\n\n if (consumeResponseFromOcgcoreProcess(duel, result, responses)) {\n break;\n }\n }\n}\n\nexport function* playYrpStep(\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const { yrp, duel } = createDuelFromYrp(ocgcoreWrapper, yrpInput);\n\n try {\n for (const stepResult of processYrpDuelStep(duel, yrp)) {\n yield stepResult;\n }\n } finally {\n duel.endDuel();\n }\n}\n\nexport const playYrp = (\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) => {\n const results: Uint8Array[] = [];\n for (const result of playYrpStep(ocgcoreWrapper, yrpInput)) {\n results.push(result.result.raw);\n }\n return results;\n};\n", "import { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\n\nconst { LOCATION_DECK, POS_FACEUP_ATTACK } = OcgcoreScriptConstants;\n\nexport interface TestCardMessage {\n type: OcgcoreMessageType;\n message: string;\n}\n\nexport function testCard(\n ocgcoreWrapper: OcgcoreWrapper,\n ...ids: number[]\n): TestCardMessage[] {\n const logs: TestCardMessage[] = [];\n const duel = ocgcoreWrapper.createDuelV2(\n Array.from(\n { length: 8 },\n () => Math.floor(Math.random() * 0xffffffff) >>> 0,\n ),\n );\n\n ocgcoreWrapper.setMessageHandler((_duel, message, type) => {\n if (duel.duelPtr !== _duel.duelPtr) return;\n logs.push({ type, message });\n });\n\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n duel.setPlayerInfo({ player: 0, lp: 8000, startHand: 5, drawCount: 1 });\n duel.setPlayerInfo({ player: 1, lp: 8000, startHand: 5, drawCount: 1 });\n\n for (const code of ids) {\n duel.newCard({\n code,\n owner: 0,\n player: 0,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEUP_ATTACK,\n });\n }\n\n duel.startDuel(0);\n\n while (true) {\n const { status, raw } = duel.process();\n if (raw.length > 0 && raw[0] === OcgcoreCommonConstants.MSG_RETRY) {\n break;\n }\n if (status === 0) {\n continue;\n }\n break;\n }\n\n duel.endDuel();\n return logs;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Buffer", "OcgcoreMessageType", "OcgcoreDuelRule", "OcgcoreDuelOptionFlag", "joinPath", "row", "JSZip", "joinPath", "getNodeModuleOrThrow", "safeReadDir", "JSZip", "LOCATION_DECK", "Buffer"]
|
|
4
|
+
"sourcesContent": ["import { Buffer } from 'buffer';\n\nif (\n typeof globalThis !== 'undefined' &&\n !(globalThis as { Buffer?: unknown }).Buffer\n) {\n (globalThis as { Buffer?: unknown }).Buffer = Buffer;\n}\n\nexport * from './src/ocgcore-wrapper';\nexport * from './src/ocgcore-duel';\nexport * from './src/create-ocgcore-wrapper';\nexport * from './src/types';\nexport * from './src/adapters';\nexport * from './src/constants';\n// export * from './src/utility';\nexport * as _OcgcoreConstants from './src/vendor';\nexport * from './src/script-reader';\nexport * from './src/card-reader';\nexport * from './src/play-yrp';\nexport * from './src/test-card';\n", "export {\n OcgcoreCommonConstants,\n OcgcoreScriptConstants,\n} from 'ygopro-msg-encode';\n", "import { OcgcoreCommonConstants } from '../vendor';\n\nexport const MESSAGE_BUFFER_SIZE = OcgcoreCommonConstants.SIZE_MESSAGE_BUFFER;\nexport const QUERY_BUFFER_SIZE = 0x4000;\nexport const REGISTRY_BUFFER_SIZE = 0x2000;\n\nexport const LEN_FAIL = 0;\nexport const LEN_EMPTY = 4;\nexport const LEN_HEADER = 8;\n", "export function readU8(buf: Uint8Array, offset: number): number {\n return buf[offset] ?? 0;\n}\n\nexport function readU16(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint16(\n offset,\n true,\n );\n}\n\nexport function readI32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getInt32(\n offset,\n true,\n );\n}\n\nexport function readU32(buf: Uint8Array, offset: number): number {\n return new DataView(buf.buffer, buf.byteOffset, buf.byteLength).getUint32(\n offset,\n true,\n );\n}\n", "const encoder = new TextEncoder();\nconst decoder = new TextDecoder('utf-8');\n\nexport function encodeUtf8(value: string): Uint8Array {\n return encoder.encode(value);\n}\n\nexport function decodeUtf8(value: Uint8Array): string {\n return decoder.decode(value);\n}\n", "import { LEN_HEADER } from '../constants';\nimport { readI32, readU16 } from '../utility/binary';\nimport { decodeUtf8 } from '../utility/utf8';\nimport { CardQuery, YGOProMsgReloadField } from 'ygopro-msg-encode';\n\n// Internal interface for registry parsing\ninterface RegistryDumpEntry {\n key: string;\n value: Uint8Array;\n valueText?: string;\n}\n\nexport function parseCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery | null {\n if (length <= LEN_HEADER) {\n return null;\n }\n const payload = raw.subarray(4, length);\n return new CardQuery().fromPayload(payload);\n}\n\nexport function parseFieldCardQuery(\n raw: Uint8Array,\n length: number,\n): CardQuery[] {\n const cards: CardQuery[] = [];\n let offset = 0;\n while (offset + 4 <= length) {\n const chunkLen = readI32(raw, offset);\n if (chunkLen <= 0) {\n break;\n }\n const end = Math.min(length, offset + chunkLen);\n if (chunkLen <= LEN_HEADER) {\n const emptyCard = new CardQuery();\n emptyCard.flags = 0;\n emptyCard.empty = true;\n cards.push(emptyCard);\n } else {\n const payload = raw.subarray(offset + 4, end);\n cards.push(new CardQuery().fromPayload(payload));\n }\n offset += chunkLen;\n }\n return cards;\n}\n\nexport function parseFieldInfo(raw: Uint8Array): YGOProMsgReloadField {\n // query_field_info() in ocgcore returns data that starts with MSG_RELOAD_FIELD (162) byte\n // Format: [MSG_RELOAD_FIELD][duel_rule][player0_data][player1_data][chains]\n // YGOProMsgReloadField.fromPayload() expects the full message including the identifier\n return new YGOProMsgReloadField().fromPayload(raw);\n}\n\nexport function parseRegistryKeys(raw: Uint8Array): string[] {\n const keys: string[] = [];\n let offset = 0;\n while (offset + 2 <= raw.length) {\n const len = readU16(raw, offset);\n offset += 2;\n if (offset + len > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + len);\n offset += len;\n keys.push(decodeUtf8(keyBytes));\n }\n return keys;\n}\n\nexport function parseRegistryDump(raw: Uint8Array): RegistryDumpEntry[] {\n const entries: RegistryDumpEntry[] = [];\n let offset = 0;\n while (offset + 4 <= raw.length) {\n const keyLen = readU16(raw, offset);\n const valLen = readU16(raw, offset + 2);\n offset += 4;\n if (offset + keyLen + valLen > raw.length) {\n break;\n }\n const keyBytes = raw.subarray(offset, offset + keyLen);\n offset += keyLen;\n const valueBytes = raw.subarray(offset, offset + valLen);\n offset += valLen;\n const entry: RegistryDumpEntry = {\n key: decodeUtf8(keyBytes),\n value: valueBytes,\n };\n entry.valueText = decodeUtf8(valueBytes);\n entries.push(entry);\n }\n return entries;\n}\n", "import { OcgcoreStartDuelOptions } from '../types/ocgcore-params';\n\nexport function normalizeStartDuelOptions(\n options: number | OcgcoreStartDuelOptions,\n): number {\n if (typeof options === 'number') {\n return options;\n }\n const duelRule = options.rule ?? 0;\n let duelOptions = options.options ?? 0;\n if (options.flags?.length) {\n for (const flag of options.flags) {\n duelOptions = (duelOptions | flag) >>> 0;\n }\n }\n return (((duelRule & 0xffff) << 16) | (duelOptions & 0xffff)) >>> 0;\n}\n", "import {\n OcgcoreCardQueryResult,\n OcgcoreFieldCardQueryResult,\n OcgcoreFieldInfoResult,\n OcgcoreMessageResult,\n OcgcoreProcessResult,\n OcgcoreRegistryDumpResult,\n OcgcoreRegistryKeysResult,\n OcgcoreRegistryValueResult,\n} from './types/ocgcore-results';\nimport {\n OcgcoreNewCardParams,\n OcgcoreNewTagCardParams,\n OcgcoreQueryCardParams,\n OcgcoreQueryFieldCardParams,\n OcgcoreQueryFieldCountParams,\n OcgcoreSetPlayerInfoParams,\n OcgcoreStartDuelOptions,\n} from './types/ocgcore-params';\nimport {\n MESSAGE_BUFFER_SIZE,\n QUERY_BUFFER_SIZE,\n REGISTRY_BUFFER_SIZE,\n LEN_HEADER,\n} from './constants';\nimport {\n parseCardQuery,\n parseFieldCardQuery,\n parseFieldInfo,\n parseRegistryDump,\n parseRegistryKeys,\n} from './adapters/ocgcore-parsers';\nimport { normalizeStartDuelOptions } from './adapters/start-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { decodeUtf8 } from './utility/utf8';\nimport {\n YGOProMessages,\n YGOProMsgBase,\n YGOProMsgRetry,\n} from 'ygopro-msg-encode';\n\nexport class OcgcoreDuel {\n private returnPtr = 0;\n private returnSize = 512;\n\n constructor(\n public ocgcoreWrapper: OcgcoreWrapper,\n public duelPtr: number,\n ) {}\n\n startDuel(options: number | OcgcoreStartDuelOptions): void {\n if (!this.returnPtr) {\n this.returnPtr = this.ocgcoreWrapper.malloc(this.returnSize);\n }\n const optionValue = normalizeStartDuelOptions(options);\n this.ocgcoreWrapper.ocgcoreModule._start_duel(this.duelPtr, optionValue);\n }\n\n ended = false;\n\n endDuel(): void {\n if (this.ended) return;\n this.ended = true;\n this.ocgcoreWrapper.ocgcoreModule._end_duel(this.duelPtr);\n if (this.returnPtr) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = 0;\n }\n this.ocgcoreWrapper.forgetDuel(this.duelPtr);\n }\n\n setPlayerInfo(info: OcgcoreSetPlayerInfoParams): void {\n this.ocgcoreWrapper.ocgcoreModule._set_player_info(\n this.duelPtr,\n info.player,\n info.lp,\n info.startHand,\n info.drawCount,\n );\n }\n\n _getLogMessage(bufPtr: number): number {\n return this.ocgcoreWrapper.ocgcoreModule._get_log_message(\n this.duelPtr,\n bufPtr,\n );\n }\n\n private getMessage(length: number): OcgcoreMessageResult {\n const ptr = this.ocgcoreWrapper.malloc(MESSAGE_BUFFER_SIZE);\n this.ocgcoreWrapper.ocgcoreModule._get_message(this.duelPtr, ptr);\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n return { length, raw };\n }\n\n process(): OcgcoreProcessResult {\n const result = this.ocgcoreWrapper.ocgcoreModule._process(this.duelPtr);\n const length = (result & 0x0fffffff) >>> 0;\n const status = ((result >>> 28) & 0x0f) >>> 0;\n const messageData = this.getMessage(length);\n\n // Parse message using YGOProMessages (only one message per process call)\n let parsedMessage: YGOProMsgBase | undefined;\n if (messageData.raw.length > 0) {\n try {\n parsedMessage = YGOProMessages.getInstanceFromPayload(messageData.raw);\n } catch (e) {\n // If parsing fails, parsedMessage remains undefined\n }\n }\n\n return {\n length: messageData.length,\n raw: messageData.raw,\n status,\n message: parsedMessage,\n };\n }\n\n *advance(advancor?: () => Uint8Array | void | null | undefined) {\n while (true) {\n const res = this.process();\n yield res;\n if (res.status === 2 || res.message instanceof YGOProMsgRetry) {\n break;\n }\n\n if (res.status === 1 && res.raw.length > 0) {\n const response = advancor?.();\n if (!response) {\n break;\n }\n this.setResponse(response);\n }\n }\n }\n\n newCard(card: OcgcoreNewCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.player,\n card.location,\n card.sequence,\n card.position,\n );\n }\n\n newTagCard(card: OcgcoreNewTagCardParams): void {\n this.ocgcoreWrapper.ocgcoreModule._new_tag_card(\n this.duelPtr,\n card.code,\n card.owner,\n card.location,\n );\n }\n\n queryCard(query: OcgcoreQueryCardParams): OcgcoreCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_card(\n this.duelPtr,\n query.player,\n query.location,\n query.sequence,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const card = length <= LEN_HEADER ? null : parseCardQuery(raw, length);\n return { length, raw, card };\n }\n\n queryFieldCount(query: OcgcoreQueryFieldCountParams): number {\n return this.ocgcoreWrapper.ocgcoreModule._query_field_count(\n this.duelPtr,\n query.player,\n query.location,\n );\n }\n\n queryFieldCard(\n query: OcgcoreQueryFieldCardParams,\n ): OcgcoreFieldCardQueryResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_card(\n this.duelPtr,\n query.player,\n query.location,\n query.queryFlag,\n ptr,\n query.useCache ?? 0,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const cards = parseFieldCardQuery(raw, length);\n return { length, raw, cards };\n }\n\n queryFieldInfo(): OcgcoreFieldInfoResult {\n const ptr = this.ocgcoreWrapper.malloc(QUERY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._query_field_info(\n this.duelPtr,\n ptr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(ptr, length);\n this.ocgcoreWrapper.free(ptr);\n const field = parseFieldInfo(raw);\n return { length, raw, field };\n }\n\n setResponseInt(value: number): void {\n this.ocgcoreWrapper.ocgcoreModule._set_responsei(this.duelPtr, value);\n }\n\n setResponse(response: Uint8Array | number): void {\n if (typeof response === 'number') {\n this.setResponseInt(response);\n return;\n }\n if (response.length > this.returnSize) {\n this.ocgcoreWrapper.free(this.returnPtr);\n this.returnPtr = this.ocgcoreWrapper.malloc(response.length);\n this.returnSize = response.length;\n }\n this.ocgcoreWrapper.setHeap(this.returnPtr, response);\n this.ocgcoreWrapper.ocgcoreModule._set_responseb(\n this.duelPtr,\n this.returnPtr,\n );\n }\n\n preloadScript(scriptPath: string): void {\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._preload_script(this.duelPtr, ptr),\n scriptPath,\n );\n }\n\n getRegistryValue(key: string): OcgcoreRegistryValueResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.useTmpData(\n (keyPtr) =>\n this.ocgcoreWrapper.ocgcoreModule._get_registry_value(\n this.duelPtr,\n keyPtr,\n outPtr,\n ),\n key,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const value = raw;\n const text = length >= 0 ? decodeUtf8(raw) : undefined;\n return { length, raw, value, text };\n }\n\n setRegistryValue(key: string, value: string): void {\n this.ocgcoreWrapper.useTmpData(\n (keyPtr, valuePtr) =>\n this.ocgcoreWrapper.ocgcoreModule._set_registry_value(\n this.duelPtr,\n keyPtr,\n valuePtr,\n ),\n key,\n value,\n );\n }\n\n getRegistryKeys(): OcgcoreRegistryKeysResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._get_registry_keys(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n const keys = length >= 0 ? parseRegistryKeys(raw) : [];\n return { length, raw, keys };\n }\n\n clearRegistry(): void {\n this.ocgcoreWrapper.ocgcoreModule._clear_registry(this.duelPtr);\n }\n\n dumpRegistry(): OcgcoreRegistryDumpResult {\n const outPtr = this.ocgcoreWrapper.malloc(REGISTRY_BUFFER_SIZE);\n const length = this.ocgcoreWrapper.ocgcoreModule._dump_registry(\n this.duelPtr,\n outPtr,\n );\n const raw = this.ocgcoreWrapper.copyHeap(outPtr, Math.max(0, length));\n this.ocgcoreWrapper.free(outPtr);\n\n // Parse directly into dict\n const dict: Record<string, string> = {};\n if (length > 0) {\n const entries = parseRegistryDump(raw);\n for (const entry of entries) {\n if (entry.valueText !== undefined) {\n dict[entry.key] = entry.valueText;\n }\n }\n }\n\n return { length, raw, dict };\n }\n\n loadRegistry(input: Uint8Array | Record<string, string>): void {\n if (input instanceof Uint8Array) {\n // Load from binary format\n this.ocgcoreWrapper.useTmpData(\n (ptr) =>\n this.ocgcoreWrapper.ocgcoreModule._load_registry(\n this.duelPtr,\n ptr,\n input.length,\n ),\n input,\n );\n } else {\n // Load from dict format\n for (const [key, value] of Object.entries(input)) {\n this.setRegistryValue(key, value);\n }\n }\n }\n}\n", "import { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { CardData } from 'ygopro-msg-encode';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\nimport { CardReader, MessageHandler, ScriptReader } from './types/callback';\n\nexport class OcgcoreWrapper {\n private scriptBufferPtr = 0;\n private scriptBufferSize = 0;\n private logBufferPtr = 0;\n private logBufferSize = 0;\n private tmpStringBufferPtr = 0;\n private tmpStringBufferSize = 0;\n\n private scriptReaderFunc = 0;\n private cardReaderFunc = 0;\n private messageHandlerFunc = 0;\n\n public scriptReaders: ScriptReader[] = [];\n public cardReaders: CardReader[] = [];\n public messageHandlers: MessageHandler[] = [];\n\n private heapU8: Uint8Array;\n private heapView: DataView;\n private encoder = new TextEncoder();\n private decoder = new TextDecoder('utf-8');\n private duels = new Map<number, OcgcoreDuel>();\n\n constructor(\n public ocgcoreModule: OcgcoreModule,\n options?: { scriptBufferSize?: number; logBufferSize?: number },\n ) {\n this.heapU8 = ocgcoreModule.HEAPU8 as Uint8Array;\n this.heapView = new DataView(this.heapU8.buffer);\n this.scriptBufferSize = options?.scriptBufferSize ?? 0x100000;\n this.logBufferSize = options?.logBufferSize ?? 1024;\n\n this.scriptReaderFunc = this.createFunction((scriptPtr, lenPtr) => {\n const scriptPath = this.getUTF8String(scriptPtr);\n const content = this.readScript(scriptPath);\n if (content == null) {\n return 0;\n }\n\n if (!this.scriptBufferPtr) {\n this.scriptBufferPtr = this.ocgcoreModule._malloc(\n this.scriptBufferSize,\n );\n }\n\n const bytes = content;\n if (bytes.length > this.scriptBufferSize) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = this.ocgcoreModule._malloc(bytes.length);\n this.scriptBufferSize = bytes.length;\n }\n\n this.heapU8.set(bytes, this.scriptBufferPtr);\n this.heapView.setInt32(lenPtr, bytes.length, true);\n return this.scriptBufferPtr;\n }, 'iii');\n this.ocgcoreModule._set_script_reader(this.scriptReaderFunc);\n\n this.cardReaderFunc = this.createFunction((cardId, cardDataPtr) => {\n const data = this.readCard(cardId);\n if (!data) {\n return 0;\n }\n\n const buf = new CardData().fromPartial(data).toPayload();\n this.heapU8.set(buf, cardDataPtr);\n return 0;\n }, 'iii');\n this.ocgcoreModule._set_card_reader(this.cardReaderFunc);\n\n this.messageHandlerFunc = this.createFunction((duelPtr, messageType) => {\n if (!this.logBufferPtr) {\n this.logBufferPtr = this.ocgcoreModule._malloc(this.logBufferSize);\n }\n this.ocgcoreModule._get_log_message(duelPtr, this.logBufferPtr);\n const message = this.getUTF8String(this.logBufferPtr);\n const type =\n messageType === 2\n ? OcgcoreMessageType.DebugMessage\n : OcgcoreMessageType.ScriptError;\n const duel = this.getOrCreateDuel(duelPtr);\n this.handleMessage(duel, message, type);\n }, 'iii');\n this.ocgcoreModule._set_message_handler(this.messageHandlerFunc);\n }\n\n readScript(scriptPath: string): Uint8Array | null {\n let content: string | Uint8Array | null | undefined;\n for (const reader of this.scriptReaders) {\n try {\n content = reader(scriptPath);\n } catch {\n content = null;\n }\n if (content != null) {\n break;\n }\n }\n return typeof content === 'string'\n ? this.encoder.encode(content)\n : (content ?? null);\n }\n\n readCard(cardId: number): Partial<CardData> | null {\n let data: Partial<CardData> | null | undefined;\n for (const reader of this.cardReaders) {\n try {\n data = reader(cardId);\n } catch {\n data = null;\n }\n if (data) {\n break;\n }\n }\n return data ?? null;\n }\n\n handleMessage(\n duel: OcgcoreDuel,\n message: string,\n type: OcgcoreMessageType,\n ): void {\n for (const handler of this.messageHandlers) {\n try {\n handler(duel, message, type);\n } catch {\n // ignore handler errors\n }\n }\n }\n\n getUTF8String(ptr: number): string {\n let length = 0;\n while (this.heapU8[ptr + length] !== 0) {\n length++;\n }\n return this.decoder.decode(this.heapU8.subarray(ptr, ptr + length));\n }\n\n setHeap(ptr: number, data: Uint8Array): void {\n this.heapU8.set(data, ptr);\n }\n\n copyHeap(ptr: number, length: number): Uint8Array {\n return this.heapU8.slice(ptr, ptr + length);\n }\n\n useTmpData<R>(\n cb: (...args: number[]) => R,\n ...args: Array<string | Uint8Array>\n ): R {\n const encoded = args.map((item) =>\n typeof item === 'string' ? this.encoder.encode(item) : item,\n );\n const totalLength = encoded.reduce(\n (acc, bytes) => acc + bytes.length + 1,\n 0,\n );\n if (totalLength > this.tmpStringBufferSize) {\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n }\n this.tmpStringBufferPtr = this.ocgcoreModule._malloc(totalLength);\n this.tmpStringBufferSize = totalLength;\n }\n\n let offset = 0;\n const ptrs = encoded.map((bytes) => {\n const ptr = this.tmpStringBufferPtr + offset;\n this.heapU8.set(bytes, ptr);\n this.heapU8[ptr + bytes.length] = 0;\n offset += bytes.length + 1;\n return ptr;\n });\n\n return cb(...ptrs);\n }\n\n private createFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n addFunction(\n fn: (...args: number[]) => number | void,\n signature: string,\n ): number {\n return this.ocgcoreModule.addFunction(fn, signature);\n }\n\n removeFunction(index: number): void {\n this.ocgcoreModule.removeFunction(index);\n }\n\n createDuel(seed: number): OcgcoreDuel {\n const duelPtr = this.ocgcoreModule._create_duel(seed);\n return this.getOrCreateDuel(duelPtr);\n }\n\n createDuelV2(seedSequence: number[]): OcgcoreDuel {\n const count = seedSequence.length;\n const byteLength = count * 4;\n const ptr = this.ocgcoreModule._malloc(byteLength);\n const view = new Uint32Array(this.heapU8.buffer, ptr, count);\n for (let i = 0; i < count; i++) {\n view[i] = seedSequence[i] >>> 0;\n }\n const duelPtr = this.ocgcoreModule._create_duel_v2(ptr);\n this.ocgcoreModule._free(ptr);\n return this.getOrCreateDuel(duelPtr);\n }\n\n _defaultScriptReader(namePtr: number, dataPtr: number): number {\n return this.ocgcoreModule._default_script_reader(namePtr, dataPtr);\n }\n\n malloc(size: number): number {\n return this.ocgcoreModule._malloc(size);\n }\n\n free(ptr: number): void {\n this.ocgcoreModule._free(ptr);\n }\n\n _stdioExit(): void {\n this.ocgcoreModule.___stdio_exit();\n }\n\n setScriptReader(reader: ScriptReader, reset = false): this {\n if (reset) {\n this.scriptReaders = [];\n }\n this.scriptReaders.push(reader);\n return this;\n }\n\n setCardReader(reader: CardReader, reset = false): this {\n if (reset) {\n this.cardReaders = [];\n }\n this.cardReaders.push(reader);\n return this;\n }\n\n setMessageHandler(handler: MessageHandler, reset = false): this {\n if (reset) {\n this.messageHandlers = [];\n }\n this.messageHandlers.push(handler);\n return this;\n }\n\n getOrCreateDuel(duelPtr: number): OcgcoreDuel {\n const existing = this.duels.get(duelPtr);\n if (existing) {\n return existing;\n }\n const duel = new OcgcoreDuel(this, duelPtr);\n this.duels.set(duelPtr, duel);\n return duel;\n }\n\n forgetDuel(duelPtr: number): void {\n this.duels.delete(duelPtr);\n }\n\n finalize(): void {\n if (this.scriptReaderFunc) {\n this.ocgcoreModule.removeFunction(this.scriptReaderFunc);\n this.scriptReaderFunc = 0;\n }\n if (this.cardReaderFunc) {\n this.ocgcoreModule.removeFunction(this.cardReaderFunc);\n this.cardReaderFunc = 0;\n }\n if (this.messageHandlerFunc) {\n this.ocgcoreModule.removeFunction(this.messageHandlerFunc);\n this.messageHandlerFunc = 0;\n }\n\n if (this.scriptBufferPtr) {\n this.ocgcoreModule._free(this.scriptBufferPtr);\n this.scriptBufferPtr = 0;\n this.scriptBufferSize = 0;\n }\n if (this.logBufferPtr) {\n this.ocgcoreModule._free(this.logBufferPtr);\n this.logBufferPtr = 0;\n this.logBufferSize = 0;\n }\n if (this.tmpStringBufferPtr) {\n this.ocgcoreModule._free(this.tmpStringBufferPtr);\n this.tmpStringBufferPtr = 0;\n this.tmpStringBufferSize = 0;\n }\n }\n}\n", "export enum OcgcoreMessageType {\n ScriptError = 'ScriptError',\n DebugMessage = 'DebugMessage',\n}\n\nexport enum OcgcoreDuelRule {\n Rule1 = 1,\n Rule2 = 2,\n MasterRule3 = 3,\n NewMasterRule = 4,\n MasterRule2020 = 5,\n}\n\nexport enum OcgcoreDuelOptionFlag {\n TestMode = 0x01,\n AttackFirstTurn = 0x02,\n ObsoleteRuling = 0x08,\n PseudoShuffle = 0x10,\n TagMode = 0x20,\n SimpleAI = 0x40,\n ReturnDeckTop = 0x80,\n RevealDeckSeq = 0x100,\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\nimport createOcgcore from './vendor/wasm_esm/libocgcore.mjs';\nimport { normalizeOcgcoreFactory } from './ocgcore-wrapper-utils';\n\nexport async function loadOcgcoreFactory(): Promise<OcgcoreFactory> {\n return normalizeOcgcoreFactory(createOcgcore as unknown);\n}\n", "import type { OcgcoreFactory } from './vendor/libocgcore.shared';\n\ntype OcgcoreFactoryModule = { default?: OcgcoreFactory } | OcgcoreFactory;\n\nexport function normalizeOcgcoreFactory(mod: unknown): OcgcoreFactory {\n const typed = mod as OcgcoreFactoryModule;\n if (typeof typed === 'function') {\n return typed as OcgcoreFactory;\n }\n if (typed && typeof (typed as { default?: unknown }).default === 'function') {\n return (typed as { default: OcgcoreFactory }).default;\n }\n throw new Error('Invalid ocgcore factory module');\n}\n", "import type { OcgcoreModule } from './vendor/libocgcore.shared';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { loadOcgcoreFactory } from './load-ocgcore-factory';\n\nexport interface CreateOcgcoreWrapperOptions {\n moduleOverrides?: Partial<OcgcoreModule>;\n wasmBinary?: Uint8Array;\n locateFile?: (path: string, prefix?: string) => string;\n}\n\nexport async function createOcgcoreWrapper(\n options: CreateOcgcoreWrapperOptions = {},\n): Promise<OcgcoreWrapper> {\n const factory = await loadOcgcoreFactory();\n const overrides: Partial<OcgcoreModule> = {\n ...options.moduleOverrides,\n };\n if (options.wasmBinary) {\n overrides.wasmBinary =\n options.wasmBinary as unknown as OcgcoreModule['wasmBinary'];\n }\n if (options.locateFile) {\n overrides.locateFile =\n options.locateFile as unknown as OcgcoreModule['locateFile'];\n }\n const moduleInstance = await factory(overrides);\n return new OcgcoreWrapper(moduleInstance);\n}\n", "import JSZip from 'jszip';\n\nimport { ScriptReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\n\nconst SCRIPT_PREFIX = './script/';\n\nfunction normalizePath(input: string): string {\n let path = input.replace(/\\\\/g, '/');\n if (path.startsWith(SCRIPT_PREFIX)) {\n path = path.slice(SCRIPT_PREFIX.length);\n }\n return path;\n}\n\nfunction buildCandidates(filename: string): string[] {\n const entries = [\n filename,\n `specials/${filename}`,\n `expansions/script/${filename}`,\n `script/${filename}`,\n ];\n const candidates: string[] = [];\n for (const entry of entries) {\n candidates.push(entry);\n if (!entry.startsWith('./')) {\n const dotEntry = entry.startsWith('/')\n ? `./${entry.slice(1)}`\n : `./${entry}`;\n candidates.push(dotEntry);\n }\n }\n return candidates;\n}\n\nfunction joinPath(baseDir: string, relativePath: string): string {\n const pathMod = getNodePath();\n if (pathMod) {\n return pathMod.join(baseDir, relativePath);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = relativePath.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nexport function MapScriptReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const candidate of candidates) {\n for (const map of maps) {\n if (map.has(candidate)) {\n return map.get(candidate) ?? null;\n }\n }\n }\n return null;\n };\n}\n\nexport function DirScriptReader(...baseDirs: string[]): ScriptReader {\n const fs = getNodeFs();\n return (path) => {\n const filename = normalizePath(path);\n if (!filename.toLowerCase().endsWith('.lua')) {\n return null;\n }\n const candidates = buildCandidates(filename);\n for (const baseDir of baseDirs) {\n for (const candidate of candidates) {\n const normalized = candidate.startsWith('/')\n ? candidate.slice(1)\n : candidate;\n const fullPath = joinPath(baseDir, normalized);\n if (fs.existsSync(fullPath)) {\n return fs.readFileSync(fullPath);\n }\n }\n }\n return null;\n };\n}\n\nfunction normalizeZipEntryName(name: string): string[] {\n const normalized = name.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n const names = new Set<string>();\n names.add(normalized);\n if (normalized.startsWith('script/')) {\n names.add(normalized.slice('script/'.length));\n }\n return Array.from(names);\n}\n\nexport async function ZipScriptReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n const maps = await Promise.all(\n inputs.map(async (data) => {\n const zip = await JSZip.loadAsync(data);\n const map = new Map<string, string | Uint8Array>();\n const entries = Object.values(zip.files);\n await Promise.all(\n entries.map(async (entry) => {\n if (entry.dir) {\n return;\n }\n if (!entry.name.toLowerCase().endsWith('.lua')) {\n return;\n }\n const content = await entry.async('uint8array');\n for (const name of normalizeZipEntryName(entry.name)) {\n map.set(name, content);\n }\n }),\n );\n return map;\n }),\n );\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use MapScriptReader instead. */\nexport function MapReader(\n ...maps: Array<Map<string, string | Uint8Array>>\n): ScriptReader {\n return MapScriptReader(...maps);\n}\n\n/** @deprecated Use DirScriptReader instead. */\nexport function DirReader(...baseDirs: string[]): ScriptReader {\n return DirScriptReader(...baseDirs);\n}\n\n/** @deprecated Use ZipScriptReader instead. */\nexport async function ZipReader(\n ...inputs: Array<Uint8Array | ArrayBuffer | Blob>\n): Promise<ScriptReader> {\n return ZipScriptReader(...inputs);\n}\n", "export function loadNodeModule<T>(id: string, altId?: string): T | null {\n const req =\n typeof module.require !== 'undefined' ? module.require : undefined;\n if (!req) {\n return null;\n }\n try {\n return req(id) as T;\n } catch {\n if (!altId) return null;\n try {\n return req(altId) as T;\n } catch {\n return null;\n }\n }\n}\n", "type NodeStats = {\n isFile: () => boolean;\n};\n\ntype NodeFsPromises = {\n readFile: (path: string) => Promise<Uint8Array>;\n readdir: (path: string) => Promise<string[]>;\n stat: (path: string) => Promise<NodeStats>;\n access: (path: string) => Promise<void>;\n};\n\nexport type NodeFs = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string) => Uint8Array;\n promises: NodeFsPromises;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodeFs(noThrow = false): NodeFs | null {\n const mod = loadNodeModule<NodeFs>('node:fs', 'fs');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js fs module is not available.');\n}\n", "export type NodePath = {\n join: (...parts: string[]) => string;\n};\n\nimport { loadNodeModule } from './load-node-module';\n\nexport function getNodePath(noThrow = false): NodePath | null {\n const mod = loadNodeModule<NodePath>('node:path', 'path');\n if (mod) return mod;\n if (noThrow) return null;\n throw new Error('Node.js path module is not available.');\n}\n", "import { getNodeFs } from './node-fs';\nimport { getNodePath } from './node-path';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function searchZips(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const results: string[] = [];\n const rootEntries = await safeReadDir(fs, baseDir);\n for (const entry of rootEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, baseDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n const expansionEntries = await safeReadDir(fs, expansionsDir);\n for (const entry of expansionEntries) {\n const lower = entry.toLowerCase();\n if (!lower.endsWith('.zip') && !lower.endsWith('.ypk')) {\n continue;\n }\n const fullPath = joinPath(pathMod, expansionsDir, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n results.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n\n return results;\n}\n", "import type { ScriptReader } from '../types/callback';\nimport { DirScriptReader, ZipScriptReader } from './script-readers';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nexport async function DirScriptReaderEx(\n ...baseDirs: string[]\n): Promise<ScriptReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirScriptReaderEx');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirScriptReaderEx');\n const fsReader = DirScriptReader(...baseDirs);\n\n const zipInputs: Uint8Array[] = [];\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n zipInputs.push(await fs.promises.readFile(zipPath));\n } catch {\n continue;\n }\n }\n }\n\n if (zipInputs.length === 0) {\n return fsReader;\n }\n\n const zipReader = await ZipScriptReader(...zipInputs);\n return (path) => fsReader(path) ?? zipReader(path);\n}\n", "import type { Database } from 'sql.js';\nimport { OcgcoreCommonConstants } from '../vendor';\nimport type { CardData } from 'ygopro-msg-encode';\nimport type { CardReader } from '../types/callback';\n\ntype SqljsRow = {\n id: number;\n alias: number;\n setcode: number | bigint;\n type: number;\n atk: number;\n def: number;\n level: number;\n race: number;\n attribute: number;\n};\n\nfunction toNumberArrayFromSetcode(value: number | bigint): number[] {\n let raw = typeof value === 'bigint' ? value : BigInt(value >>> 0);\n const list: number[] = [];\n while (raw !== 0n && list.length < 16) {\n const chunk = raw & 0xffffn;\n if (chunk !== 0n) {\n list.push(Number(chunk));\n }\n raw >>= 16n;\n }\n return list;\n}\n\nfunction mapRowToCardData(row: SqljsRow): Partial<CardData> {\n const type = (row.type ?? 0) >>> 0;\n const attack = row.atk ?? 0;\n let defense = row.def ?? 0;\n let linkMarker = 0;\n if ((type & OcgcoreCommonConstants.TYPE_LINK) >>> 0 !== 0) {\n linkMarker = defense;\n defense = 0;\n }\n const levelRaw = (row.level ?? 0) >>> 0;\n const level = (levelRaw & 0xff) >>> 0;\n const lscale = ((levelRaw >>> 24) & 0xff) >>> 0;\n const rscale = ((levelRaw >>> 16) & 0xff) >>> 0;\n\n return {\n code: row.id,\n alias: row.alias ?? 0,\n setcode: toNumberArrayFromSetcode(row.setcode ?? 0),\n type,\n level,\n attribute: (row.attribute ?? 0) >>> 0,\n race: (row.race ?? 0) >>> 0,\n attack,\n defense,\n lscale,\n rscale,\n linkMarker,\n };\n}\n\nfunction queryOne(db: Database, cardId: number): Partial<CardData> | null {\n if (typeof db.prepare === 'function') {\n const stmt = db.prepare(\n 'SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ?',\n );\n try {\n stmt.bind([cardId]);\n if (!stmt.step()) {\n return null;\n }\n const row = stmt.getAsObject() as unknown as SqljsRow;\n if (!row || row.id == null) {\n return null;\n }\n return mapRowToCardData(row);\n } finally {\n stmt.free();\n }\n }\n\n const res = db.exec(\n `SELECT id, alias, setcode, type, atk, def, level, race, attribute FROM datas WHERE id = ${cardId}`,\n );\n if (\n !res ||\n res.length === 0 ||\n !res[0].values ||\n res[0].values.length === 0\n ) {\n return null;\n }\n const row = res[0].values[0] as unknown[];\n return mapRowToCardData({\n id: row[0] as number,\n alias: row[1] as number,\n setcode: row[2] as number,\n type: row[3] as number,\n atk: row[4] as number,\n def: row[5] as number,\n level: row[6] as number,\n race: row[7] as number,\n attribute: row[8] as number,\n });\n}\n\nexport function SqljsCardReader(...dbs: Database[]): CardReader {\n return (cardId: number) => {\n for (const db of dbs) {\n const data = queryOne(db, cardId);\n if (data) {\n return data;\n }\n }\n return null;\n };\n}\n\n/** @deprecated Use SqljsCardReader instead. */\nexport function createSqljsCardReader(...dbs: Database[]): CardReader {\n return SqljsCardReader(...dbs);\n}\n", "import JSZip from 'jszip';\n\nimport type { CardReader } from '../types/callback';\nimport { getNodeFs } from '../utility/node-fs';\nimport { getNodePath } from '../utility/node-path';\nimport { searchZips } from '../utility/search-zips';\nimport { SqljsCardReader } from './sqljs-card-reader';\nimport type { SqlJsStatic } from 'sql.js';\n\ntype NodeFs = NonNullable<ReturnType<typeof getNodeFs>>;\ntype NodePath = NonNullable<ReturnType<typeof getNodePath>>;\n\nfunction joinPath(\n pathMod: NodePath | null,\n baseDir: string,\n rel: string,\n): string {\n if (pathMod) {\n return pathMod.join(baseDir, rel);\n }\n const trimmedBase = baseDir.replace(/[/\\\\]+$/, '');\n const trimmedRel = rel.replace(/^[/\\\\]+/, '');\n return `${trimmedBase}/${trimmedRel}`;\n}\n\nfunction getNodeModuleOrThrow<T>(value: T | null, label: string): T {\n if (!value) {\n throw new Error(`${label} is not supported in this runtime.`);\n }\n return value;\n}\n\nasync function safeReadDir(fs: NodeFs, dirPath: string): Promise<string[]> {\n try {\n return await fs.promises.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nasync function collectFsDbPaths(\n fs: NodeFs,\n pathMod: NodePath | null,\n baseDir: string,\n): Promise<string[]> {\n const collectCdbFiles = async (dirPath: string): Promise<string[]> => {\n const paths: string[] = [];\n const entries = await safeReadDir(fs, dirPath);\n for (const entry of entries) {\n if (!entry.toLowerCase().endsWith('.cdb')) {\n continue;\n }\n const fullPath = joinPath(pathMod, dirPath, entry);\n try {\n const stats = await fs.promises.stat(fullPath);\n if (stats.isFile()) {\n paths.push(fullPath);\n }\n } catch {\n continue;\n }\n }\n return paths;\n };\n\n const results: string[] = [];\n\n const expansionsDir = joinPath(pathMod, baseDir, 'expansions');\n results.push(...(await collectCdbFiles(expansionsDir)));\n\n results.push(...(await collectCdbFiles(baseDir)));\n\n return results;\n}\n\nfunction isRootCdbEntry(entryName: string): boolean {\n const normalized = entryName.replace(/\\\\/g, '/').replace(/^\\.?\\//, '');\n return !normalized.includes('/') && normalized.toLowerCase().endsWith('.cdb');\n}\n\nexport async function DirCardReader(\n sqljs: SqlJsStatic,\n ...baseDirs: string[]\n): Promise<CardReader> {\n const fs = getNodeModuleOrThrow(getNodeFs(), 'DirCardReader');\n const pathMod = getNodeModuleOrThrow(getNodePath(), 'DirCardReader');\n\n const dbs: unknown[] = [];\n for (const baseDir of baseDirs) {\n const dbPaths = await collectFsDbPaths(fs, pathMod, baseDir);\n for (const dbPath of dbPaths) {\n try {\n const bytes = await fs.promises.readFile(dbPath);\n dbs.push(new sqljs.Database(bytes));\n } catch {\n continue;\n }\n }\n }\n\n for (const baseDir of baseDirs) {\n const zipPaths = await searchZips(fs, pathMod, baseDir);\n for (const zipPath of zipPaths) {\n try {\n const bytes = await fs.promises.readFile(zipPath);\n const zip = await JSZip.loadAsync(bytes);\n const entries = Object.values(zip.files);\n for (const entry of entries) {\n if (entry.dir || !isRootCdbEntry(entry.name)) {\n continue;\n }\n try {\n const content = await entry.async('uint8array');\n dbs.push(new sqljs.Database(content));\n } catch {\n continue;\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n return SqljsCardReader(...(dbs as Parameters<typeof SqljsCardReader>));\n}\n", "import { YGOProYrp } from 'ygopro-yrp-encode';\n\nimport { OcgcoreDuel } from './ocgcore-duel';\nimport { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreProcessResult } from './types';\nimport { YGOProMsgRetry } from 'ygopro-msg-encode';\n\nconst { LOCATION_DECK, LOCATION_EXTRA, POS_FACEDOWN_DEFENSE } =\n OcgcoreScriptConstants;\n\nfunction normalizeYrp(input: YGOProYrp | Uint8Array): YGOProYrp {\n if (input instanceof YGOProYrp) {\n return input;\n }\n return new YGOProYrp().fromYrp(input);\n}\n\nfunction loadDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n player: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newCard({\n code,\n owner,\n player,\n location: LOCATION_EXTRA,\n sequence: 0,\n position: POS_FACEDOWN_DEFENSE,\n });\n }\n}\n\nfunction loadTagDeck(\n duel: OcgcoreDuel,\n deck: { main?: number[]; extra?: number[] } | null,\n owner: number,\n): void {\n if (!deck) return;\n for (const code of deck.main ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_DECK,\n });\n }\n for (const code of deck.extra ?? []) {\n duel.newTagCard({\n code,\n owner,\n location: LOCATION_EXTRA,\n });\n }\n}\n\nfunction setRegistryValue(duel: OcgcoreDuel, key: string, value: string): void {\n duel.setRegistryValue(key, value);\n}\n\nexport function createDuelFromYrp(\n wrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const yrp = normalizeYrp(yrpInput);\n const header = yrp.header;\n const seedSequence = header?.seedSequence ?? [];\n const duel =\n seedSequence.length > 0\n ? wrapper.createDuelV2(seedSequence)\n : wrapper.createDuel(header?.seed ?? 0);\n\n setRegistryValue(duel, 'duel_mode', yrp.isTag ? 'tag' : 'single');\n setRegistryValue(duel, 'start_lp', String(yrp.startLp));\n setRegistryValue(duel, 'start_hand', String(yrp.startHand));\n setRegistryValue(duel, 'draw_count', String(yrp.drawCount));\n\n const playerNames = yrp.isTag\n ? [\n yrp.hostName,\n yrp.tagHostName ?? '',\n yrp.tagClientName ?? '',\n yrp.clientName,\n ]\n : [yrp.hostName, yrp.clientName];\n for (let i = 0; i < playerNames.length; i++) {\n setRegistryValue(duel, `player_name_${i}`, playerNames[i] ?? '');\n }\n setRegistryValue(duel, 'player_type_0', '0');\n setRegistryValue(duel, 'player_type_1', '1');\n\n duel.setPlayerInfo({\n player: 0,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n duel.setPlayerInfo({\n player: 1,\n lp: yrp.startLp,\n startHand: yrp.startHand,\n drawCount: yrp.drawCount,\n });\n\n duel.preloadScript('./script/patches/entry.lua');\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n\n if (yrp.isSingleMode && yrp.singleScript) {\n duel.preloadScript(`./single/${yrp.singleScript}`);\n } else if (yrp.isTag) {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadTagDeck(duel, yrp.tagHostDeck, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n loadTagDeck(duel, yrp.tagClientDeck, 1);\n } else {\n loadDeck(duel, yrp.hostDeck, 0, 0);\n loadDeck(duel, yrp.clientDeck, 1, 1);\n }\n\n duel.startDuel(yrp.opt >>> 0);\n return { yrp, duel };\n}\n\nexport function* playYrpStep(\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) {\n const { yrp, duel } = createDuelFromYrp(ocgcoreWrapper, yrpInput);\n\n const responses = yrp.responses.slice();\n try {\n for (const result of duel.advance(() => responses.shift())) {\n yield {\n duel,\n result,\n responses,\n };\n if (result.message instanceof YGOProMsgRetry) {\n throw new Error('Got MSG_RETRY');\n }\n }\n } finally {\n duel.endDuel();\n }\n}\n\nexport const playYrp = (\n ocgcoreWrapper: OcgcoreWrapper,\n yrpInput: YGOProYrp | Uint8Array,\n) => {\n const results: Uint8Array[] = [];\n for (const result of playYrpStep(ocgcoreWrapper, yrpInput)) {\n results.push(result.result.raw);\n }\n return results;\n};\n", "import { OcgcoreWrapper } from './ocgcore-wrapper';\nimport { OcgcoreCommonConstants, OcgcoreScriptConstants } from './vendor';\nimport { OcgcoreMessageType } from './types/ocgcore-enums';\n\nconst { LOCATION_DECK, POS_FACEUP_ATTACK } = OcgcoreScriptConstants;\n\nexport interface TestCardMessage {\n type: OcgcoreMessageType;\n message: string;\n}\n\nexport function testCard(\n ocgcoreWrapper: OcgcoreWrapper,\n ...ids: number[]\n): TestCardMessage[] {\n const logs: TestCardMessage[] = [];\n const duel = ocgcoreWrapper.createDuelV2(\n Array.from(\n { length: 8 },\n () => Math.floor(Math.random() * 0xffffffff) >>> 0,\n ),\n );\n\n ocgcoreWrapper.setMessageHandler((_duel, message, type) => {\n if (duel.duelPtr !== _duel.duelPtr) return;\n logs.push({ type, message });\n });\n\n duel.preloadScript('./script/special.lua');\n duel.preloadScript('./script/init.lua');\n duel.setPlayerInfo({ player: 0, lp: 8000, startHand: 5, drawCount: 1 });\n duel.setPlayerInfo({ player: 1, lp: 8000, startHand: 5, drawCount: 1 });\n\n for (const code of ids) {\n duel.newCard({\n code,\n owner: 0,\n player: 0,\n location: LOCATION_DECK,\n sequence: 0,\n position: POS_FACEUP_ATTACK,\n });\n }\n\n duel.startDuel(0);\n\n while (true) {\n const { status, raw } = duel.process();\n if (raw.length > 0 && raw[0] === OcgcoreCommonConstants.MSG_RETRY) {\n break;\n }\n if (status === 0) {\n continue;\n }\n break;\n }\n\n duel.endDuel();\n return logs;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Buffer", "OcgcoreMessageType", "OcgcoreDuelRule", "OcgcoreDuelOptionFlag", "joinPath", "row", "JSZip", "joinPath", "getNodeModuleOrThrow", "safeReadDir", "JSZip", "YGOProMsgRetry", "LOCATION_DECK", "Buffer"]
|
|
7
7
|
}
|
|
@@ -14,6 +14,7 @@ export declare class OcgcoreDuel {
|
|
|
14
14
|
_getLogMessage(bufPtr: number): number;
|
|
15
15
|
private getMessage;
|
|
16
16
|
process(): OcgcoreProcessResult;
|
|
17
|
+
advance(advancor?: () => Uint8Array | void | null | undefined): Generator<OcgcoreProcessResult, void, unknown>;
|
|
17
18
|
newCard(card: OcgcoreNewCardParams): void;
|
|
18
19
|
newTagCard(card: OcgcoreNewTagCardParams): void;
|
|
19
20
|
queryCard(query: OcgcoreQueryCardParams): OcgcoreCardQueryResult;
|
package/dist/src/play-yrp.d.ts
CHANGED
|
@@ -6,12 +6,6 @@ export declare function createDuelFromYrp(wrapper: OcgcoreWrapper, yrpInput: YGO
|
|
|
6
6
|
yrp: YGOProYrp;
|
|
7
7
|
duel: OcgcoreDuel;
|
|
8
8
|
};
|
|
9
|
-
export declare function consumeResponseFromOcgcoreProcess(duel: OcgcoreDuel, result: OcgcoreProcessResult, responses: Uint8Array[]): boolean;
|
|
10
|
-
export declare function processYrpDuelStep(duel: OcgcoreDuel, yrp: YGOProYrp): Generator<{
|
|
11
|
-
duel: OcgcoreDuel;
|
|
12
|
-
result: OcgcoreProcessResult;
|
|
13
|
-
responses: Uint8Array<ArrayBufferLike>[];
|
|
14
|
-
}, void, unknown>;
|
|
15
9
|
export declare function playYrpStep(ocgcoreWrapper: OcgcoreWrapper, yrpInput: YGOProYrp | Uint8Array): Generator<{
|
|
16
10
|
duel: OcgcoreDuel;
|
|
17
11
|
result: OcgcoreProcessResult;
|
package/package.json
CHANGED