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 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 stepResult of processYrpDuelStep(duel, yrp)) {
1331
- yield stepResult;
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
@@ -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": "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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", "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 { YGOProMessages } from "ygopro-msg-encode";
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 stepResult of processYrpDuelStep(duel, yrp)) {
1247
- yield stepResult;
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
@@ -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;
@@ -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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishipro-core.js",
3
3
  "description": "WASM wrapper for YGOPro/ocgcore, designed for both Node and browser runtimes.",
4
- "version": "1.2.2",
4
+ "version": "1.2.3",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",