Commit f3a23ad7 authored by chechunchi's avatar chechunchi

add createAsyncMetaThunk and exclusionSlice.ts

parent 9c3989e3
...@@ -2,14 +2,13 @@ import { judgeSelf } from "./util"; ...@@ -2,14 +2,13 @@ import { judgeSelf } from "./util";
import { import {
PayloadAction, PayloadAction,
CaseReducer, CaseReducer,
createAsyncThunk,
ActionReducerMapBuilder, ActionReducerMapBuilder,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { DuelState } from "./mod"; import { DuelState } from "./mod";
import { RootState } from "../../store"; import { RootState } from "../../store";
import { fetchCard } from "../../api/cards";
import { CardState } from "./generic"; import { CardState } from "./generic";
import { ygopro } from "../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { createAsyncMetaThunk } from "./generic";
export interface CemeteryState { export interface CemeteryState {
cemetery: CardState[]; cemetery: CardState[];
...@@ -29,21 +28,7 @@ export const initCemeteryImpl: CaseReducer<DuelState, PayloadAction<number>> = ( ...@@ -29,21 +28,7 @@ export const initCemeteryImpl: CaseReducer<DuelState, PayloadAction<number>> = (
}; };
// 增加墓地 // 增加墓地
export const fetchCemeteryMeta = createAsyncThunk( export const fetchCemeteryMeta = createAsyncMetaThunk("duel/fetchCemeteryMeta");
"duel/fetchCemeteryMeta",
async (param: { controler: number; sequence: number; code: number }) => {
const code = param.code;
const meta = await fetchCard(code);
const response = {
controler: param.controler,
sequence: param.sequence,
meta,
};
return response;
}
);
export const cemeteryCase = (builder: ActionReducerMapBuilder<DuelState>) => { export const cemeteryCase = (builder: ActionReducerMapBuilder<DuelState>) => {
builder.addCase(fetchCemeteryMeta.pending, (state, action) => { builder.addCase(fetchCemeteryMeta.pending, (state, action) => {
......
import { judgeSelf } from "./util";
import {
PayloadAction,
CaseReducer,
ActionReducerMapBuilder,
} from "@reduxjs/toolkit";
import { DuelState } from "./mod";
import { RootState } from "../../store";
import { CardState } from "./generic";
import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { createAsyncMetaThunk } from "./generic";
export interface ExclusionState {
exclusion: CardState[];
}
// 初始化除外区状态
export const initExclusionImpl: CaseReducer<
DuelState,
PayloadAction<number>
> = (state, action) => {
const player = action.payload;
if (judgeSelf(player, state)) {
state.meExclusion = { exclusion: [] };
} else {
state.opExclusion = { exclusion: [] };
}
};
// 增加除外区
export const fetchExclusionMeta = createAsyncMetaThunk(
"duel/fetchExclusionMeta"
);
export const exclusionCase = (builder: ActionReducerMapBuilder<DuelState>) => {
builder.addCase(fetchExclusionMeta.pending, (state, action) => {
// Meta结果没返回之前先更新`ID`
const controler = action.meta.arg.controler;
const sequence = action.meta.arg.sequence;
const code = action.meta.arg.code;
const newExclusion = {
occupant: { id: code, data: {}, text: {} },
location: {
controler,
location: ygopro.CardZone.REMOVED,
sequence,
},
idleInteractivities: [],
};
if (judgeSelf(controler, state)) {
if (state.meExclusion) {
state.meExclusion.exclusion.push(newExclusion);
} else {
state.meExclusion = { exclusion: [newExclusion] };
}
} else {
if (state.opExclusion) {
state.opExclusion.exclusion.push(newExclusion);
} else {
state.opExclusion = { exclusion: [newExclusion] };
}
}
});
builder.addCase(fetchExclusionMeta.fulfilled, (state, action) => {
const controler = action.payload.controler;
const sequence = action.payload.sequence;
const meta = action.payload.meta;
if (judgeSelf(controler, state)) {
if (state.meExclusion) {
for (const exclusion of state.meExclusion.exclusion) {
if (exclusion.location.sequence == sequence) {
exclusion.occupant = meta;
}
}
}
} else {
if (state.opExclusion) {
for (const exclusion of state.opExclusion.exclusion) {
if (exclusion.location.sequence == sequence) {
exclusion.occupant = meta;
}
}
}
}
});
};
export const selectMeExclusion = (state: RootState) =>
state.duel.meExclusion || { exclusion: [] };
export const selectopExclusion = (state: RootState) =>
state.duel.opExclusion || { exclusion: [] };
import { AsyncThunk, createAsyncThunk } from "@reduxjs/toolkit";
import { CardMeta } from "../../api/cards"; import { CardMeta } from "../../api/cards";
import { ygopro } from "../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { fetchCard } from "../../api/cards";
export interface CardState { export interface CardState {
occupant?: CardMeta; // 占据此位置的卡牌元信息 occupant?: CardMeta; // 占据此位置的卡牌元信息
...@@ -42,3 +44,35 @@ export interface Interactivity<T> { ...@@ -42,3 +44,35 @@ export interface Interactivity<T> {
// 用户点击后,需要回传给服务端的`response` // 用户点击后,需要回传给服务端的`response`
response: T; response: T;
} }
export function createAsyncMetaThunk(name: string): AsyncThunk<
{ controler: number; sequence: number; meta: CardMeta },
{
controler: number;
sequence: number;
position?: ygopro.CardPosition;
code: number;
},
{}
> {
return createAsyncThunk(
name,
async (param: {
controler: number;
sequence: number;
position?: ygopro.CardPosition;
code: number;
}) => {
const code = param.code;
const meta = await fetchCard(code);
const response = {
controler: param.controler,
sequence: param.sequence,
meta,
};
return response;
}
);
}
...@@ -9,7 +9,7 @@ import { DuelState } from "./mod"; ...@@ -9,7 +9,7 @@ import { DuelState } from "./mod";
import { ygopro } from "../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { RootState } from "../../store"; import { RootState } from "../../store";
import { fetchCard } from "../../api/cards"; import { fetchCard } from "../../api/cards";
import { CardState, InteractType } from "./generic"; import { CardState, InteractType, createAsyncMetaThunk } from "./generic";
export interface MagicState { export interface MagicState {
magics: CardState[]; magics: CardState[];
...@@ -113,25 +113,8 @@ export const clearMagicPlaceInteractivitiesImpl: CaseReducer< ...@@ -113,25 +113,8 @@ export const clearMagicPlaceInteractivitiesImpl: CaseReducer<
}; };
// 增加魔法陷阱 // 增加魔法陷阱
export const fetchMagicMeta = createAsyncThunk( export const fetchMagicMeta = createAsyncMetaThunk(
"duel/fetchMagicMeta", "duel/fetchMagicMeta",
async (param: {
controler: number;
sequence: number;
position: ygopro.CardPosition;
code: number;
}) => {
const code = param.code;
const meta = await fetchCard(code);
const response = {
controler: param.controler,
sequence: param.sequence,
meta,
};
return response;
}
); );
export const magicCase = (builder: ActionReducerMapBuilder<DuelState>) => { export const magicCase = (builder: ActionReducerMapBuilder<DuelState>) => {
......
...@@ -56,6 +56,11 @@ import { ...@@ -56,6 +56,11 @@ import {
magicCase, magicCase,
} from "./magicSlice"; } from "./magicSlice";
import { CemeteryState, initCemeteryImpl, cemeteryCase } from "./cemeretySlice"; import { CemeteryState, initCemeteryImpl, cemeteryCase } from "./cemeretySlice";
import {
ExclusionState,
initExclusionImpl,
exclusionCase,
} from "./exclusionSlice";
export interface DuelState { export interface DuelState {
selfType?: number; selfType?: number;
...@@ -74,6 +79,9 @@ export interface DuelState { ...@@ -74,6 +79,9 @@ export interface DuelState {
meCemetery?: CemeteryState; // 自己的墓地状态 meCemetery?: CemeteryState; // 自己的墓地状态
opCemetery?: CemeteryState; // 对手的墓地状态 opCemetery?: CemeteryState; // 对手的墓地状态
meExclusion?: ExclusionState; // 自己的除外区状态
opExclusion?: ExclusionState; // 对手的除外区状态
meTimeLimit?: TimeLimit; // 自己的计时 meTimeLimit?: TimeLimit; // 自己的计时
opTimeLimit?: TimeLimit; // 对手的计时 opTimeLimit?: TimeLimit; // 对手的计时
...@@ -128,6 +136,9 @@ const duelSlice = createSlice({ ...@@ -128,6 +136,9 @@ const duelSlice = createSlice({
// 墓地相关`Reducer` // 墓地相关`Reducer`
initCemetery: initCemeteryImpl, initCemetery: initCemeteryImpl,
// 除外区相关`Reducer`
initExclusion: initExclusionImpl,
// UI相关`Reducer` // UI相关`Reducer`
setCardModalIsOpen: setCardModalIsOpenImpl, setCardModalIsOpen: setCardModalIsOpenImpl,
setCardModalText: setCardModalTextImpl, setCardModalText: setCardModalTextImpl,
...@@ -154,6 +165,7 @@ const duelSlice = createSlice({ ...@@ -154,6 +165,7 @@ const duelSlice = createSlice({
monsterCase(builder); monsterCase(builder);
magicCase(builder); magicCase(builder);
cemeteryCase(builder); cemeteryCase(builder);
exclusionCase(builder);
checkCardModalCase(builder); checkCardModalCase(builder);
YesNoModalCase(builder); YesNoModalCase(builder);
optionModalCase(builder); optionModalCase(builder);
......
...@@ -2,14 +2,12 @@ import { judgeSelf } from "./util"; ...@@ -2,14 +2,12 @@ import { judgeSelf } from "./util";
import { import {
PayloadAction, PayloadAction,
CaseReducer, CaseReducer,
createAsyncThunk,
ActionReducerMapBuilder, ActionReducerMapBuilder,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { DuelState } from "./mod"; import { DuelState } from "./mod";
import { ygopro } from "../../api/ocgcore/idl/ocgcore"; import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { RootState } from "../../store"; import { RootState } from "../../store";
import { fetchCard } from "../../api/cards"; import { CardState, InteractType, createAsyncMetaThunk } from "./generic";
import { CardState, InteractType } from "./generic";
export interface MonsterState { export interface MonsterState {
monsters: CardState[]; monsters: CardState[];
...@@ -117,26 +115,7 @@ export const clearMonsterPlaceInteractivitiesImpl: CaseReducer< ...@@ -117,26 +115,7 @@ export const clearMonsterPlaceInteractivitiesImpl: CaseReducer<
}; };
// 增加怪兽 // 增加怪兽
export const fetchMonsterMeta = createAsyncThunk( export const fetchMonsterMeta = createAsyncMetaThunk("duel/fetchMonsterMeta");
"duel/fetchMonsterMeta",
async (param: {
controler: number;
sequence: number;
position: ygopro.CardPosition;
code: number;
}) => {
const code = param.code;
const meta = await fetchCard(code);
const response = {
controler: param.controler,
sequence: param.sequence,
meta,
};
return response;
}
);
export const monsterCase = (builder: ActionReducerMapBuilder<DuelState>) => { export const monsterCase = (builder: ActionReducerMapBuilder<DuelState>) => {
builder.addCase(fetchMonsterMeta.pending, (state, action) => { builder.addCase(fetchMonsterMeta.pending, (state, action) => {
......
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