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 @@
"avatarSize": 40,
"meAvatarColor": "#0e63e1",
"opAvatarColor": "#e10e68"
},
"hint": {
"waitingDuration": 1.5
}
}
}
......@@ -66,6 +66,9 @@
"avatarSize": 40,
"meAvatarColor": "#0e63e1",
"opAvatarColor": "#e10e68"
},
"hint": {
"waitingDuration": 1.5
}
}
}
......@@ -5444,7 +5444,10 @@ export namespace ygopro {
}
export class StocGameMessage extends pb_1.Message {
#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(
data?:
......@@ -5471,6 +5474,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5493,6 +5497,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5515,6 +5520,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5537,6 +5543,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5559,6 +5566,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5581,6 +5589,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5603,6 +5612,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5625,6 +5635,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5647,6 +5658,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5669,6 +5681,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5691,6 +5704,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5713,6 +5727,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5735,6 +5750,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5757,6 +5773,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5779,6 +5796,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5801,6 +5819,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5823,6 +5842,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5845,6 +5865,7 @@ export namespace ygopro {
select_yes_no?: StocGameMessage.MsgSelectYesNo;
update_hp?: never;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5867,6 +5888,7 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: StocGameMessage.MsgUpdateHp;
win?: never;
wait?: never;
}
| {
start?: never;
......@@ -5889,6 +5911,30 @@ export namespace ygopro {
select_yes_no?: never;
update_hp?: never;
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 {
if ("win" in data && data.win != undefined) {
this.win = data.win;
}
if ("wait" in data && data.wait != undefined) {
this.wait = data.wait;
}
}
}
get start() {
......@@ -6230,6 +6279,19 @@ export namespace ygopro {
get has_win() {
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() {
const cases: {
[index: number]:
......@@ -6253,7 +6315,8 @@ export namespace ygopro {
| "select_unselect_card"
| "select_yes_no"
| "update_hp"
| "win";
| "win"
| "wait";
} = {
0: "none",
1: "start",
......@@ -6276,13 +6339,14 @@ export namespace ygopro {
18: "select_yes_no",
19: "update_hp",
20: "win",
21: "wait",
};
return cases[
pb_1.Message.computeOneofCase(
this,
[
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 {
typeof StocGameMessage.MsgUpdateHp.prototype.toObject
>;
win?: ReturnType<typeof StocGameMessage.MsgWin.prototype.toObject>;
wait?: ReturnType<typeof StocGameMessage.MsgWait.prototype.toObject>;
}): StocGameMessage {
const message = new StocGameMessage({});
if (data.start != null) {
......@@ -6428,6 +6493,9 @@ export namespace ygopro {
if (data.win != null) {
message.win = StocGameMessage.MsgWin.fromObject(data.win);
}
if (data.wait != null) {
message.wait = StocGameMessage.MsgWait.fromObject(data.wait);
}
return message;
}
toObject() {
......@@ -6482,6 +6550,7 @@ export namespace ygopro {
typeof StocGameMessage.MsgUpdateHp.prototype.toObject
>;
win?: ReturnType<typeof StocGameMessage.MsgWin.prototype.toObject>;
wait?: ReturnType<typeof StocGameMessage.MsgWait.prototype.toObject>;
} = {};
if (this.start != null) {
data.start = this.start.toObject();
......@@ -6543,6 +6612,9 @@ export namespace ygopro {
if (this.win != null) {
data.win = this.win.toObject();
}
if (this.wait != null) {
data.wait = this.wait.toObject();
}
return data;
}
serialize(): Uint8Array;
......@@ -6619,6 +6691,8 @@ export namespace ygopro {
);
if (this.has_win)
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();
}
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): StocGameMessage {
......@@ -6781,6 +6855,12 @@ export namespace ygopro {
() => (message.win = StocGameMessage.MsgWin.deserialize(reader))
);
break;
case 21:
reader.readMessage(
message.wait,
() => (message.wait = StocGameMessage.MsgWait.deserialize(reader))
);
break;
default:
reader.skipField();
}
......@@ -11340,5 +11420,56 @@ export namespace ygopro {
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;
export const MSG_RECOVER = 92;
export const MSG_PAY_LP_COST = 100;
export const MSG_WIN = 5;
export const MSG_WAITING = 3;
......@@ -21,6 +21,7 @@ import MsgSelectPositionAdapter from "./selectPosition";
import MsgSelectOptionAdapter from "./selectOption";
import MsgSelectBattleCmdAdapter from "./selectBattleCmd";
import MsgSelectUnselectCardAdapter from "./selectUnselectCard";
import MsgWaitAdapter from "./wait";
import MsgDamage from "./damage";
import MsgRecover from "./recover";
import MsgWin from "./win";
......@@ -142,6 +143,11 @@ export default class GameMsgAdapter implements StocAdapter {
break;
}
case GAME_MSG.MSG_WAITING: {
gameMsg.wait = MsgWaitAdapter(gameData);
break;
}
default: {
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 {
result?: MsgWin.ActionType;
waiting?: boolean;
// UI相关
modalState: ModalState;
}
......@@ -257,6 +259,11 @@ const duelSlice = createSlice({
setResult: (state, action: PayloadAction<MsgWin.ActionType>) => {
state.result = action.payload;
},
// 等待状态`Reducer`
setWaiting: (state, action: PayloadAction<boolean>) => {
state.waiting = action.payload;
},
},
extraReducers(builder) {
handsCase(builder);
......@@ -336,6 +343,7 @@ export const {
clearAllIdleInteractivities,
clearAllPlaceInteractivities,
setResult,
setWaiting,
} = duelSlice.actions;
export const selectDuelHsStart = (state: RootState) => {
return state.duel.meInitInfo != null;
......@@ -343,4 +351,7 @@ export const selectDuelHsStart = (state: RootState) => {
export const selectDuelResult = (state: RootState) => {
return state.duel.result;
};
export const selectWaiting = (state: RootState) => {
return state.duel.waiting;
};
export default duelSlice.reducer;
......@@ -20,11 +20,30 @@ import onMsgSelectUnselectCard from "./selectUnselectCard";
import onMsgSelectYesNo from "./selectYesNo";
import onMsgUpdateHp from "./updateHp";
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) {
const dispatch = store.dispatch;
const msg = pb.stoc_game_msg;
if (ActiveList.includes(msg.gameMsg)) {
dispatch(setWaiting(false));
}
switch (msg.gameMsg) {
case "start": {
onMsgStart(msg.start, dispatch);
......@@ -126,6 +145,11 @@ export default function handleGameMsg(pb: ygopro.YgoStocMsg) {
break;
}
case "wait": {
onMsgWait(msg.wait, dispatch);
break;
}
default: {
break;
}
......
......@@ -5,9 +5,7 @@ import {
addHandsIdleInteractivity,
addMagicIdleInteractivities,
addMonsterIdleInteractivities,
clearHandsIdleInteractivity,
clearMagicIdleInteractivities,
clearMonsterIdleInteractivities,
clearAllIdleInteractivities,
setEnableEp,
setEnableM2,
} from "../../reducers/duel/mod";
......@@ -19,9 +17,7 @@ export default (selectBattleCmd: MsgSelectBattleCmd, dispatch: AppDispatch) => {
const cmds = selectBattleCmd.battle_cmds;
// 先清掉之前的互动性
dispatch(clearHandsIdleInteractivity(player));
dispatch(clearMonsterIdleInteractivities(player));
dispatch(clearMagicIdleInteractivities(player));
dispatch(clearAllIdleInteractivities(player));
const dispatcher = (
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";
import { selectMeHint, selectOpHint } from "../../reducers/duel/hintSlice";
import { selectCurrentPhase } from "../../reducers/duel/phaseSlice";
import { notification } from "antd";
import { selectDuelResult } from "../../reducers/duel/mod";
import { selectDuelResult, selectWaiting } from "../../reducers/duel/mod";
import { useNavigate } from "react-router-dom";
import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import MsgWin = ygopro.StocGameMessage.MsgWin;
import NeosConfig from "../../../neos.config.json";
const HintNotification = () => {
const meHint = useAppSelector(selectMeHint);
const opHint = useAppSelector(selectOpHint);
const currentPhase = useAppSelector(selectCurrentPhase);
const waiting = useAppSelector(selectWaiting);
const result = useAppSelector(selectDuelResult);
const navigate = useNavigate();
......@@ -43,6 +45,16 @@ const HintNotification = () => {
}
}, [currentPhase]);
useEffect(() => {
if (waiting) {
api.info({
message: "...等待对方行动中...",
placement: "top",
duration: NeosConfig.ui.hint.waitingDuration,
});
}
}, [waiting]);
useEffect(() => {
if (result) {
const message =
......
......@@ -9,6 +9,7 @@ import {
selectOpInitInfo,
} from "../../reducers/duel/initInfoSlice";
import { selectCurrentPlayerIsMe } from "../../reducers/duel/turnSlice";
import { selectWaiting } from "../../reducers/duel/mod";
const Config = NeosConfig.ui.status;
const avatarSize = 40;
......@@ -18,13 +19,13 @@ const OP_VALUE = "opponent";
const PlayerStatus = () => {
const meInfo = useAppSelector(selectMeInitInfo);
const opInfo = useAppSelector(selectOpInitInfo);
const myTurn = useAppSelector(selectCurrentPlayerIsMe);
const waiting = useAppSelector(selectWaiting) || false;
return (
<CheckCard.Group
bordered
style={{ height: `${NeosConfig.ui.layout.header.height}` }}
value={myTurn ? ME_VALUE : OP_VALUE}
value={waiting ? OP_VALUE : ME_VALUE}
>
<CheckCard
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