Commit e9d1b91f authored by Chunchi Che's avatar Chunchi Che

Merge branch 'feat/waiting' into 'main'

Feat/waiting

See merge request mycard/Neos!145
parents 3bfe5d4e e273124f
neos-protobuf @ 3973685c
Subproject commit 9711eef553da455be0d01238dae7f026d8d5650e Subproject commit 3973685c657030b845ef385e8a0610971c8c60b9
...@@ -66,6 +66,9 @@ ...@@ -66,6 +66,9 @@
"avatarSize": 40, "avatarSize": 40,
"meAvatarColor": "#0e63e1", "meAvatarColor": "#0e63e1",
"opAvatarColor": "#e10e68" "opAvatarColor": "#e10e68"
},
"hint": {
"waitingDuration": 1.5
} }
} }
} }
...@@ -66,6 +66,9 @@ ...@@ -66,6 +66,9 @@
"avatarSize": 40, "avatarSize": 40,
"meAvatarColor": "#0e63e1", "meAvatarColor": "#0e63e1",
"opAvatarColor": "#e10e68" "opAvatarColor": "#e10e68"
},
"hint": {
"waitingDuration": 1.5
} }
} }
} }
...@@ -5444,7 +5444,10 @@ export namespace ygopro { ...@@ -5444,7 +5444,10 @@ export namespace ygopro {
} }
export class StocGameMessage extends pb_1.Message { export class StocGameMessage extends pb_1.Message {
#one_of_decls: number[][] = [ #one_of_decls: number[][] = [
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21,
],
]; ];
constructor( constructor(
data?: data?:
...@@ -5471,6 +5474,7 @@ export namespace ygopro { ...@@ -5471,6 +5474,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5493,6 +5497,7 @@ export namespace ygopro { ...@@ -5493,6 +5497,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5515,6 +5520,7 @@ export namespace ygopro { ...@@ -5515,6 +5520,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5537,6 +5543,7 @@ export namespace ygopro { ...@@ -5537,6 +5543,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5559,6 +5566,7 @@ export namespace ygopro { ...@@ -5559,6 +5566,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5581,6 +5589,7 @@ export namespace ygopro { ...@@ -5581,6 +5589,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5603,6 +5612,7 @@ export namespace ygopro { ...@@ -5603,6 +5612,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5625,6 +5635,7 @@ export namespace ygopro { ...@@ -5625,6 +5635,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5647,6 +5658,7 @@ export namespace ygopro { ...@@ -5647,6 +5658,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5669,6 +5681,7 @@ export namespace ygopro { ...@@ -5669,6 +5681,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5691,6 +5704,7 @@ export namespace ygopro { ...@@ -5691,6 +5704,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5713,6 +5727,7 @@ export namespace ygopro { ...@@ -5713,6 +5727,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5735,6 +5750,7 @@ export namespace ygopro { ...@@ -5735,6 +5750,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5757,6 +5773,7 @@ export namespace ygopro { ...@@ -5757,6 +5773,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5779,6 +5796,7 @@ export namespace ygopro { ...@@ -5779,6 +5796,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5801,6 +5819,7 @@ export namespace ygopro { ...@@ -5801,6 +5819,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5823,6 +5842,7 @@ export namespace ygopro { ...@@ -5823,6 +5842,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5845,6 +5865,7 @@ export namespace ygopro { ...@@ -5845,6 +5865,7 @@ export namespace ygopro {
select_yes_no?: StocGameMessage.MsgSelectYesNo; select_yes_no?: StocGameMessage.MsgSelectYesNo;
update_hp?: never; update_hp?: never;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5867,6 +5888,7 @@ export namespace ygopro { ...@@ -5867,6 +5888,7 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: StocGameMessage.MsgUpdateHp; update_hp?: StocGameMessage.MsgUpdateHp;
win?: never; win?: never;
wait?: never;
} }
| { | {
start?: never; start?: never;
...@@ -5889,6 +5911,30 @@ export namespace ygopro { ...@@ -5889,6 +5911,30 @@ export namespace ygopro {
select_yes_no?: never; select_yes_no?: never;
update_hp?: never; update_hp?: never;
win?: StocGameMessage.MsgWin; win?: StocGameMessage.MsgWin;
wait?: never;
}
| {
start?: never;
draw?: never;
new_turn?: never;
new_phase?: never;
hint?: never;
select_idle_cmd?: never;
select_place?: never;
move?: never;
select_card?: never;
select_chain?: never;
select_effect_yn?: never;
select_position?: never;
select_option?: never;
shuffle_hand?: never;
select_battle_cmd?: never;
pos_change?: never;
select_unselect_card?: never;
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: StocGameMessage.MsgWait;
} }
)) ))
) { ) {
...@@ -5968,6 +6014,9 @@ export namespace ygopro { ...@@ -5968,6 +6014,9 @@ export namespace ygopro {
if ("win" in data && data.win != undefined) { if ("win" in data && data.win != undefined) {
this.win = data.win; this.win = data.win;
} }
if ("wait" in data && data.wait != undefined) {
this.wait = data.wait;
}
} }
} }
get start() { get start() {
...@@ -6230,6 +6279,19 @@ export namespace ygopro { ...@@ -6230,6 +6279,19 @@ export namespace ygopro {
get has_win() { get has_win() {
return pb_1.Message.getField(this, 20) != null; return pb_1.Message.getField(this, 20) != null;
} }
get wait() {
return pb_1.Message.getWrapperField(
this,
StocGameMessage.MsgWait,
21
) as StocGameMessage.MsgWait;
}
set wait(value: StocGameMessage.MsgWait) {
pb_1.Message.setOneofWrapperField(this, 21, this.#one_of_decls[0], value);
}
get has_wait() {
return pb_1.Message.getField(this, 21) != null;
}
get gameMsg() { get gameMsg() {
const cases: { const cases: {
[index: number]: [index: number]:
...@@ -6253,7 +6315,8 @@ export namespace ygopro { ...@@ -6253,7 +6315,8 @@ export namespace ygopro {
| "select_unselect_card" | "select_unselect_card"
| "select_yes_no" | "select_yes_no"
| "update_hp" | "update_hp"
| "win"; | "win"
| "wait";
} = { } = {
0: "none", 0: "none",
1: "start", 1: "start",
...@@ -6276,13 +6339,14 @@ export namespace ygopro { ...@@ -6276,13 +6339,14 @@ export namespace ygopro {
18: "select_yes_no", 18: "select_yes_no",
19: "update_hp", 19: "update_hp",
20: "win", 20: "win",
21: "wait",
}; };
return cases[ return cases[
pb_1.Message.computeOneofCase( pb_1.Message.computeOneofCase(
this, this,
[ [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 20, 21,
] ]
) )
]; ];
...@@ -6338,6 +6402,7 @@ export namespace ygopro { ...@@ -6338,6 +6402,7 @@ export namespace ygopro {
typeof StocGameMessage.MsgUpdateHp.prototype.toObject typeof StocGameMessage.MsgUpdateHp.prototype.toObject
>; >;
win?: ReturnType<typeof StocGameMessage.MsgWin.prototype.toObject>; win?: ReturnType<typeof StocGameMessage.MsgWin.prototype.toObject>;
wait?: ReturnType<typeof StocGameMessage.MsgWait.prototype.toObject>;
}): StocGameMessage { }): StocGameMessage {
const message = new StocGameMessage({}); const message = new StocGameMessage({});
if (data.start != null) { if (data.start != null) {
...@@ -6428,6 +6493,9 @@ export namespace ygopro { ...@@ -6428,6 +6493,9 @@ export namespace ygopro {
if (data.win != null) { if (data.win != null) {
message.win = StocGameMessage.MsgWin.fromObject(data.win); message.win = StocGameMessage.MsgWin.fromObject(data.win);
} }
if (data.wait != null) {
message.wait = StocGameMessage.MsgWait.fromObject(data.wait);
}
return message; return message;
} }
toObject() { toObject() {
...@@ -6482,6 +6550,7 @@ export namespace ygopro { ...@@ -6482,6 +6550,7 @@ export namespace ygopro {
typeof StocGameMessage.MsgUpdateHp.prototype.toObject typeof StocGameMessage.MsgUpdateHp.prototype.toObject
>; >;
win?: ReturnType<typeof StocGameMessage.MsgWin.prototype.toObject>; win?: ReturnType<typeof StocGameMessage.MsgWin.prototype.toObject>;
wait?: ReturnType<typeof StocGameMessage.MsgWait.prototype.toObject>;
} = {}; } = {};
if (this.start != null) { if (this.start != null) {
data.start = this.start.toObject(); data.start = this.start.toObject();
...@@ -6543,6 +6612,9 @@ export namespace ygopro { ...@@ -6543,6 +6612,9 @@ export namespace ygopro {
if (this.win != null) { if (this.win != null) {
data.win = this.win.toObject(); data.win = this.win.toObject();
} }
if (this.wait != null) {
data.wait = this.wait.toObject();
}
return data; return data;
} }
serialize(): Uint8Array; serialize(): Uint8Array;
...@@ -6619,6 +6691,8 @@ export namespace ygopro { ...@@ -6619,6 +6691,8 @@ export namespace ygopro {
); );
if (this.has_win) if (this.has_win)
writer.writeMessage(20, this.win, () => this.win.serialize(writer)); writer.writeMessage(20, this.win, () => this.win.serialize(writer));
if (this.has_wait)
writer.writeMessage(21, this.wait, () => this.wait.serialize(writer));
if (!w) return writer.getResultBuffer(); if (!w) return writer.getResultBuffer();
} }
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): StocGameMessage { static deserialize(bytes: Uint8Array | pb_1.BinaryReader): StocGameMessage {
...@@ -6781,6 +6855,12 @@ export namespace ygopro { ...@@ -6781,6 +6855,12 @@ export namespace ygopro {
() => (message.win = StocGameMessage.MsgWin.deserialize(reader)) () => (message.win = StocGameMessage.MsgWin.deserialize(reader))
); );
break; break;
case 21:
reader.readMessage(
message.wait,
() => (message.wait = StocGameMessage.MsgWait.deserialize(reader))
);
break;
default: default:
reader.skipField(); reader.skipField();
} }
...@@ -11340,5 +11420,56 @@ export namespace ygopro { ...@@ -11340,5 +11420,56 @@ export namespace ygopro {
Defeated = 2, Defeated = 2,
} }
} }
export class MsgWait extends pb_1.Message {
#one_of_decls: number[][] = [];
constructor(data?: any[] | {}) {
super();
pb_1.Message.initialize(
this,
Array.isArray(data) ? data : [],
0,
-1,
[],
this.#one_of_decls
);
if (!Array.isArray(data) && typeof data == "object") {
}
}
static fromObject(data: {}): MsgWait {
const message = new MsgWait({});
return message;
}
toObject() {
const data: {} = {};
return data;
}
serialize(): Uint8Array;
serialize(w: pb_1.BinaryWriter): void;
serialize(w?: pb_1.BinaryWriter): Uint8Array | void {
const writer = w || new pb_1.BinaryWriter();
if (!w) return writer.getResultBuffer();
}
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): MsgWait {
const reader =
bytes instanceof pb_1.BinaryReader
? bytes
: new pb_1.BinaryReader(bytes),
message = new MsgWait();
while (reader.nextField()) {
if (reader.isEndGroup()) break;
switch (reader.getFieldNumber()) {
default:
reader.skipField();
}
}
return message;
}
serializeBinary(): Uint8Array {
return this.serialize();
}
static deserializeBinary(bytes: Uint8Array): MsgWait {
return MsgWait.deserialize(bytes);
}
}
} }
} }
...@@ -48,3 +48,4 @@ export const MSG_DAMAGE = 91; ...@@ -48,3 +48,4 @@ export const MSG_DAMAGE = 91;
export const MSG_RECOVER = 92; export const MSG_RECOVER = 92;
export const MSG_PAY_LP_COST = 100; export const MSG_PAY_LP_COST = 100;
export const MSG_WIN = 5; export const MSG_WIN = 5;
export const MSG_WAITING = 3;
...@@ -21,6 +21,7 @@ import MsgSelectPositionAdapter from "./selectPosition"; ...@@ -21,6 +21,7 @@ import MsgSelectPositionAdapter from "./selectPosition";
import MsgSelectOptionAdapter from "./selectOption"; import MsgSelectOptionAdapter from "./selectOption";
import MsgSelectBattleCmdAdapter from "./selectBattleCmd"; import MsgSelectBattleCmdAdapter from "./selectBattleCmd";
import MsgSelectUnselectCardAdapter from "./selectUnselectCard"; import MsgSelectUnselectCardAdapter from "./selectUnselectCard";
import MsgWaitAdapter from "./wait";
import MsgDamage from "./damage"; import MsgDamage from "./damage";
import MsgRecover from "./recover"; import MsgRecover from "./recover";
import MsgWin from "./win"; import MsgWin from "./win";
...@@ -142,6 +143,11 @@ export default class GameMsgAdapter implements StocAdapter { ...@@ -142,6 +143,11 @@ export default class GameMsgAdapter implements StocAdapter {
break; break;
} }
case GAME_MSG.MSG_WAITING: {
gameMsg.wait = MsgWaitAdapter(gameData);
break;
}
default: { default: {
console.log("Unhandled GameMessage function=", func); console.log("Unhandled GameMessage function=", func);
......
import { ygopro } from "../../../idl/ocgcore";
import MsgWait = ygopro.StocGameMessage.MsgWait;
/*
* Msg Wait
*
* @param - null
*
* @usage - 后端通知前端等待对手操作
* */
export default (_data: Uint8Array) => {
return new MsgWait({});
};
...@@ -142,6 +142,8 @@ export interface DuelState { ...@@ -142,6 +142,8 @@ export interface DuelState {
result?: MsgWin.ActionType; result?: MsgWin.ActionType;
waiting?: boolean;
// UI相关 // UI相关
modalState: ModalState; modalState: ModalState;
} }
...@@ -257,6 +259,11 @@ const duelSlice = createSlice({ ...@@ -257,6 +259,11 @@ const duelSlice = createSlice({
setResult: (state, action: PayloadAction<MsgWin.ActionType>) => { setResult: (state, action: PayloadAction<MsgWin.ActionType>) => {
state.result = action.payload; state.result = action.payload;
}, },
// 等待状态`Reducer`
setWaiting: (state, action: PayloadAction<boolean>) => {
state.waiting = action.payload;
},
}, },
extraReducers(builder) { extraReducers(builder) {
handsCase(builder); handsCase(builder);
...@@ -336,6 +343,7 @@ export const { ...@@ -336,6 +343,7 @@ export const {
clearAllIdleInteractivities, clearAllIdleInteractivities,
clearAllPlaceInteractivities, clearAllPlaceInteractivities,
setResult, setResult,
setWaiting,
} = duelSlice.actions; } = duelSlice.actions;
export const selectDuelHsStart = (state: RootState) => { export const selectDuelHsStart = (state: RootState) => {
return state.duel.meInitInfo != null; return state.duel.meInitInfo != null;
...@@ -343,4 +351,7 @@ export const selectDuelHsStart = (state: RootState) => { ...@@ -343,4 +351,7 @@ export const selectDuelHsStart = (state: RootState) => {
export const selectDuelResult = (state: RootState) => { export const selectDuelResult = (state: RootState) => {
return state.duel.result; return state.duel.result;
}; };
export const selectWaiting = (state: RootState) => {
return state.duel.waiting;
};
export default duelSlice.reducer; export default duelSlice.reducer;
...@@ -20,11 +20,30 @@ import onMsgSelectUnselectCard from "./selectUnselectCard"; ...@@ -20,11 +20,30 @@ import onMsgSelectUnselectCard from "./selectUnselectCard";
import onMsgSelectYesNo from "./selectYesNo"; import onMsgSelectYesNo from "./selectYesNo";
import onMsgUpdateHp from "./updateHp"; import onMsgUpdateHp from "./updateHp";
import onMsgWin from "./win"; import onMsgWin from "./win";
import onMsgWait from "./wait";
import { setWaiting } from "../../reducers/duel/mod";
const ActiveList = [
"select_idle_cmd",
"select_place",
"select_card",
"select_chain",
"select_effect_yn",
"select_position",
"select_option",
"select_battle_cmd",
"select_unselect_card",
"select_yes_no",
];
export default function handleGameMsg(pb: ygopro.YgoStocMsg) { export default function handleGameMsg(pb: ygopro.YgoStocMsg) {
const dispatch = store.dispatch; const dispatch = store.dispatch;
const msg = pb.stoc_game_msg; const msg = pb.stoc_game_msg;
if (ActiveList.includes(msg.gameMsg)) {
dispatch(setWaiting(false));
}
switch (msg.gameMsg) { switch (msg.gameMsg) {
case "start": { case "start": {
onMsgStart(msg.start, dispatch); onMsgStart(msg.start, dispatch);
...@@ -126,6 +145,11 @@ export default function handleGameMsg(pb: ygopro.YgoStocMsg) { ...@@ -126,6 +145,11 @@ export default function handleGameMsg(pb: ygopro.YgoStocMsg) {
break; break;
} }
case "wait": {
onMsgWait(msg.wait, dispatch);
break;
}
default: { default: {
break; break;
} }
......
...@@ -5,9 +5,7 @@ import { ...@@ -5,9 +5,7 @@ import {
addHandsIdleInteractivity, addHandsIdleInteractivity,
addMagicIdleInteractivities, addMagicIdleInteractivities,
addMonsterIdleInteractivities, addMonsterIdleInteractivities,
clearHandsIdleInteractivity, clearAllIdleInteractivities,
clearMagicIdleInteractivities,
clearMonsterIdleInteractivities,
setEnableEp, setEnableEp,
setEnableM2, setEnableM2,
} from "../../reducers/duel/mod"; } from "../../reducers/duel/mod";
...@@ -19,9 +17,7 @@ export default (selectBattleCmd: MsgSelectBattleCmd, dispatch: AppDispatch) => { ...@@ -19,9 +17,7 @@ export default (selectBattleCmd: MsgSelectBattleCmd, dispatch: AppDispatch) => {
const cmds = selectBattleCmd.battle_cmds; const cmds = selectBattleCmd.battle_cmds;
// 先清掉之前的互动性 // 先清掉之前的互动性
dispatch(clearHandsIdleInteractivity(player)); dispatch(clearAllIdleInteractivities(player));
dispatch(clearMonsterIdleInteractivities(player));
dispatch(clearMagicIdleInteractivities(player));
const dispatcher = ( const dispatcher = (
battleData: MsgSelectBattleCmd.BattleCmd.BattleData, battleData: MsgSelectBattleCmd.BattleCmd.BattleData,
......
import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import {
clearAllIdleInteractivities,
setWaiting,
} from "../../reducers/duel/mod";
import { AppDispatch } from "../../store";
export default (
_wait: ygopro.StocGameMessage.MsgWait,
dispatch: AppDispatch
) => {
dispatch(clearAllIdleInteractivities(0));
dispatch(clearAllIdleInteractivities(1));
dispatch(setWaiting(true));
};
...@@ -3,15 +3,17 @@ import { useAppSelector } from "../../hook"; ...@@ -3,15 +3,17 @@ import { useAppSelector } from "../../hook";
import { selectMeHint, selectOpHint } from "../../reducers/duel/hintSlice"; import { selectMeHint, selectOpHint } from "../../reducers/duel/hintSlice";
import { selectCurrentPhase } from "../../reducers/duel/phaseSlice"; import { selectCurrentPhase } from "../../reducers/duel/phaseSlice";
import { notification } from "antd"; import { notification } from "antd";
import { selectDuelResult } from "../../reducers/duel/mod"; import { selectDuelResult, selectWaiting } from "../../reducers/duel/mod";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { ygopro } from "../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import MsgWin = ygopro.StocGameMessage.MsgWin; import MsgWin = ygopro.StocGameMessage.MsgWin;
import NeosConfig from "../../../neos.config.json";
const HintNotification = () => { const HintNotification = () => {
const meHint = useAppSelector(selectMeHint); const meHint = useAppSelector(selectMeHint);
const opHint = useAppSelector(selectOpHint); const opHint = useAppSelector(selectOpHint);
const currentPhase = useAppSelector(selectCurrentPhase); const currentPhase = useAppSelector(selectCurrentPhase);
const waiting = useAppSelector(selectWaiting);
const result = useAppSelector(selectDuelResult); const result = useAppSelector(selectDuelResult);
const navigate = useNavigate(); const navigate = useNavigate();
...@@ -43,6 +45,16 @@ const HintNotification = () => { ...@@ -43,6 +45,16 @@ const HintNotification = () => {
} }
}, [currentPhase]); }, [currentPhase]);
useEffect(() => {
if (waiting) {
api.info({
message: "...等待对方行动中...",
placement: "top",
duration: NeosConfig.ui.hint.waitingDuration,
});
}
}, [waiting]);
useEffect(() => { useEffect(() => {
if (result) { if (result) {
const message = const message =
......
...@@ -9,6 +9,7 @@ import { ...@@ -9,6 +9,7 @@ import {
selectOpInitInfo, selectOpInitInfo,
} from "../../reducers/duel/initInfoSlice"; } from "../../reducers/duel/initInfoSlice";
import { selectCurrentPlayerIsMe } from "../../reducers/duel/turnSlice"; import { selectCurrentPlayerIsMe } from "../../reducers/duel/turnSlice";
import { selectWaiting } from "../../reducers/duel/mod";
const Config = NeosConfig.ui.status; const Config = NeosConfig.ui.status;
const avatarSize = 40; const avatarSize = 40;
...@@ -18,13 +19,13 @@ const OP_VALUE = "opponent"; ...@@ -18,13 +19,13 @@ const OP_VALUE = "opponent";
const PlayerStatus = () => { const PlayerStatus = () => {
const meInfo = useAppSelector(selectMeInitInfo); const meInfo = useAppSelector(selectMeInitInfo);
const opInfo = useAppSelector(selectOpInitInfo); const opInfo = useAppSelector(selectOpInitInfo);
const myTurn = useAppSelector(selectCurrentPlayerIsMe); const waiting = useAppSelector(selectWaiting) || false;
return ( return (
<CheckCard.Group <CheckCard.Group
bordered bordered
style={{ height: `${NeosConfig.ui.layout.header.height}` }} style={{ height: `${NeosConfig.ui.layout.header.height}` }}
value={myTurn ? ME_VALUE : OP_VALUE} value={waiting ? OP_VALUE : ME_VALUE}
> >
<CheckCard <CheckCard
avatar={ avatar={
......
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