Commit 4ecf82ee authored by nanahira's avatar nanahira

add onResponse

parent 74add160
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
"ygopro-cdb-encode": "^1.0.2", "ygopro-cdb-encode": "^1.0.2",
"ygopro-deck-encode": "^1.0.15", "ygopro-deck-encode": "^1.0.15",
"ygopro-lflist-encode": "^1.0.3", "ygopro-lflist-encode": "^1.0.3",
"ygopro-msg-encode": "^1.1.10", "ygopro-msg-encode": "^1.1.13",
"ygopro-yrp-encode": "^1.0.1", "ygopro-yrp-encode": "^1.0.1",
"yuzuthread": "^1.0.8" "yuzuthread": "^1.0.8"
}, },
...@@ -79,7 +79,6 @@ ...@@ -79,7 +79,6 @@
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.29.0", "@babel/code-frame": "^7.29.0",
"@babel/generator": "^7.29.0", "@babel/generator": "^7.29.0",
...@@ -1606,7 +1605,6 @@ ...@@ -1606,7 +1605,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz",
"integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"undici-types": "~7.16.0" "undici-types": "~7.16.0"
} }
...@@ -1690,7 +1688,6 @@ ...@@ -1690,7 +1688,6 @@
"integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.55.0", "@typescript-eslint/scope-manager": "8.55.0",
"@typescript-eslint/types": "8.55.0", "@typescript-eslint/types": "8.55.0",
...@@ -2171,7 +2168,6 @@ ...@@ -2171,7 +2168,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
...@@ -2568,7 +2564,6 @@ ...@@ -2568,7 +2564,6 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"baseline-browser-mapping": "^2.9.0", "baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759", "caniuse-lite": "^1.0.30001759",
...@@ -3229,7 +3224,6 @@ ...@@ -3229,7 +3224,6 @@
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1", "@eslint-community/regexpp": "^4.6.1",
...@@ -3286,7 +3280,6 @@ ...@@ -3286,7 +3280,6 @@
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"eslint-config-prettier": "bin/cli.js" "eslint-config-prettier": "bin/cli.js"
}, },
...@@ -4163,7 +4156,6 @@ ...@@ -4163,7 +4156,6 @@
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.9.2.tgz", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.9.2.tgz",
"integrity": "sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==", "integrity": "sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@ioredis/commands": "1.5.0", "@ioredis/commands": "1.5.0",
"cluster-key-slot": "^1.1.0", "cluster-key-slot": "^1.1.0",
...@@ -4408,7 +4400,6 @@ ...@@ -4408,7 +4400,6 @@
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@jest/core": "30.2.0", "@jest/core": "30.2.0",
"@jest/types": "30.2.0", "@jest/types": "30.2.0",
...@@ -5851,7 +5842,6 @@ ...@@ -5851,7 +5842,6 @@
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"prettier": "bin/prettier.cjs" "prettier": "bin/prettier.cjs"
}, },
...@@ -6700,7 +6690,6 @@ ...@@ -6700,7 +6690,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
...@@ -6853,7 +6842,6 @@ ...@@ -6853,7 +6842,6 @@
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@cspotcode/source-map-support": "^0.8.0", "@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7", "@tsconfig/node10": "^1.0.7",
...@@ -6962,7 +6950,6 @@ ...@@ -6962,7 +6950,6 @@
"resolved": "https://registry.npmjs.org/typed-struct/-/typed-struct-2.7.1.tgz", "resolved": "https://registry.npmjs.org/typed-struct/-/typed-struct-2.7.1.tgz",
"integrity": "sha512-GluzA9kYlHjATJmzBDA2X9G9237Md5zsJsc8uEkmpvUFeuUvt+e7Sq11/nQnVB2VZIfKNR1CrwTCgpJVz52pAA==", "integrity": "sha512-GluzA9kYlHjATJmzBDA2X9G9237Md5zsJsc8uEkmpvUFeuUvt+e7Sq11/nQnVB2VZIfKNR1CrwTCgpJVz52pAA==",
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
...@@ -6989,7 +6976,6 @@ ...@@ -6989,7 +6976,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"
...@@ -7439,9 +7425,9 @@ ...@@ -7439,9 +7425,9 @@
} }
}, },
"node_modules/ygopro-msg-encode": { "node_modules/ygopro-msg-encode": {
"version": "1.1.10", "version": "1.1.13",
"resolved": "https://registry.npmjs.org/ygopro-msg-encode/-/ygopro-msg-encode-1.1.10.tgz", "resolved": "https://registry.npmjs.org/ygopro-msg-encode/-/ygopro-msg-encode-1.1.13.tgz",
"integrity": "sha512-lRTbBwf3Gr6x1hIvTeojdbcWw91/UlbYAhjgPgH9RgUk+2Av18iq8hayKkZgpjqbYhdlHqyZj4aBMgDI+F5eJw==", "integrity": "sha512-wWRn6zH4kgg8vS2Z9CCzTAMwPe6WWjZLFizdtUEO6uY+uTNn+dMEIWQpQKHL4eAMXexNDZG1lVGm70eaIKeUkw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"typed-reflector": "^1.0.14", "typed-reflector": "^1.0.14",
......
...@@ -27,6 +27,7 @@ export const defaultConfig = { ...@@ -27,6 +27,7 @@ export const defaultConfig = {
DECK_EXTRA_MAX: '15', DECK_EXTRA_MAX: '15',
DECK_SIDE_MAX: '15', DECK_SIDE_MAX: '15',
DECK_MAX_COPIES: '3', DECK_MAX_COPIES: '3',
OCGCORE_DEBUG_LOG: '',
...(Object.fromEntries( ...(Object.fromEntries(
Object.entries(DefaultHostinfo).map(([key, value]) => [ Object.entries(DefaultHostinfo).map(([key, value]) => [
`HOSTINFO_${key.toUpperCase()}`, `HOSTINFO_${key.toUpperCase()}`,
......
...@@ -9,7 +9,6 @@ export class OcgcoreWorkerOptions { ...@@ -9,7 +9,6 @@ export class OcgcoreWorkerOptions {
hostinfo: HostInfo; hostinfo: HostInfo;
@TransportType(() => [YGOProDeck]) @TransportType(() => [YGOProDeck])
decks: YGOProDeck[]; decks: YGOProDeck[];
isTag?: boolean; isTag: boolean;
playerNames?: string[]; registry: Record<string, string>;
registry?: Record<string, string>;
} }
...@@ -32,7 +32,7 @@ import { OcgcoreWorkerOptions } from './ocgcore-worker-options'; ...@@ -32,7 +32,7 @@ import { OcgcoreWorkerOptions } from './ocgcore-worker-options';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { calculateDuelOptions } from '../utility/calculate-duel-options'; import { calculateDuelOptions } from '../utility/calculate-duel-options';
import initSqlJs from 'sql.js'; import initSqlJs from 'sql.js';
import { YGOProMessages, OcgcoreCommonConstants } from 'ygopro-msg-encode'; import { YGOProMessages } from 'ygopro-msg-encode';
const { OcgcoreScriptConstants } = _OcgcoreConstants; const { OcgcoreScriptConstants } = _OcgcoreConstants;
...@@ -305,43 +305,17 @@ export class OcgcoreWorker { ...@@ -305,43 +305,17 @@ export class OcgcoreWorker {
return this.duel.queryFieldInfo({ noParse: true }); return this.duel.queryFieldInfo({ noParse: true });
} }
@WorkerMethod() async *advance() {
@TransportEncoder<OcgcoreProcessResult[], SerializableProcessResult[]>(
// serialize in worker: only send raw
(results) =>
results.map((result) => ({
length: result.length,
raw: result.raw,
status: result.status,
})),
// deserialize in main thread: re-parse from raw
(serializedArray) =>
serializedArray.map((serialized) => ({
length: serialized.length,
raw: serialized.raw,
status: serialized.status,
message:
serialized.raw.length > 0
? (() => {
try {
return YGOProMessages.getInstanceFromPayload(serialized.raw);
} catch {
return undefined;
}
})()
: undefined,
})),
)
async advance(): Promise<OcgcoreProcessResult[]> {
const results: OcgcoreProcessResult[] = [];
while (true) { while (true) {
const res = this.duel.process({ noParse: true }); const res = await this.process();
results.push(res); if (!res.raw.length) {
continue;
}
yield res;
if (res.status > 0) { if (res.status > 0) {
break; break;
} }
} }
return results;
} }
@WorkerMethod() @WorkerMethod()
......
import YGOProDeck from 'ygopro-deck-encode'; import YGOProDeck from 'ygopro-deck-encode';
import { YGOProYrp, ReplayHeader } from 'ygopro-yrp-encode'; import { YGOProYrp, ReplayHeader } from 'ygopro-yrp-encode';
import { Room } from './room'; import { Room } from './room';
import { YGOProMsgBase } from 'ygopro-msg-encode';
// Constants from ygopro // Constants from ygopro
const REPLAY_COMPRESSED = 0x1; const REPLAY_COMPRESSED = 0x1;
...@@ -17,6 +18,7 @@ export class DuelRecord { ...@@ -17,6 +18,7 @@ export class DuelRecord {
date = new Date(); date = new Date();
winPosition?: number; winPosition?: number;
responses: Buffer[] = []; responses: Buffer[] = [];
messages: YGOProMsgBase[] = [];
toYrp(room: Room) { toYrp(room: Room) {
const isTag = room.isTag; const isTag = room.isTag;
......
This diff is collapsed.
import { AppContext, ProtoMiddlewareDispatcher } from 'nfkit'; import { AppContext, ProtoMiddlewareDispatcher } from 'nfkit';
import { Client } from '../client/client'; import { Client } from '../client/client';
export class Emitter extends ProtoMiddlewareDispatcher<[Client]> { export class Emitter extends ProtoMiddlewareDispatcher<[client: Client]> {
constructor(private ctx: AppContext) { constructor(private ctx: AppContext) {
super({ super({
acceptResult: () => true, acceptResult: () => true,
......
import { _OcgcoreConstants } from 'koishipro-core.js';
const { OcgcoreScriptConstants } = _OcgcoreConstants;
export function splitRefreshLocations(location: number) {
const bits = [
OcgcoreScriptConstants.LOCATION_MZONE,
OcgcoreScriptConstants.LOCATION_SZONE,
OcgcoreScriptConstants.LOCATION_HAND,
OcgcoreScriptConstants.LOCATION_GRAVE,
OcgcoreScriptConstants.LOCATION_REMOVED,
OcgcoreScriptConstants.LOCATION_EXTRA,
OcgcoreScriptConstants.LOCATION_DECK,
OcgcoreScriptConstants.LOCATION_OVERLAY,
OcgcoreScriptConstants.LOCATION_FZONE,
OcgcoreScriptConstants.LOCATION_PZONE,
];
const locations = bits.filter((bit) => (location & bit) !== 0);
if (locations.length > 0) {
return locations;
}
return [location];
}
export function getZoneQueryFlag(location: number) {
if (location === OcgcoreScriptConstants.LOCATION_MZONE) {
return 0x881fff;
}
if (location === OcgcoreScriptConstants.LOCATION_SZONE) {
return 0xe81fff;
}
if (location === OcgcoreScriptConstants.LOCATION_HAND) {
return 0x681fff;
}
if (location === OcgcoreScriptConstants.LOCATION_GRAVE) {
return 0x081fff;
}
if (location === OcgcoreScriptConstants.LOCATION_EXTRA) {
return 0xe81fff;
}
return 0xf81fff;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment