Commit 91b5fbdc authored by timel's avatar timel

refactor: merge playStore to matStore

parent 23c357fa
import { ygopro } from "@/api";
import { playerStore } from "@/stores";
import { matStore } from "@/stores";
// FIXME: player0 不一定是当前玩家
export default function handleDeckCount(pb: ygopro.YgoStocMsg) {
const deckCount = pb.stoc_deck_count;
playerStore.player0.deckInfo = {
matStore.player[0].deckInfo = {
mainCnt: deckCount.meMain,
extraCnt: deckCount.meExtra,
sideCnt: deckCount.meSide,
};
playerStore.player1.deckInfo = {
matStore.player[1].deckInfo = {
mainCnt: deckCount.opMain,
extraCnt: deckCount.opExtra,
sideCnt: deckCount.opSide,
......
import { ygopro } from "@/api";
import { playerStore } from "@/stores";
import { matStore } from "@/stores";
const READY_STATE = "ready";
const NO_READY_STATE = "not ready";
......@@ -29,24 +29,22 @@ export default function handleHsPlayerChange(pb: ygopro.YgoStocMsg) {
break;
}
case ygopro.StocHsPlayerChange.State.READY: {
playerStore[change.pos == 0 ? "player0" : "player1"].state =
READY_STATE;
matStore.player[change.pos === 0 ? 0 : 1].state = READY_STATE;
break;
}
case ygopro.StocHsPlayerChange.State.NO_READY: {
playerStore[change.pos == 0 ? "player0" : "player1"].state =
NO_READY_STATE;
matStore.player[change.pos === 0 ? 0 : 1].state = NO_READY_STATE;
break;
}
case ygopro.StocHsPlayerChange.State.LEAVE: {
playerStore[change.pos == 0 ? "player0" : "player1"] = {};
matStore.player[change.pos === 0 ? 0 : 1] = {};
break;
}
case ygopro.StocHsPlayerChange.State.TO_OBSERVER: {
playerStore[change.pos == 0 ? "player0" : "player1"] = {}; // todo: 有没有必要?
playerStore.observerCount += 1;
matStore.player[change.pos === 0 ? 0 : 1] = {}; // todo: 有没有必要?
matStore.observerCount += 1;
break;
}
default: {
......
import { ygopro } from "@/api";
import { playerStore } from "@/stores";
import { matStore } from "@/stores";
export default function handleHsPlayerEnter(pb: ygopro.YgoStocMsg) {
const name = pb.stoc_hs_player_enter.name;
......@@ -8,6 +8,6 @@ export default function handleHsPlayerEnter(pb: ygopro.YgoStocMsg) {
if (pos > 1) {
console.log("Currently only supported 2v2 mode.");
} else {
playerStore[pos == 0 ? "player0" : "player1"].name = name;
matStore.player[pos === 0 ? 0 : 1].name = name;
}
}
import { ygopro } from "@/api";
import { playerStore } from "@/stores";
import { matStore } from "@/stores";
export default function handleHsWatchChange(pb: ygopro.YgoStocMsg) {
const count = pb.stoc_hs_watch_change.count;
playerStore.observerCount = count;
matStore.observerCount = count;
}
import { ygopro } from "@/api";
import { playerStore } from "@/stores";
import { matStore } from "@/stores";
const NO_READY_STATE = "not ready";
......@@ -7,21 +7,21 @@ export default function handleTypeChange(pb: ygopro.YgoStocMsg) {
const selfType = pb.stoc_type_change.self_type;
const assertHost = pb.stoc_type_change.is_host;
playerStore.isHost = assertHost;
playerStore.selfType = selfType;
matStore.isHost = assertHost;
matStore.selfType = selfType;
if (assertHost) {
switch (selfType) {
case ygopro.StocTypeChange.SelfType.PLAYER1: {
playerStore.player0.isHost = true;
playerStore.player1.isHost = false;
playerStore.player0.state = NO_READY_STATE;
matStore.player[0].isHost = true;
matStore.player[1].isHost = false;
matStore.player[0].state = NO_READY_STATE;
break;
}
case ygopro.StocTypeChange.SelfType.PLAYER2: {
playerStore.player0.isHost = false;
playerStore.player1.isHost = true;
playerStore.player1.state = NO_READY_STATE;
matStore.player[0].isHost = false;
matStore.player[1].isHost = true;
matStore.player[1].state = NO_READY_STATE;
break;
}
default: {
......
......@@ -6,7 +6,6 @@ export * from "./messageStore";
export * from "./methods";
export * from "./moraStore";
export * from "./placeStore";
export * from "./playerStore";
import { proxy } from "valtio";
import { devtools } from "valtio/utils";
......@@ -18,10 +17,8 @@ import { matStore } from "./matStore";
import { messageStore } from "./messageStore";
import { moraStore } from "./moraStore";
import { placeStore } from "./placeStore";
import { playerStore } from "./playerStore";
export const store = proxy({
playerStore,
chatStore,
joinStore,
moraStore,
......
......@@ -5,6 +5,8 @@ import { ygopro } from "@/api";
import type { InitInfo, MatState } from "./types";
import SelfType = ygopro.StocTypeChange.SelfType;
/**
* 根据controller判断是自己还是对方。
* 这个无需export,尽量逻辑收拢在store内部。
......@@ -14,7 +16,6 @@ const getWhom = (controller: number): "me" | "op" =>
/**
* 根据自己的先后手判断是否是自己
* 原本名字叫judgeSelf
*/
export const isMe = (controller: number): boolean => {
switch (matStore.selfType) {
......@@ -83,6 +84,23 @@ export const matStore: MatState = proxy<MatState>({
result: ygopro.StocGameMessage.MsgWin.ActionType.UNKNOWN,
waiting: false,
unimplemented: 0,
// 从playerStore搬过来的
player: {
0: {},
1: {},
me: () =>
matStore.selfType === SelfType.PLAYER1
? matStore.player[0]
: matStore.player[1],
op: () =>
matStore.selfType === SelfType.PLAYER1
? matStore.player[1]
: matStore.player[0],
},
observerCount: 0,
isHost: false,
// methods
isMe,
});
......
import type { ygopro } from "@/api";
// >>> play mat state >>>
export interface BothSide<T> {
me: T;
op: T;
......@@ -10,7 +8,9 @@ export interface BothSide<T> {
}
export interface MatState {
selfType: number;
selfType:
| ygopro.StocTypeChange.SelfType
| ygopro.StocGameMessage.MsgStart.PlayerType; // 为了适配`start.ts`的`PlayerType`
initInfo: BothSide<InitInfo> & {
set: (controller: number, obj: Partial<InitInfo>) => void;
......@@ -34,6 +34,16 @@ export interface MatState {
unimplemented: number; // 未处理的`Message`
player: {
0: Player;
1: Player;
me: () => Player;
op: () => Player;
};
observerCount: number;
isHost: boolean;
/** 根据自己的先后手判断是否是自己 */
isMe: (player: number) => boolean;
}
......@@ -91,4 +101,16 @@ export interface PhaseState {
enableM2: boolean; // 允许进入M2阶段
enableEp: boolean; // 允许回合结束
}
// <<< play mat state <<<
export interface Player {
name?: string;
state?: string;
isHost?: boolean;
deckInfo?: deckInfo;
}
export interface deckInfo {
mainCnt: number;
extraCnt: number;
sideCnt: number;
}
/* eslint valtio/avoid-this-in-proxy: 0 */
import { proxy } from "valtio";
import { ygopro } from "@/api";
import SelfType = ygopro.StocTypeChange.SelfType;
export interface Player {
name?: string;
state?: string;
isHost?: boolean;
deckInfo?: deckInfo;
}
export interface deckInfo {
mainCnt: number;
extraCnt: number;
sideCnt: number;
}
export interface PlayerState {
player0: Player;
player1: Player;
observerCount: number;
isHost: boolean;
selfType: SelfType;
getMePlayer: () => Player;
getOpPlayer: () => Player;
}
export const playerStore = proxy<PlayerState>({
player0: {},
player1: {},
observerCount: 0,
isHost: false,
selfType: SelfType.UNKNOWN,
getMePlayer() {
if (this.selfType == SelfType.PLAYER1) return this.player0;
return this.player1;
},
getOpPlayer() {
if (this.selfType == SelfType.PLAYER1) return this.player1;
return this.player0;
},
});
......@@ -3,20 +3,16 @@ import "./index.scss";
import React from "react";
import { useSnapshot } from "valtio";
import { matStore, playerStore } from "@/stores";
import { matStore } from "@/stores";
export const LifeBar: React.FC = () => {
const snap = useSnapshot(matStore.initInfo);
const snapPlayer = useSnapshot(playerStore);
const snapPlayer = useSnapshot(matStore.player);
return (
<div id="life-bar-container">
<div id="life-bar">{`${snapPlayer.getMePlayer().name}: ${
snap.me.life
}`}</div>
<div id="life-bar">{`${snapPlayer.getOpPlayer().name}: ${
snap.op.life
}`}</div>
<div id="life-bar">{`${snapPlayer.me().name}: ${snap.me.life}`}</div>
<div id="life-bar">{`${snapPlayer.op().name}: ${snap.op.life}`}</div>
</div>
);
};
......@@ -91,9 +91,9 @@ const WaitRoom = () => {
const joined = snap.joinStore.value;
const chat = snap.chatStore.message;
const isHost = snap.playerStore.isHost;
const player0 = snap.playerStore.player0;
const player1 = snap.playerStore.player1;
const isHost = snap.matStore.isHost;
const player0 = snap.matStore.player[0];
const player1 = snap.matStore.player[1];
const duelStart = snap.moraStore.duelStart;
// FIXME: 这些数据应该从`store`中获取
......
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