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