Commit 26f482d5 authored by nanahira's avatar nanahira

fix reconnect refresh field

parent 74eade31
Pipeline #43405 passed with stages
in 3 minutes and 3 seconds
import { import {
NetPlayerType, NetPlayerType,
OcgcoreCommonConstants,
OcgcoreScriptConstants, OcgcoreScriptConstants,
YGOProMsgDeckTop,
YGOProMsgHint, YGOProMsgHint,
YGOProMsgNewPhase, YGOProMsgNewPhase,
YGOProMsgNewTurn, YGOProMsgNewTurn,
YGOProMsgReverseDeck,
YGOProMsgWaiting, YGOProMsgWaiting,
YGOProStocGameMsg, YGOProStocGameMsg,
} from 'ygopro-msg-encode'; } from 'ygopro-msg-encode';
import { Context } from '../../app'; import { Context } from '../../app';
import { Client } from '../../client'; import { Client } from '../../client';
import { DuelStage, Room } from '../../room'; import { DuelStage, OnRoomDuelStart, Room, RoomManager } from '../../room';
declare module '../../room/' {
interface Room {
deckReversed?: boolean;
}
}
export class RefreshFieldService { export class RefreshFieldService {
constructor(private ctx: Context) {} constructor(private ctx: Context) {}
async init() {
this.ctx
.middleware(OnRoomDuelStart, async (event, client, next) => {
const room = event.room;
room.deckReversed = false;
return next();
})
.middleware(YGOProMsgReverseDeck, async (event, client, next) => {
const room = this.ctx
.get(() => RoomManager)
.findByName(client.roomName);
if (room) {
room.deckReversed = !room.deckReversed;
}
return next();
});
}
async sendReconnectDuelingMessages(client: Client, room: Room) { async sendReconnectDuelingMessages(client: Client, room: Room) {
this.assertRefreshAllowed(client, room); this.assertRefreshAllowed(client, room);
await this.sendNewTurnMessages(client, room); await this.sendNewTurnMessages(client, room);
...@@ -36,9 +63,48 @@ export class RefreshFieldService { ...@@ -36,9 +63,48 @@ export class RefreshFieldService {
await client.send(await this.requestField(room)); await client.send(await this.requestField(room));
await this.sendRefreshMessages(client, room); await this.sendRefreshMessages(client, room);
const needResendRequest = this.isReconnectingPlayerOperating(client, room); if (room.deckReversed) {
await client.send(
new YGOProStocGameMsg().fromPartial({
msg: new YGOProMsgReverseDeck(),
}),
);
}
for (let igp = 0; igp < 2; ++igp) {
const deckQuery = await room.ocgcore.queryFieldCard({
player: igp,
location: OcgcoreScriptConstants.LOCATION_DECK,
queryFlag:
OcgcoreCommonConstants.QUERY_CODE |
OcgcoreCommonConstants.QUERY_POSITION,
useCache: 0,
});
const lastCard = deckQuery.cards[deckQuery.cards.length - 1];
if (lastCard) {
let code = lastCard.code;
const isFaceUp =
(lastCard.position & OcgcoreCommonConstants.POS_FACEUP) !== 0;
if (isFaceUp) {
code |= 0x80000000;
}
if (room.deckReversed || isFaceUp) {
await client.send(
new YGOProStocGameMsg().fromPartial({
msg: new YGOProMsgDeckTop().fromPartial({
player: igp,
sequence: 0,
code,
}),
}),
);
}
}
}
await room.sendTimeLimit(1 - room.getDuelPos(client), client);
if (needResendRequest) { if (client === room.responsePlayer) {
const lastHint = this.findLastHintForClient(client, room); const lastHint = this.findLastHintForClient(client, room);
if (lastHint) { if (lastHint) {
await client.send( await client.send(
...@@ -58,14 +124,14 @@ export class RefreshFieldService { ...@@ -58,14 +124,14 @@ export class RefreshFieldService {
); );
await room.setResponseTimer(room.getDuelPos(client)); await room.setResponseTimer(room.getDuelPos(client));
} }
return; } else {
await client.send(
new YGOProStocGameMsg().fromPartial({
msg: new YGOProMsgWaiting(),
}),
);
await room.sendTimeLimit(room.getDuelPos(client), client);
} }
await client.send(
new YGOProStocGameMsg().fromPartial({
msg: new YGOProMsgWaiting(),
}),
);
} }
private assertRefreshAllowed(client: Client, room: Room) { private assertRefreshAllowed(client: Client, room: Room) {
...@@ -142,12 +208,6 @@ export class RefreshFieldService { ...@@ -142,12 +208,6 @@ export class RefreshFieldService {
} }
} }
private isReconnectingPlayerOperating(client: Client, room: Room): boolean {
const ingameDuelPos = room.getIngameDuelPos(client);
const operatingPlayer = room.getIngameOperatingPlayer(ingameDuelPos);
return operatingPlayer === client;
}
private findLastHintForClient( private findLastHintForClient(
client: Client, client: Client,
room: Room, room: Room,
......
...@@ -1226,7 +1226,7 @@ export class Room { ...@@ -1226,7 +1226,7 @@ export class Room {
this.timerState.backedMs[originalDuelPos] -= 1000; this.timerState.backedMs[originalDuelPos] -= 1000;
} }
private async sendTimeLimit(originalDuelPos: number) { async sendTimeLimit(originalDuelPos: number, toSpecficClient?: Client) {
if (!this.hasTimeLimit || ![0, 1].includes(originalDuelPos)) { if (!this.hasTimeLimit || ![0, 1].includes(originalDuelPos)) {
return; return;
} }
...@@ -1236,7 +1236,11 @@ export class Room { ...@@ -1236,7 +1236,11 @@ export class Room {
player: ingameDuelPos, player: ingameDuelPos,
left_time: Math.ceil(leftTime / 1000), left_time: Math.ceil(leftTime / 1000),
}); });
await Promise.all(this.playingPlayers.map((p) => p.send(msg))); await Promise.all(
this.playingPlayers
.filter((p) => !toSpecficClient || p === toSpecficClient)
.map((p) => p.send(msg)),
);
} }
private async onResponseTimeout(originalDuelPos: number) { private async onResponseTimeout(originalDuelPos: number) {
......
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