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