Commit 91b5fbdc authored by timel's avatar timel

refactor: merge playStore to matStore

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