Commit 124c86b4 authored by Chunchi Che's avatar Chunchi Che

fix room logic

parent 08db0ada
Pipeline #23005 passed with stages
in 14 minutes and 19 seconds
...@@ -15,27 +15,30 @@ export default function handleHsPlayerChange(pb: ygopro.YgoStocMsg) { ...@@ -15,27 +15,30 @@ export default function handleHsPlayerChange(pb: ygopro.YgoStocMsg) {
} }
case ygopro.StocHsPlayerChange.State.MOVE: { case ygopro.StocHsPlayerChange.State.MOVE: {
// TODO: 这个分支可能有BUG,后面注意一下 // TODO: 这个分支可能有BUG,后面注意一下
console.log("Player " + change.pos + " moved to " + change.moved_pos); console.info(
"<HsPlayerChange>Player " +
const player = roomStore.players.splice(change.pos, 1); change.pos +
const insertIndex = " moved to " +
change.pos > change.moved_pos change.moved_pos
? change.moved_pos );
: change.moved_pos - 1; roomStore.players[change.moved_pos] = roomStore.players[change.pos];
roomStore.players.splice(insertIndex, 0, ...player); roomStore.players[change.pos] = undefined;
break; break;
} }
case ygopro.StocHsPlayerChange.State.READY: case ygopro.StocHsPlayerChange.State.READY:
case ygopro.StocHsPlayerChange.State.NO_READY: case ygopro.StocHsPlayerChange.State.NO_READY: {
const player = roomStore.players[change.pos];
if (player) {
player.state = change.state;
}
break;
}
case ygopro.StocHsPlayerChange.State.LEAVE: { case ygopro.StocHsPlayerChange.State.LEAVE: {
// 因为某种原因,当state为`LEAVE`的时候不能把它从`players`中去掉, roomStore.players[change.pos] = undefined;
// 只能修改状态然后UI上做特化处理
roomStore.players[change.pos].state = change.state;
break; break;
} }
case ygopro.StocHsPlayerChange.State.TO_OBSERVER: { case ygopro.StocHsPlayerChange.State.TO_OBSERVER: {
roomStore.players.splice(change.pos, 1); roomStore.players[change.pos] = undefined;
roomStore.observerCount += 1; roomStore.observerCount += 1;
break; break;
} }
......
...@@ -5,14 +5,14 @@ export default function handleHsPlayerEnter(pb: ygopro.YgoStocMsg) { ...@@ -5,14 +5,14 @@ export default function handleHsPlayerEnter(pb: ygopro.YgoStocMsg) {
const name = pb.stoc_hs_player_enter.name; const name = pb.stoc_hs_player_enter.name;
const pos = pb.stoc_hs_player_enter.pos; const pos = pb.stoc_hs_player_enter.pos;
if (pos > 1) { const player = roomStore.players[pos];
console.log("Currently only supported 2v2 mode.");
} else if (pos < roomStore.players.length) { if (player) {
roomStore.players[pos].name = name; player.name = name;
} else { } else {
roomStore.players.push({ roomStore.players[pos] = {
name, name,
state: ygopro.StocHsPlayerChange.State.NO_READY, state: ygopro.StocHsPlayerChange.State.NO_READY,
}); };
} }
} }
...@@ -9,25 +9,29 @@ export default function handleTypeChange(pb: ygopro.YgoStocMsg) { ...@@ -9,25 +9,29 @@ export default function handleTypeChange(pb: ygopro.YgoStocMsg) {
roomStore.isHost = assertHost; roomStore.isHost = assertHost;
roomStore.selfType = selfType; roomStore.selfType = selfType;
if (assertHost) { switch (selfType) {
switch (selfType) { case SelfType.UNKNOWN: {
case SelfType.UNKNOWN: { console.warn("<HandleTypeChange>selfType is UNKNOWN");
console.warn("<HandleTypeChange>selfType is UNKNOWN"); break;
break; }
} case SelfType.OBSERVER: {
case SelfType.OBSERVER: { roomStore.players.forEach((player) => {
break;
}
default: {
const player = roomStore.players[selfType - 1];
const state = ygopro.StocHsPlayerChange.State.NO_READY;
if (player) { if (player) {
player.state = state; player.isMe = false;
} else {
roomStore.players.push({ name: "?", state });
} }
break; });
break;
}
default: {
const player = roomStore.players[selfType - 1];
const state = ygopro.StocHsPlayerChange.State.NO_READY;
if (player) {
player.state = state;
player.isMe = true;
} else {
roomStore.players[selfType - 1] = { name: "?", state, isMe: true };
} }
break;
} }
} }
} }
...@@ -11,6 +11,7 @@ export interface Player { ...@@ -11,6 +11,7 @@ export interface Player {
name: string; // 玩家的昵称 name: string; // 玩家的昵称
state: StocHsPlayerChange.State; // 玩家当前状态 state: StocHsPlayerChange.State; // 玩家当前状态
moraResult?: HandType; // 玩家的猜拳结果 moraResult?: HandType; // 玩家的猜拳结果
isMe?: boolean;
deckInfo?: DeckInfo; deckInfo?: DeckInfo;
} }
...@@ -34,7 +35,9 @@ export enum RoomStage { ...@@ -34,7 +35,9 @@ export enum RoomStage {
class RoomStore implements NeosStore { class RoomStore implements NeosStore {
joined: boolean = false; // 是否已经加入房间 joined: boolean = false; // 是否已经加入房间
players: Player[] = []; // 进入房间的玩家列表 players: (Player | undefined)[] = Array.from({ length: 4 }).map(
(_) => undefined
); // 进入房间的玩家列表
observerCount: number = 0; // 观战者数量 observerCount: number = 0; // 观战者数量
isHost: boolean = false; // 当前玩家是否是房主 isHost: boolean = false; // 当前玩家是否是房主
selfType: SelfType = 0; // 当前玩家的类型 selfType: SelfType = 0; // 当前玩家的类型
...@@ -42,12 +45,10 @@ class RoomStore implements NeosStore { ...@@ -42,12 +45,10 @@ class RoomStore implements NeosStore {
stage: RoomStage = RoomStage.WAITING; stage: RoomStage = RoomStage.WAITING;
getMePlayer() { getMePlayer() {
if (this.selfType == SelfType.PLAYER1) return this.players.at(0); return this.players.find((player) => player?.isMe);
return this.players.at(1);
} }
getOpPlayer() { getOpPlayer() {
if (this.selfType == SelfType.PLAYER1) return this.players.at(1); return this.players.find((player) => player !== undefined && !player.isMe);
return this.players.at(0);
} }
reset(): void { reset(): void {
......
...@@ -25,7 +25,7 @@ export const Chat: React.FC = () => { ...@@ -25,7 +25,7 @@ export const Chat: React.FC = () => {
const sender = chatStore.sender; const sender = chatStore.sender;
const name = const name =
sender < roomStore.players.length sender < roomStore.players.length
? roomStore.players[sender].name ? roomStore.players[sender]?.name ?? "?"
: (sender > 8 && sender < 11) || sender > 19 : (sender > 8 && sender < 11) || sender > 19
? "?" ? "?"
: "System"; : "System";
......
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