Commit a78d6b50 authored by chechunchi's avatar chechunchi

update selectChain service and ui

parent d1060dbd
......@@ -27,6 +27,7 @@ import {
setCardListModalInfoImpl,
setCheckCardModalIsOpenImpl,
setCheckCardModalMinMaxImpl,
setCheckCardModalOnSubmitImpl,
resetCheckCardModalImpl,
checkCardModalCase,
} from "./modalSlice";
......@@ -123,6 +124,7 @@ const duelSlice = createSlice({
setCardListModalInfo: setCardListModalInfoImpl,
setCheckCardModalIsOpen: setCheckCardModalIsOpenImpl,
setCheckCardModalMinMax: setCheckCardModalMinMaxImpl,
setCheckCardModalOnSubmit: setCheckCardModalOnSubmitImpl,
resetCheckCardModal: resetCheckCardModalImpl,
},
extraReducers(builder) {
......@@ -159,6 +161,7 @@ export const {
setCardListModalInfo,
setCheckCardModalIsOpen,
setCheckCardModalMinMax,
setCheckCardModalOnSubmit,
resetCheckCardModal,
} = duelSlice.actions;
export const selectDuelHsStart = (state: RootState) => {
......
......@@ -30,6 +30,7 @@ export interface ModalState {
// 卡牌选择弹窗
checkCardModal: {
isOpen: boolean;
onSubmit?: string;
selectMin?: number;
selectMax?: number;
tags: {
......@@ -116,6 +117,14 @@ export const setCheckCardModalMinMaxImpl: CaseReducer<
state.modalState.checkCardModal.selectMax = action.payload.max;
};
// 更新卡牌选择弹窗的提交回调
export const setCheckCardModalOnSubmitImpl: CaseReducer<
DuelState,
PayloadAction<string>
> = (state, action) => {
state.modalState.checkCardModal.onSubmit = action.payload;
};
// 增加卡牌选择选项
export const fetchCheckCardMeta = createAsyncThunk(
"duel/fetchCheckCardMeta",
......@@ -222,3 +231,5 @@ export const selectCheckCardModalMinMax = (state: RootState) => {
};
export const selectCheckCardModalTags = (state: RootState) =>
state.duel.modalState.checkCardModal.tags;
export const selectCheckCardModalOnSubmit = (state: RootState) =>
state.duel.modalState.checkCardModal.onSubmit;
......@@ -3,6 +3,7 @@ import { AppDispatch } from "../../store";
import {
setCheckCardModalIsOpen,
setCheckCardModalMinMax,
setCheckCardModalOnSubmit,
} from "../../reducers/duel/mod";
import { fetchCheckCardMeta } from "../../reducers/duel/modalSlice";
import MsgSelectCard = ygopro.StocGameMessage.MsgSelectCard;
......@@ -16,6 +17,7 @@ export default (selectCard: MsgSelectCard, dispatch: AppDispatch) => {
const cards = selectCard.cards;
dispatch(setCheckCardModalMinMax({ min, max }));
dispatch(setCheckCardModalOnSubmit("sendSelectCardResponse"));
for (const card of cards) {
const tagName = CardZoneToChinese(card.location.location);
......
import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { sendSelectChainResponse } from "../../api/ocgcore/ocgHelper";
import {
setCheckCardModalIsOpen,
setCheckCardModalMinMax,
setCheckCardModalOnSubmit,
} from "../../reducers/duel/mod";
import { fetchCheckCardMeta } from "../../reducers/duel/modalSlice";
import { AppDispatch } from "../../store";
import { CardZoneToChinese } from "./util";
import MsgSelectChain = ygopro.StocGameMessage.MsgSelectChain;
export default (selectChain: MsgSelectChain, dispatch: AppDispatch) => {
......@@ -9,4 +17,81 @@ export default (selectChain: MsgSelectChain, dispatch: AppDispatch) => {
const hint0 = selectChain.hint0;
const hint1 = selectChain.hint1;
const chains = selectChain.chains;
let handle_flag = 0;
if (!forced) {
// 无强制发动的卡
if (spCount == 0) {
// 无关键卡
if (chains.length == 0) {
// 直接回答
handle_flag = 0;
} else {
// 处理多张
handle_flag = 2;
}
} else {
// 有关键卡
if (chains.length == 0) {
// 根本没卡,直接回答
handle_flag = 0;
} else {
// 处理多张
handle_flag = 2;
}
}
} else {
// 有强制发动的卡
if (chains.length == 1) {
// 只有一个强制发动的连锁项,直接回应
handle_flag = 4;
} else {
// 处理强制发动的卡
handle_flag = 3;
}
}
switch (handle_flag) {
case 0: {
// 直接回答
sendSelectChainResponse(-1);
break;
}
case 2: // 处理多张
case 3: {
// 处理强制发动的卡
// TODO:非强制发动的场景需要支持取消
dispatch(setCheckCardModalMinMax({ min: 1, max: 1 }));
dispatch(setCheckCardModalOnSubmit("sendSelectChainResponse"));
for (const chain of chains) {
const tagName = CardZoneToChinese(chain.location.location);
dispatch(
fetchCheckCardMeta({
controler: chain.location.controler,
tagName,
option: {
code: chain.code,
response: chain.response,
effectDescCode: chain.effect_description,
},
})
);
}
dispatch(setCheckCardModalIsOpen(true));
break;
}
case 4: {
// 有一张强制发动的卡,直接回应
sendSelectChainResponse(chains[0].response);
break;
}
default: {
console.log(`Unhandled flag: ${handle_flag}`);
}
}
};
......@@ -4,6 +4,7 @@ import { store } from "../../store";
import {
selectCheckCardModalIsOpen,
selectCheckCardModalMinMax,
selectCheckCardModalOnSubmit,
selectCheckCardModalTags,
} from "../../reducers/duel/modalSlice";
import {
......@@ -12,13 +13,17 @@ import {
} from "../../reducers/duel/mod";
import { Modal, Button, Row, Col, Popover } from "antd";
import { CheckCard } from "@ant-design/pro-components";
import { sendSelectCardResponse } from "../../api/ocgcore/ocgHelper";
import {
sendSelectCardResponse,
sendSelectChainResponse,
} from "../../api/ocgcore/ocgHelper";
const CheckCardModal = () => {
const dispatch = store.dispatch;
const isOpen = useAppSelector(selectCheckCardModalIsOpen);
const { min, max } = useAppSelector(selectCheckCardModalMinMax);
const tabs = useAppSelector(selectCheckCardModalTags);
const onSubmit = useAppSelector(selectCheckCardModalOnSubmit);
const [response, setResponse] = useState<number[]>([]);
const defaultValue: number[] = [];
......@@ -31,12 +36,25 @@ const CheckCardModal = () => {
<Button
disabled={response.length < min || response.length > max}
onClick={() => {
sendSelectCardResponse(response);
switch (onSubmit) {
case "sendSelectChainResponse": {
sendSelectChainResponse(response[0]);
break;
}
case "sendSelectCardResponse": {
sendSelectCardResponse(response);
break;
}
default: {
}
}
dispatch(setCheckCardModalIsOpen(false));
dispatch(resetCheckCardModal());
}}
>
summit
submit
</Button>
}
width={800}
......
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