koishipro-core.js 1.2.3 → 1.2.5
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/README.md +75 -0
- package/dist/index.cjs +334 -1
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +332 -1
- package/dist/index.mjs.map +3 -3
- package/dist/src/advancors/combined-advancor.d.ts +2 -0
- package/dist/src/advancors/index.d.ts +10 -0
- package/dist/src/advancors/limit-advancor.d.ts +4 -0
- package/dist/src/advancors/map-advancor.d.ts +8 -0
- package/dist/src/advancors/no-effect-advancor.d.ts +1 -0
- package/dist/src/advancors/player-view-advancor.d.ts +3 -0
- package/dist/src/advancors/select-card-advancor.d.ts +7 -0
- package/dist/src/advancors/slient-advancor.d.ts +2 -0
- package/dist/src/advancors/static-advancor.d.ts +2 -0
- package/dist/src/advancors/summon-place-advancor.d.ts +5 -0
- package/dist/src/advancors/types.d.ts +2 -0
- package/dist/src/ocgcore-duel.d.ts +2 -1
- package/dist/src/play-yrp.d.ts +1 -2
- package/dist/src/types/card-location.d.ts +5 -0
- package/dist/src/types/index.d.ts +1 -0
- package/index.ts +1 -0
- package/package.json +3 -2
package/dist/index.mjs
CHANGED
|
@@ -214,7 +214,7 @@ var OcgcoreDuel = class {
|
|
|
214
214
|
break;
|
|
215
215
|
}
|
|
216
216
|
if (res.status === 1 && res.raw.length > 0) {
|
|
217
|
-
const response = advancor?.();
|
|
217
|
+
const response = advancor?.(res.message);
|
|
218
218
|
if (!response) {
|
|
219
219
|
break;
|
|
220
220
|
}
|
|
@@ -1295,11 +1295,332 @@ function testCard(ocgcoreWrapper, ...ids) {
|
|
|
1295
1295
|
return logs;
|
|
1296
1296
|
}
|
|
1297
1297
|
|
|
1298
|
+
// src/advancors/slient-advancor.ts
|
|
1299
|
+
var SlientAdvancor = () => {
|
|
1300
|
+
return (msg) => {
|
|
1301
|
+
return msg.defaultResponse();
|
|
1302
|
+
};
|
|
1303
|
+
};
|
|
1304
|
+
|
|
1305
|
+
// src/advancors/static-advancor.ts
|
|
1306
|
+
import { makeArray } from "nfkit";
|
|
1307
|
+
var StaticAdvancor = (items) => {
|
|
1308
|
+
const _items = makeArray(items).slice();
|
|
1309
|
+
return () => _items.shift();
|
|
1310
|
+
};
|
|
1311
|
+
|
|
1312
|
+
// src/advancors/no-effect-advancor.ts
|
|
1313
|
+
import { YGOProMsgSelectChain } from "ygopro-msg-encode";
|
|
1314
|
+
|
|
1315
|
+
// src/advancors/map-advancor.ts
|
|
1316
|
+
var MapAdvancorHandler = (msgClass, cb) => ({
|
|
1317
|
+
msgClass,
|
|
1318
|
+
cb
|
|
1319
|
+
});
|
|
1320
|
+
var MapAdvancor = (...handlers) => {
|
|
1321
|
+
const handlerMap = /* @__PURE__ */ new Map();
|
|
1322
|
+
for (const handleObj of handlers) {
|
|
1323
|
+
handlerMap.set(handleObj.msgClass, handleObj.cb);
|
|
1324
|
+
}
|
|
1325
|
+
return (msg) => {
|
|
1326
|
+
const cb = handlerMap.get(
|
|
1327
|
+
msg.constructor
|
|
1328
|
+
);
|
|
1329
|
+
if (cb != null) {
|
|
1330
|
+
const res = cb(msg);
|
|
1331
|
+
if (res != null) {
|
|
1332
|
+
return res;
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
return void 0;
|
|
1336
|
+
};
|
|
1337
|
+
};
|
|
1338
|
+
|
|
1339
|
+
// src/advancors/no-effect-advancor.ts
|
|
1340
|
+
var NoEffectAdvancor = () => MapAdvancor(
|
|
1341
|
+
MapAdvancorHandler(YGOProMsgSelectChain, (msg) => {
|
|
1342
|
+
if (msg.chains.length) {
|
|
1343
|
+
return;
|
|
1344
|
+
}
|
|
1345
|
+
return msg.prepareResponse(void 0);
|
|
1346
|
+
})
|
|
1347
|
+
);
|
|
1348
|
+
|
|
1349
|
+
// src/advancors/combined-advancor.ts
|
|
1350
|
+
var CombinedAdvancor = (...advancors) => {
|
|
1351
|
+
return (msg) => {
|
|
1352
|
+
for (const advancor of advancors) {
|
|
1353
|
+
const res = advancor(msg);
|
|
1354
|
+
if (res != null) {
|
|
1355
|
+
return res;
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
return void 0;
|
|
1359
|
+
};
|
|
1360
|
+
};
|
|
1361
|
+
|
|
1362
|
+
// src/advancors/limit-advancor.ts
|
|
1363
|
+
var LimitAdvancor = (a, limit = 1) => {
|
|
1364
|
+
let called = 0;
|
|
1365
|
+
return (msg) => {
|
|
1366
|
+
if (called >= limit) {
|
|
1367
|
+
return void 0;
|
|
1368
|
+
}
|
|
1369
|
+
const res = a(msg);
|
|
1370
|
+
if (res !== void 0) {
|
|
1371
|
+
called++;
|
|
1372
|
+
}
|
|
1373
|
+
return res;
|
|
1374
|
+
};
|
|
1375
|
+
};
|
|
1376
|
+
var OnceAdvancor = (a) => LimitAdvancor(a, 1);
|
|
1377
|
+
|
|
1378
|
+
// src/advancors/player-view-advancor.ts
|
|
1379
|
+
var PlayerViewAdvancor = (player, a) => (msg) => {
|
|
1380
|
+
if (msg.responsePlayer() === player) {
|
|
1381
|
+
return a(msg);
|
|
1382
|
+
}
|
|
1383
|
+
return void 0;
|
|
1384
|
+
};
|
|
1385
|
+
|
|
1386
|
+
// src/advancors/summon-place-advancor.ts
|
|
1387
|
+
import {
|
|
1388
|
+
YGOProMsgSelectPlace,
|
|
1389
|
+
YGOProMsgSelectPosition
|
|
1390
|
+
} from "ygopro-msg-encode";
|
|
1391
|
+
var SummonPlaceAdvancor = (placeAndPosition = {}) => MapAdvancor(
|
|
1392
|
+
MapAdvancorHandler(YGOProMsgSelectPlace, (msg) => {
|
|
1393
|
+
const places = msg.getSelectablePlaces().filter(
|
|
1394
|
+
(p) => (placeAndPosition.player == null || p.player === placeAndPosition.player) && (placeAndPosition.location == null || p.location === placeAndPosition.location) && (placeAndPosition.sequence == null || p.sequence === placeAndPosition.sequence)
|
|
1395
|
+
).slice(0, msg.count);
|
|
1396
|
+
return msg.prepareResponse(places);
|
|
1397
|
+
}),
|
|
1398
|
+
MapAdvancorHandler(YGOProMsgSelectPosition, (msg) => {
|
|
1399
|
+
if (placeAndPosition.position) {
|
|
1400
|
+
return msg.prepareResponse(placeAndPosition.position);
|
|
1401
|
+
}
|
|
1402
|
+
const possiblePositions = msg.positions;
|
|
1403
|
+
for (let i = 0; i < 8; i++) {
|
|
1404
|
+
const value = 1 << i;
|
|
1405
|
+
if ((possiblePositions & value) !== 0) {
|
|
1406
|
+
return msg.prepareResponse(value);
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
return void 0;
|
|
1410
|
+
})
|
|
1411
|
+
);
|
|
1412
|
+
|
|
1413
|
+
// src/advancors/select-card-advancor.ts
|
|
1414
|
+
import {
|
|
1415
|
+
IndexResponse,
|
|
1416
|
+
YGOProMsgSelectCard,
|
|
1417
|
+
YGOProMsgSelectSum,
|
|
1418
|
+
YGOProMsgSelectTribute,
|
|
1419
|
+
YGOProMsgSelectUnselectCard
|
|
1420
|
+
} from "ygopro-msg-encode";
|
|
1421
|
+
var SelectCardAdvancor = (...cards) => {
|
|
1422
|
+
const remainingCards = cards.slice();
|
|
1423
|
+
const applyFilter = (items, filter) => {
|
|
1424
|
+
return items.filter(
|
|
1425
|
+
(item) => Object.entries(filter).every(
|
|
1426
|
+
([key, value]) => value == null || item[key] === value
|
|
1427
|
+
)
|
|
1428
|
+
);
|
|
1429
|
+
};
|
|
1430
|
+
const pickCard = (items, min, max) => {
|
|
1431
|
+
const picked = [];
|
|
1432
|
+
const usedIndices = /* @__PURE__ */ new Set();
|
|
1433
|
+
const usedFilters = /* @__PURE__ */ new Set();
|
|
1434
|
+
for (const filter of remainingCards) {
|
|
1435
|
+
if (picked.length >= max) break;
|
|
1436
|
+
let matchIndex = -1;
|
|
1437
|
+
for (let i = 0; i < items.length; i++) {
|
|
1438
|
+
if (usedIndices.has(i)) continue;
|
|
1439
|
+
if (applyFilter([items[i]], filter).length === 1) {
|
|
1440
|
+
matchIndex = i;
|
|
1441
|
+
break;
|
|
1442
|
+
}
|
|
1443
|
+
}
|
|
1444
|
+
if (matchIndex < 0) continue;
|
|
1445
|
+
picked.push(IndexResponse(matchIndex));
|
|
1446
|
+
usedIndices.add(matchIndex);
|
|
1447
|
+
usedFilters.add(filter);
|
|
1448
|
+
}
|
|
1449
|
+
if (picked.length < min) {
|
|
1450
|
+
return void 0;
|
|
1451
|
+
}
|
|
1452
|
+
for (let i = remainingCards.length - 1; i >= 0; i--) {
|
|
1453
|
+
if (usedFilters.has(remainingCards[i])) {
|
|
1454
|
+
remainingCards.splice(i, 1);
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
return picked;
|
|
1458
|
+
};
|
|
1459
|
+
return MapAdvancor(
|
|
1460
|
+
MapAdvancorHandler(YGOProMsgSelectCard, (msg) => {
|
|
1461
|
+
const picked = pickCard(msg.cards, msg.min, msg.max);
|
|
1462
|
+
if (picked) {
|
|
1463
|
+
return msg.prepareResponse(picked);
|
|
1464
|
+
}
|
|
1465
|
+
}),
|
|
1466
|
+
MapAdvancorHandler(YGOProMsgSelectUnselectCard, (msg) => {
|
|
1467
|
+
const picked = pickCard(msg.selectableCards, 1, 1);
|
|
1468
|
+
if (picked) {
|
|
1469
|
+
return msg.prepareResponse(picked[0]);
|
|
1470
|
+
}
|
|
1471
|
+
}),
|
|
1472
|
+
MapAdvancorHandler(YGOProMsgSelectSum, (msg) => {
|
|
1473
|
+
const decodeOpParam = (opParam) => {
|
|
1474
|
+
const u = opParam >>> 0;
|
|
1475
|
+
if ((u & 2147483648) !== 0) {
|
|
1476
|
+
return { amount: u & 2147483647, extra: 0 };
|
|
1477
|
+
}
|
|
1478
|
+
return { amount: u & 65535, extra: u >>> 16 & 65535 };
|
|
1479
|
+
};
|
|
1480
|
+
const amountOf = (c) => decodeOpParam(c.opParam).amount;
|
|
1481
|
+
const mustSum = (msg.mustSelectCards ?? []).reduce(
|
|
1482
|
+
(acc, c) => acc + amountOf(c),
|
|
1483
|
+
0
|
|
1484
|
+
);
|
|
1485
|
+
const mustCount = (msg.mustSelectCards ?? []).length;
|
|
1486
|
+
const pickedIdx = [];
|
|
1487
|
+
const pickedIdxSet = /* @__PURE__ */ new Set();
|
|
1488
|
+
const totalSum = () => mustSum + pickedIdx.reduce((acc, i) => acc + amountOf(msg.cards[i]), 0);
|
|
1489
|
+
const totalCount = () => mustCount + pickedIdx.length;
|
|
1490
|
+
const filterMatch = /* @__PURE__ */ new Map();
|
|
1491
|
+
for (let fi = 0; fi < remainingCards.length; fi++) {
|
|
1492
|
+
const f = remainingCards[fi];
|
|
1493
|
+
const idx = msg.cards.findIndex(
|
|
1494
|
+
(c, i) => !pickedIdxSet.has(i) && applyFilter([c], f).length === 1
|
|
1495
|
+
);
|
|
1496
|
+
if (idx < 0) continue;
|
|
1497
|
+
pickedIdx.push(idx);
|
|
1498
|
+
pickedIdxSet.add(idx);
|
|
1499
|
+
filterMatch.set(fi, idx);
|
|
1500
|
+
}
|
|
1501
|
+
const consumeRemainingByFinalPick = () => {
|
|
1502
|
+
const usedFilterIdx = /* @__PURE__ */ new Set();
|
|
1503
|
+
for (const [fi, idx] of filterMatch.entries()) {
|
|
1504
|
+
if (pickedIdxSet.has(idx)) usedFilterIdx.add(fi);
|
|
1505
|
+
}
|
|
1506
|
+
for (let i = remainingCards.length - 1; i >= 0; i--) {
|
|
1507
|
+
if (usedFilterIdx.has(i)) remainingCards.splice(i, 1);
|
|
1508
|
+
}
|
|
1509
|
+
};
|
|
1510
|
+
const target = msg.sumVal;
|
|
1511
|
+
if (msg.mode === 1) {
|
|
1512
|
+
let s = totalSum();
|
|
1513
|
+
if (s < target) {
|
|
1514
|
+
for (let i = 0; i < msg.cards.length; i++) {
|
|
1515
|
+
if (s >= target) break;
|
|
1516
|
+
if (pickedIdxSet.has(i)) continue;
|
|
1517
|
+
pickedIdx.push(i);
|
|
1518
|
+
pickedIdxSet.add(i);
|
|
1519
|
+
s += amountOf(msg.cards[i]);
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
if (s < target) return;
|
|
1523
|
+
const removable = (pos) => {
|
|
1524
|
+
const idx = pickedIdx[pos];
|
|
1525
|
+
const v = amountOf(msg.cards[idx]);
|
|
1526
|
+
return s - v >= target;
|
|
1527
|
+
};
|
|
1528
|
+
for (let pos = pickedIdx.length - 1; pos >= 0; pos--) {
|
|
1529
|
+
if (!removable(pos)) continue;
|
|
1530
|
+
const idx = pickedIdx[pos];
|
|
1531
|
+
const v = amountOf(msg.cards[idx]);
|
|
1532
|
+
pickedIdx.splice(pos, 1);
|
|
1533
|
+
pickedIdxSet.delete(idx);
|
|
1534
|
+
s -= v;
|
|
1535
|
+
}
|
|
1536
|
+
for (const idx of pickedIdx) {
|
|
1537
|
+
if (s - amountOf(msg.cards[idx]) >= target) return;
|
|
1538
|
+
}
|
|
1539
|
+
consumeRemainingByFinalPick();
|
|
1540
|
+
return msg.prepareResponse(pickedIdx.map((i) => IndexResponse(i)));
|
|
1541
|
+
}
|
|
1542
|
+
const baseSum = mustSum;
|
|
1543
|
+
const baseCount = mustCount;
|
|
1544
|
+
const sumLeft = target - baseSum;
|
|
1545
|
+
const minLeft = Math.max(0, msg.min - baseCount);
|
|
1546
|
+
const maxLeft = Math.max(0, msg.max - baseCount);
|
|
1547
|
+
if (sumLeft < 0) return;
|
|
1548
|
+
if (maxLeft < 0) return;
|
|
1549
|
+
const preSum = pickedIdx.reduce(
|
|
1550
|
+
(acc, i) => acc + amountOf(msg.cards[i]),
|
|
1551
|
+
0
|
|
1552
|
+
);
|
|
1553
|
+
const preCount = pickedIdx.length;
|
|
1554
|
+
const sumNeed = sumLeft - preSum;
|
|
1555
|
+
const minNeed = Math.max(0, minLeft - preCount);
|
|
1556
|
+
const maxNeed = Math.max(0, maxLeft - preCount);
|
|
1557
|
+
if (sumNeed < 0) return;
|
|
1558
|
+
if (maxNeed < 0) return;
|
|
1559
|
+
const candidates = [];
|
|
1560
|
+
for (let i = 0; i < msg.cards.length; i++) {
|
|
1561
|
+
if (pickedIdxSet.has(i)) continue;
|
|
1562
|
+
const v = amountOf(msg.cards[i]);
|
|
1563
|
+
if (v <= sumNeed) candidates.push({ idx: i, v });
|
|
1564
|
+
}
|
|
1565
|
+
const keyOf = (sum, cnt) => `${sum}|${cnt}`;
|
|
1566
|
+
const dp = /* @__PURE__ */ new Map();
|
|
1567
|
+
dp.set(keyOf(0, 0), {});
|
|
1568
|
+
for (const c of candidates) {
|
|
1569
|
+
const snapshot = Array.from(dp.keys());
|
|
1570
|
+
for (const k of snapshot) {
|
|
1571
|
+
const [sStr, cStr] = k.split("|");
|
|
1572
|
+
const s = Number(sStr);
|
|
1573
|
+
const cnt = Number(cStr);
|
|
1574
|
+
const ns = s + c.v;
|
|
1575
|
+
const ncnt = cnt + 1;
|
|
1576
|
+
if (ns > sumNeed) continue;
|
|
1577
|
+
if (ncnt > maxNeed) continue;
|
|
1578
|
+
const nk = keyOf(ns, ncnt);
|
|
1579
|
+
if (dp.has(nk)) continue;
|
|
1580
|
+
dp.set(nk, { prevKey: k, takeIdx: c.idx });
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
let bestKey;
|
|
1584
|
+
for (let cnt = minNeed; cnt <= maxNeed; cnt++) {
|
|
1585
|
+
const k = keyOf(sumNeed, cnt);
|
|
1586
|
+
if (dp.has(k)) {
|
|
1587
|
+
bestKey = k;
|
|
1588
|
+
break;
|
|
1589
|
+
}
|
|
1590
|
+
}
|
|
1591
|
+
if (!bestKey) return;
|
|
1592
|
+
const extraIdx = [];
|
|
1593
|
+
let curKey = bestKey;
|
|
1594
|
+
while (curKey !== keyOf(0, 0)) {
|
|
1595
|
+
const node = dp.get(curKey);
|
|
1596
|
+
if (typeof node.takeIdx === "number") extraIdx.push(node.takeIdx);
|
|
1597
|
+
curKey = node.prevKey;
|
|
1598
|
+
}
|
|
1599
|
+
extraIdx.reverse();
|
|
1600
|
+
for (const i of extraIdx) {
|
|
1601
|
+
pickedIdx.push(i);
|
|
1602
|
+
pickedIdxSet.add(i);
|
|
1603
|
+
}
|
|
1604
|
+
if (totalCount() < msg.min || totalCount() > msg.max) return;
|
|
1605
|
+
if (totalSum() !== target) return;
|
|
1606
|
+
consumeRemainingByFinalPick();
|
|
1607
|
+
return msg.prepareResponse(pickedIdx.map((i) => IndexResponse(i)));
|
|
1608
|
+
}),
|
|
1609
|
+
MapAdvancorHandler(YGOProMsgSelectTribute, (msg) => {
|
|
1610
|
+
const picked = pickCard(msg.cards, msg.min, msg.max);
|
|
1611
|
+
if (picked) {
|
|
1612
|
+
return msg.prepareResponse(picked);
|
|
1613
|
+
}
|
|
1614
|
+
})
|
|
1615
|
+
);
|
|
1616
|
+
};
|
|
1617
|
+
|
|
1298
1618
|
// index.ts
|
|
1299
1619
|
if (typeof globalThis !== "undefined" && !globalThis.Buffer) {
|
|
1300
1620
|
globalThis.Buffer = Buffer2;
|
|
1301
1621
|
}
|
|
1302
1622
|
export {
|
|
1623
|
+
CombinedAdvancor,
|
|
1303
1624
|
DirCardReader,
|
|
1304
1625
|
DirReader,
|
|
1305
1626
|
DirScriptReader,
|
|
@@ -1307,17 +1628,27 @@ export {
|
|
|
1307
1628
|
LEN_EMPTY,
|
|
1308
1629
|
LEN_FAIL,
|
|
1309
1630
|
LEN_HEADER,
|
|
1631
|
+
LimitAdvancor,
|
|
1310
1632
|
MESSAGE_BUFFER_SIZE,
|
|
1633
|
+
MapAdvancor,
|
|
1634
|
+
MapAdvancorHandler,
|
|
1311
1635
|
MapReader,
|
|
1312
1636
|
MapScriptReader,
|
|
1637
|
+
NoEffectAdvancor,
|
|
1313
1638
|
OcgcoreDuel,
|
|
1314
1639
|
OcgcoreDuelOptionFlag,
|
|
1315
1640
|
OcgcoreDuelRule,
|
|
1316
1641
|
OcgcoreMessageType,
|
|
1317
1642
|
OcgcoreWrapper,
|
|
1643
|
+
OnceAdvancor,
|
|
1644
|
+
PlayerViewAdvancor,
|
|
1318
1645
|
QUERY_BUFFER_SIZE,
|
|
1319
1646
|
REGISTRY_BUFFER_SIZE,
|
|
1647
|
+
SelectCardAdvancor,
|
|
1648
|
+
SlientAdvancor,
|
|
1320
1649
|
SqljsCardReader,
|
|
1650
|
+
StaticAdvancor,
|
|
1651
|
+
SummonPlaceAdvancor,
|
|
1321
1652
|
ZipReader,
|
|
1322
1653
|
ZipScriptReader,
|
|
1323
1654
|
vendor_exports as _OcgcoreConstants,
|