Commit 2270870b authored by nanahira's avatar nanahira

abstract check deck

parent 61a9cc22
import { Context } from '../app';
import { checkDeck } from '../utility/check-deck';
import { RoomCheckDeck } from './room-event/room-check-deck';
export class DefaultDeckChecker {
constructor(private ctx: Context) {
ctx.middleware(RoomCheckDeck, (msg, client, next) => {
const { room, deck, cardReader } = msg;
if (room.hostinfo.no_check_deck) {
return next();
}
const deckError = checkDeck(deck, cardReader, {
ot: room.hostinfo.rule,
lflist: room.lflist,
minMain: this.ctx.config.getInt('DECK_MAIN_MIN'),
maxMain: this.ctx.config.getInt('DECK_MAIN_MAX'),
maxExtra: this.ctx.config.getInt('DECK_EXTRA_MAX'),
maxSide: this.ctx.config.getInt('DECK_SIDE_MAX'),
maxCopies: this.ctx.config.getInt('DECK_MAX_COPIES'),
});
if (deckError) {
return msg.use(deckError);
}
return next();
});
}
}
import YGOProDeck from 'ygopro-deck-encode';
import { Client } from '../../client';
import { ValueContainer } from '../../utility/value-container';
import { Room } from '../room';
import { YGOProLFListError } from 'ygopro-lflist-encode';
import { CardReaderFinalized } from 'koishipro-core.js';
export class RoomCheckDeck extends ValueContainer<
YGOProLFListError | undefined
> {
constructor(
public room: Room,
public client: Client,
public deck: YGOProDeck,
public cardReader: CardReaderFinalized,
) {
super(undefined);
}
}
......@@ -5,10 +5,12 @@ import { DefaultHostInfoProvider } from './default-hostinfo-provder';
import { RoomEventRegister } from './room-event-register';
import { RoomManager } from './room-manager';
import { TagSurrenderConfirmMiddleware } from './tag-surrender-confirm-middleware';
import { DefaultDeckChecker } from './default-deck-checker';
export const RoomModule = createAppContext<ContextState>()
.provide(DefaultHostInfoProvider)
.provide(YGOProResourceLoader)
.provide(RoomManager)
.provide(TagSurrenderConfirmMiddleware)
.provide(DefaultDeckChecker)
.provide(RoomEventRegister);
......@@ -105,6 +105,7 @@ import { OnRoomSidingStart } from './room-event/on-room-siding-start';
import { OnRoomSidingReady } from './room-event/on-room-siding-ready';
import { OnRoomFinger } from './room-event/on-room-finger';
import { OnRoomSelectTp } from './room-event/on-room-select-tp';
import { RoomCheckDeck } from './room-event/room-check-deck';
const { OcgcoreScriptConstants } = _OcgcoreConstants;
......@@ -156,7 +157,7 @@ export class Room {
return this._cardReader;
});
}
private lflist = blankLFList;
lflist = blankLFList;
private async findLFList() {
const isTCG = this.hostinfo.rule === 1 && this.hostinfo.lflist === 0;
......@@ -809,38 +810,25 @@ export class Room {
// Check deck based on stage
if (this.duelStage === DuelStage.Begin) {
// Begin stage: check deck validity (lflist, etc.) if no_check_deck is false
if (!this.hostinfo.no_check_deck) {
const deckError = checkDeck(deck, cardReader, {
ot: this.hostinfo.rule,
lflist: this.lflist,
minMain: this.ctx.config.getInt('DECK_MAIN_MIN'),
maxMain: this.ctx.config.getInt('DECK_MAIN_MAX'),
maxExtra: this.ctx.config.getInt('DECK_EXTRA_MAX'),
maxSide: this.ctx.config.getInt('DECK_SIDE_MAX'),
maxCopies: this.ctx.config.getInt('DECK_MAX_COPIES'),
});
this.logger.debug(
{
deckError,
name: client.name,
deckErrorPayload: deckError?.toPayload(),
},
'Deck check result',
const sendDeckError = async (deckErrorCode: number) => {
// 先发送 PlayerChange NotReady 给自己 (client.deck 未设置,自动为 NOTREADY)
await client.send(client.prepareChangePacket());
// 然后发送错误消息给自己
await client.send(
new YGOProStocErrorMsg().fromPartial({
msg: ErrorMessageType.DECKERROR,
code: deckErrorCode,
}),
);
return;
};
if (deckError) {
// 先发送 PlayerChange NotReady 给自己 (client.deck 未设置,自动为 NOTREADY)
await client.send(client.prepareChangePacket());
// 然后发送错误消息给自己
await client.send(
new YGOProStocErrorMsg().fromPartial({
msg: ErrorMessageType.DECKERROR,
code: deckError.toPayload(),
}),
);
return;
}
const deckErrorContainer = await this.ctx.dispatch(
new RoomCheckDeck(this, client, deck, cardReader),
client,
);
if (deckErrorContainer?.value) {
return sendDeckError(deckErrorContainer.value.toPayload());
}
} else if (this.duelStage === DuelStage.Siding) {
// Siding stage: ALWAYS check if cards match original deck (无条件检查)
......@@ -871,7 +859,7 @@ export class Room {
this.allPlayers.forEach((p) => p.send(changeMsg));
if (this.noHost) {
let allReadyAndFull = true;
for (let i = 0; i < this.players.length; i++) {
for (let i = 0; i < this.players.length; i++) {
const p = this.players[i];
if (!p || !p.deck) {
allReadyAndFull = false;
......
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