Commit 0896be2d authored by Chunchi Che's avatar Chunchi Che

Merge branch 'feat/pos_change' into 'main'

Feat/pos change

See merge request mycard/Neos!83
parents 57e5a7ba b2bfeb73
Pipeline #19650 passed with stages
in 7 minutes and 9 seconds
neos-protobuf @ 9df2b696
Subproject commit a6ff791566b10e716210678371d74e62cd128ad9
Subproject commit 9df2b696eb24e89fd760945ef1b218b9d29a6df3
This diff is collapsed.
......@@ -33,5 +33,22 @@
"repeatedType": "uint32"
}
]
},
"53": {
"protoType": "pos_change",
"fields": [
{
"fieldName": "card_info",
"fieldType": "CardInfo"
},
{
"fieldName": "pre_position",
"fieldType": "CardPosition"
},
{
"fieldName": "cur_position",
"fieldType": "CardPosition"
}
]
}
}
......@@ -3,6 +3,7 @@
import PenetrateData from "./penetrate.json";
import { BufferReader } from "../../bufferIO";
import { ygopro } from "../../../idl/ocgcore";
import { numberToCardPosition } from "../../util";
type Constructor<T = any> = new (...args: any[]) => T;
......@@ -11,10 +12,13 @@ const ReadFieldHandlerMap: Map<string, readFieldHandler> = new Map([
["uint16", (reader) => reader.readUint16()],
["uint32", (reader) => reader.readUint32()],
["CardLocation", (reader) => reader.readCardLocation()],
["CardInfo", (reader) => reader.readCardInfo()],
["CardPosition", (reader) => numberToCardPosition(reader.readUint8())],
]);
const MsgConstructorMap: Map<string, Constructor> = new Map([
["move", ygopro.StocGameMessage.MsgMove as Constructor],
["shuffle_hand", ygopro.StocGameMessage.MsgShuffleHand],
["pos_change", ygopro.StocGameMessage.MsgPosChange],
]);
export interface penetrateType {
......
......@@ -251,3 +251,14 @@ export function clearIdleInteractivities<T extends DuelFieldState>(
});
}
}
export function setPosition<T extends DuelFieldState>(
state: T | undefined,
sequence: number,
position: ygopro.CardPosition
) {
const target = state?.inner.find((_, idx) => idx == sequence);
if (target && target.occupant) {
target.location.position = position;
}
}
......@@ -17,6 +17,7 @@ import {
Interactivity,
extendIdleInteractivities,
clearIdleInteractivities,
setPosition,
} from "./generic";
export interface MagicState extends DuelFieldState {}
......@@ -172,6 +173,23 @@ export const removeMagicImpl: CaseReducer<
removeOccupant(magics, action.payload.sequence);
};
// 改变魔法表示形式
export const setMagicPositionImpl: CaseReducer<
DuelState,
PayloadAction<{
controler: number;
sequence: number;
position: ygopro.CardPosition;
}>
> = (state, action) => {
const controler = action.payload.controler;
const sequence = action.payload.sequence;
const position = action.payload.position;
const magics = judgeSelf(controler, state) ? state.meMagics : state.opMagics;
setPosition(magics, sequence, position);
};
export const selectMeMagics = (state: RootState) =>
state.duel.meMagics || { inner: [] };
export const selectOpMagics = (state: RootState) =>
......
......@@ -55,6 +55,7 @@ import {
addMonsterIdleInteractivitiesImpl,
clearMonsterIdleInteractivitiesImpl,
removeMonsterImpl,
setMonsterPositionImpl,
monsterCase,
} from "./monstersSlice";
import {
......@@ -65,6 +66,7 @@ import {
addMagicIdleInteractivitiesImpl,
clearMagicIdleInteractivitiesImpl,
removeMagicImpl,
setMagicPositionImpl,
magicCase,
} from "./magicSlice";
import { CemeteryState, initCemeteryImpl, cemeteryCase } from "./cemeretySlice";
......@@ -156,6 +158,7 @@ const duelSlice = createSlice({
clearMonsterPlaceInteractivities: clearMonsterPlaceInteractivitiesImpl,
addMonsterIdleInteractivities: addMonsterIdleInteractivitiesImpl,
clearMonsterIdleInteractivities: clearMonsterIdleInteractivitiesImpl,
setMonsterPosition: setMonsterPositionImpl,
removeMonster: removeMonsterImpl,
// 魔法陷阱区相关`Reducer`
......@@ -164,6 +167,7 @@ const duelSlice = createSlice({
clearMagicPlaceInteractivities: clearMagicPlaceInteractivitiesImpl,
addMagicIdleInteractivities: addMagicIdleInteractivitiesImpl,
clearMagicIdleInteractivities: clearMagicIdleInteractivitiesImpl,
setMagicPosition: setMagicPositionImpl,
removeMagic: removeMagicImpl,
// 墓地相关`Reducer`
......@@ -241,12 +245,14 @@ export const {
clearMonsterPlaceInteractivities,
addMonsterIdleInteractivities,
clearMonsterIdleInteractivities,
setMonsterPosition,
removeMonster,
initMagics,
addMagicPlaceInteractivities,
clearMagicPlaceInteractivities,
addMagicIdleInteractivities,
clearMagicIdleInteractivities,
setMagicPosition,
removeMagic,
removeHand,
initCemetery,
......
......@@ -17,6 +17,7 @@ import {
removeOccupant,
extendIdleInteractivities,
clearIdleInteractivities,
setPosition,
} from "./generic";
export interface MonsterState extends DuelFieldState {}
......@@ -184,6 +185,25 @@ export const removeMonsterImpl: CaseReducer<
removeOccupant(monsters, action.payload.sequence);
};
// 改变怪兽表示形式
export const setMonsterPositionImpl: CaseReducer<
DuelState,
PayloadAction<{
controler: number;
sequence: number;
position: ygopro.CardPosition;
}>
> = (state, action) => {
const controler = action.payload.controler;
const sequence = action.payload.sequence;
const position = action.payload.position;
const monsters = judgeSelf(controler, state)
? state.meMonsters
: state.opMonsters;
setPosition(monsters, sequence, position);
};
export const selectMeMonsters = (state: RootState) =>
state.duel.meMonsters || { inner: [] };
export const selectOpMonsters = (state: RootState) =>
......
......@@ -15,6 +15,7 @@ import onMsgSelectPosition from "./selectPosition";
import onMsgSelectOption from "./selectOption";
import onMsgShuffleHand from "./shuffleHand";
import onMsgSelectBattleCmd from "./selectBattleCmd";
import onMsgPosChange from "./posChange";
export default function handleGameMsg(pb: ygopro.YgoStocMsg) {
const dispatch = store.dispatch;
......@@ -96,6 +97,11 @@ export default function handleGameMsg(pb: ygopro.YgoStocMsg) {
break;
}
case "pos_change": {
onMsgPosChange(msg.pos_change, dispatch);
break;
}
default: {
break;
}
......
import { ygopro } from "../../api/ocgcore/idl/ocgcore";
import { setMagicPosition, setMonsterPosition } from "../../reducers/duel/mod";
import { AppDispatch } from "../../store";
import MsgPosChange = ygopro.StocGameMessage.MsgPosChange;
export default (posChange: MsgPosChange, dispatch: AppDispatch) => {
const cardInfo = posChange.card_info;
switch (cardInfo.location) {
case ygopro.CardZone.MZONE: {
dispatch(
setMonsterPosition({
controler: cardInfo.controler,
sequence: cardInfo.sequence,
position: posChange.cur_position,
})
);
break;
}
case ygopro.CardZone.SZONE: {
dispatch(
setMagicPosition({
controler: cardInfo.controler,
sequence: cardInfo.sequence,
position: posChange.cur_position,
})
);
break;
}
default: {
console.log(`Unhandled zone ${cardInfo.location}`);
}
}
};
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