Commit 6c4f377c authored by timel's avatar timel Committed by Chunchi Che

Dev/refactor duel

parent bc14d8f1
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
"plugin:import/typescript" "plugin:import/typescript"
], ],
"plugins": [ "plugins": [
"@typescript-eslint" "@typescript-eslint",
"simple-import-sort"
], ],
"rules": { "rules": {
"eqeqeq": 0, "eqeqeq": 0,
...@@ -14,7 +15,9 @@ ...@@ -14,7 +15,9 @@
"@typescript-eslint/consistent-type-definitions": [ "@typescript-eslint/consistent-type-definitions": [
"error", "error",
"interface" "interface"
] ],
"simple-import-sort/imports": "warn",
"simple-import-sort/exports": "warn"
}, },
"settings": { "settings": {
"import/resolver": { "import/resolver": {
......
This diff is collapsed.
import axios from "axios"; import axios from "axios";
import sqliteMiddleWare, { sqliteCmd } from "@/middleware/sqlite"; import sqliteMiddleWare, { sqliteCmd } from "@/middleware/sqlite";
export interface CardMeta { export interface CardMeta {
......
import { YgoProPacket } from "./packet";
import { ygopro } from "../idl/ocgcore"; import { ygopro } from "../idl/ocgcore";
import { YgoProPacket } from "./packet";
import { import {
STOC_CHAT, STOC_CHAT,
STOC_DECK_COUNT,
STOC_DUEL_START,
STOC_GAME_MSG,
STOC_HAND_RESULT,
STOC_HS_PLAYER_CHANGE, STOC_HS_PLAYER_CHANGE,
STOC_HS_PLAYER_ENTER, STOC_HS_PLAYER_ENTER,
STOC_HS_WATCH_CHANGE, STOC_HS_WATCH_CHANGE,
STOC_JOIN_GAME, STOC_JOIN_GAME,
STOC_TYPE_CHANGE,
STOC_SELECT_HAND, STOC_SELECT_HAND,
STOC_SELECT_TP, STOC_SELECT_TP,
STOC_HAND_RESULT,
STOC_DECK_COUNT,
STOC_DUEL_START,
STOC_GAME_MSG,
STOC_TIME_LIMIT, STOC_TIME_LIMIT,
STOC_TYPE_CHANGE,
} from "./protoDecl"; } from "./protoDecl";
import StocChat from "./stoc/stocChat"; import StocChat from "./stoc/stocChat";
import StocJoinGame from "./stoc/stocJoinGame"; import StocDeckCount from "./stoc/stocDeckCount";
import StocHsPlayerEnter from "./stoc/stocHsPlayerEnter"; import StocDuelStart from "./stoc/stocDuelStart";
import StocGameMsg from "./stoc/stocGameMsg/mod";
import StocHsPlayerChange from "./stoc/stocHsPlayerChange"; import StocHsPlayerChange from "./stoc/stocHsPlayerChange";
import StocHsPlayerEnter from "./stoc/stocHsPlayerEnter";
import StocHsWatchChange from "./stoc/stocHsWatchChange"; import StocHsWatchChange from "./stoc/stocHsWatchChange";
import StocTypeChange from "./stoc/stocTypeChange"; import StocJoinGame from "./stoc/stocJoinGame";
import StocSelectHand from "./stoc/stocSelectHand"; import StocSelectHand from "./stoc/stocSelectHand";
import StocSelectTp from "./stoc/stocSelectTp"; import StocSelectTp from "./stoc/stocSelectTp";
import StocDeckCount from "./stoc/stocDeckCount";
import StocTimeLimit from "./stoc/stocTimeLimit"; import StocTimeLimit from "./stoc/stocTimeLimit";
import StocGameMsg from "./stoc/stocGameMsg/mod"; import StocTypeChange from "./stoc/stocTypeChange";
import StocDuelStart from "./stoc/stocDuelStart";
/* /*
* 将[`ygoProPacket`]对象转换成[`ygopro.YgoStocMsg`]对象 * 将[`ygoProPacket`]对象转换成[`ygopro.YgoStocMsg`]对象
......
import { BufferReader } from "rust-src";
import { ygopro } from "../idl/ocgcore"; import { ygopro } from "../idl/ocgcore";
import { numberToCardPosition, numberToCardZone } from "./util"; import { numberToCardPosition, numberToCardZone } from "./util";
import { BufferReader } from "rust-src";
const LOCATION_OVERLAY = 0x80; const LOCATION_OVERLAY = 0x80;
......
import { ygopro } from "../../../idl/ocgcore"; import { ygopro } from "../../../idl/ocgcore";
import { YgoProPacket } from "../../packet"; import { YgoProPacket } from "../../packet";
import { CTOS_RESPONSE } from "../../protoDecl"; import { CTOS_RESPONSE } from "../../protoDecl";
import adaptSelectIdleCmdResponse from "./selectIdleCmd"; import adaptSelectBattleCmdResponse from "./selectBattleCmd";
import adaptSelectPlaceResponse from "./selectPlace";
import adaptSelectCardResponse from "./selectCard"; import adaptSelectCardResponse from "./selectCard";
import adaptSelectChainResponse from "./selectChain"; import adaptSelectChainResponse from "./selectChain";
import adaptSelectCounterResponse from "./selectCounter";
import adaptSelectEffectYnResponse from "./selectEffectYn"; import adaptSelectEffectYnResponse from "./selectEffectYn";
import adaptSelectPositionResponse from "./selectPosition"; import adaptSelectIdleCmdResponse from "./selectIdleCmd";
import adaptSelectOptionResponse from "./selectOption"; import adaptSelectOptionResponse from "./selectOption";
import adaptSelectBattleCmdResponse from "./selectBattleCmd"; import adaptSelectPlaceResponse from "./selectPlace";
import adaptSelectPositionResponse from "./selectPosition";
import adaptSelectUnselectCardResponse from "./selectUnselectCard"; import adaptSelectUnselectCardResponse from "./selectUnselectCard";
import adaptSelectCounterResponse from "./selectCounter";
import adaptSortCardResponse from "./sortCard"; import adaptSortCardResponse from "./sortCard";
/* /*
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default ( export default (
response: ygopro.CtosGameMsgResponse.SelectBattleCmdResponse response: ygopro.CtosGameMsgResponse.SelectBattleCmdResponse
) => { ) => {
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default (response: ygopro.CtosGameMsgResponse.SelectCardResponse) => { export default (response: ygopro.CtosGameMsgResponse.SelectCardResponse) => {
const writer = new BufferWriter(); const writer = new BufferWriter();
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default (response: ygopro.CtosGameMsgResponse.SelectChainResponse) => { export default (response: ygopro.CtosGameMsgResponse.SelectChainResponse) => {
const writer = new BufferWriter(); const writer = new BufferWriter();
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default (response: ygopro.CtosGameMsgResponse.SelectCounterResponse) => { export default (response: ygopro.CtosGameMsgResponse.SelectCounterResponse) => {
const writer = new BufferWriter(); const writer = new BufferWriter();
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default ( export default (
response: ygopro.CtosGameMsgResponse.SelectEffectYnResponse response: ygopro.CtosGameMsgResponse.SelectEffectYnResponse
) => { ) => {
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default (response: ygopro.CtosGameMsgResponse.SelectIdleCmdResponse) => { export default (response: ygopro.CtosGameMsgResponse.SelectIdleCmdResponse) => {
const writer = new BufferWriter(); const writer = new BufferWriter();
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default (response: ygopro.CtosGameMsgResponse.SelectOptionResponse) => { export default (response: ygopro.CtosGameMsgResponse.SelectOptionResponse) => {
const writer = new BufferWriter(); const writer = new BufferWriter();
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
import { cardZoneToNumber } from "../../util"; import { cardZoneToNumber } from "../../util";
export default (response: ygopro.CtosGameMsgResponse.SelectPlaceResponse) => { export default (response: ygopro.CtosGameMsgResponse.SelectPlaceResponse) => {
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default ( export default (
response: ygopro.CtosGameMsgResponse.SelectPositionResponse response: ygopro.CtosGameMsgResponse.SelectPositionResponse
) => { ) => {
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default ( export default (
response: ygopro.CtosGameMsgResponse.SelectUnselectCardResponse response: ygopro.CtosGameMsgResponse.SelectUnselectCardResponse
) => { ) => {
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "rust-src"; import { BufferWriter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
export default (response: ygopro.CtosGameMsgResponse.SortCardResponse) => { export default (response: ygopro.CtosGameMsgResponse.SortCardResponse) => {
const writer = new BufferWriter(); const writer = new BufferWriter();
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC Chat * STOC Chat
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
const LITTLE_ENDIAN = true; const LITTLE_ENDIAN = true;
const INT16_BYTE_OFFSET = 2; const INT16_BYTE_OFFSET = 2;
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC DuelStart * STOC DuelStart
......
import { ygopro } from "../../../idl/ocgcore";
import { ocgDamageAdapter } from "rust-src"; import { ocgDamageAdapter } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
/* /*
* Msg Damage * Msg Damage
* *
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
/* /*
* MSG Draw * MSG Draw
* *
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
/* /*
* Msg Hint * Msg Hint
* *
......
...@@ -4,35 +4,35 @@ ...@@ -4,35 +4,35 @@
* */ * */
import { ygopro } from "../../../idl/ocgcore"; import { ygopro } from "../../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../../packet"; import { StocAdapter, YgoProPacket } from "../../packet";
import * as GAME_MSG from "../../protoDecl"; import * as GAME_MSG from "../../protoDecl";
import MsgStartAdapter from "./start"; import MsgAddCounter from "./addCounter";
import MsgDamage from "./damage";
import MsgDrawAdapter from "./draw"; import MsgDrawAdapter from "./draw";
import MsgNewTurnAdapter from "./newTurn";
import MsgNewPhaseAdapter from "./newPhase";
import MsgHintAdapter from "./hint"; import MsgHintAdapter from "./hint";
import MsgSelectIdleCmdAdapter from "./selectIdleCmd"; import MsgNewPhaseAdapter from "./newPhase";
import MsgSelectPlaceAdapter from "./selectPlace"; import MsgNewTurnAdapter from "./newTurn";
import PENETRATE from "./penetrate";
import MsgRecover from "./recover";
import MsgReloadFieldAdapter from "./reloadField";
import MsgRemoveCounter from "./removeCounter";
import MsgSelectBattleCmdAdapter from "./selectBattleCmd";
import MsgSelectCardAdapter from "./selectCard"; import MsgSelectCardAdapter from "./selectCard";
import MsgSelectTributeAdapter from "./selectTribute";
import MsgSelectChainAdapter from "./selectChain"; import MsgSelectChainAdapter from "./selectChain";
import MsgSelectCounter from "./selectCounter";
import MsgSelectEffectYnAdapter from "./selectEffectYn"; import MsgSelectEffectYnAdapter from "./selectEffectYn";
import MsgSelectPositionAdapter from "./selectPosition"; import MsgSelectIdleCmdAdapter from "./selectIdleCmd";
import MsgSelectOptionAdapter from "./selectOption"; import MsgSelectOptionAdapter from "./selectOption";
import MsgSelectBattleCmdAdapter from "./selectBattleCmd"; import MsgSelectPlaceAdapter from "./selectPlace";
import MsgSelectPositionAdapter from "./selectPosition";
import MsgSelectSum from "./selectSum";
import MsgSelectTributeAdapter from "./selectTribute";
import MsgSelectUnselectCardAdapter from "./selectUnselectCard"; import MsgSelectUnselectCardAdapter from "./selectUnselectCard";
import MsgSortCard from "./sortCard";
import MsgStartAdapter from "./start";
import MsgUpdateDataAdapter from "./updateData";
import MsgWaitAdapter from "./wait"; import MsgWaitAdapter from "./wait";
import MsgDamage from "./damage";
import MsgRecover from "./recover";
import MsgWin from "./win"; import MsgWin from "./win";
import MsgUpdateDataAdapter from "./updateData";
import MsgReloadFieldAdapter from "./reloadField";
import MsgSelectSum from "./selectSum";
import MsgAddCounter from "./addCounter";
import MsgRemoveCounter from "./removeCounter";
import MsgSelectCounter from "./selectCounter";
import MsgSortCard from "./sortCard";
import PENETRATE from "./penetrate";
/* /*
* STOC GameMsg * STOC GameMsg
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
/* /*
* Msg New Phase * Msg New Phase
* *
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
/* /*
* MSG New Turn * MSG New Turn
* *
......
//! 透传协议 //! 透传协议
import PenetrateData from "./penetrate.json";
import { BufferReaderExt } from "../../bufferIO";
import { ygopro } from "../../../idl/ocgcore"; import { ygopro } from "../../../idl/ocgcore";
import { BufferReaderExt } from "../../bufferIO";
import { numberToCardPosition } from "../../util"; import { numberToCardPosition } from "../../util";
import PenetrateData from "./penetrate.json";
type Constructor<T = any> = new (...args: any[]) => T; type Constructor<T = any> = new (...args: any[]) => T;
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
/* /*
* Msg Recover * Msg Recover
* *
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
import MsgSelectOption = ygopro.StocGameMessage.MsgSelectOption; import MsgSelectOption = ygopro.StocGameMessage.MsgSelectOption;
/* /*
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
import MsgSelectPlace = ygopro.StocGameMessage.MsgSelectPlace; import MsgSelectPlace = ygopro.StocGameMessage.MsgSelectPlace;
/* /*
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
import MsgSelectPosition = ygopro.StocGameMessage.MsgSelectPosition; import MsgSelectPosition = ygopro.StocGameMessage.MsgSelectPosition;
/* /*
......
import { ygopro } from "../../../idl/ocgcore";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../../idl/ocgcore";
import MsgWin = ygopro.StocGameMessage.MsgWin; import MsgWin = ygopro.StocGameMessage.MsgWin;
/* /*
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC HsPlayerChange * STOC HsPlayerChange
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
import { UTF16_BUFFER_MAX_LEN, _cutoff_name } from "../util"; import { _cutoff_name, UTF16_BUFFER_MAX_LEN } from "../util";
const UINT8_PER_UINT16 = 2; const UINT8_PER_UINT16 = 2;
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC HsWatchChange * STOC HsWatchChange
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC JoinGame * STOC JoinGame
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC SelectHand * STOC SelectHand
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC SelectTp * STOC SelectTp
......
import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet";
import { BufferReader } from "rust-src"; import { BufferReader } from "rust-src";
import { ygopro } from "../../idl/ocgcore";
import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC TimeLimit * STOC TimeLimit
* *
......
import { ygopro } from "../../idl/ocgcore"; import { ygopro } from "../../idl/ocgcore";
import { YgoProPacket, StocAdapter } from "../packet"; import { StocAdapter, YgoProPacket } from "../packet";
/* /*
* STOC TypeChange * STOC TypeChange
......
...@@ -2,20 +2,21 @@ ...@@ -2,20 +2,21 @@
* 一些发ygopro协议数据包的辅助函数,用于简化业务代码。 * 一些发ygopro协议数据包的辅助函数,用于简化业务代码。
* *
* */ * */
import { ygopro } from "./idl/ocgcore";
import socketMiddleWare, { socketCmd } from "@/middleware/socket"; import socketMiddleWare, { socketCmd } from "@/middleware/socket";
import { IDeck } from "../deck"; import { IDeck } from "../deck";
import PlayerInfoAdapter from "./ocgAdapter/ctos/ctosPlayerInfo"; import { ygopro } from "./idl/ocgcore";
import JoinGameAdapter from "./ocgAdapter/ctos/ctosJoinGame"; import Chat from "./ocgAdapter/ctos/ctosChat";
import UpdateDeckAdapter from "./ocgAdapter/ctos/ctosUpdateDeck"; import GameMsgResponse from "./ocgAdapter/ctos/ctosGameMsgResponse/mod";
import HandResult from "./ocgAdapter/ctos/ctosHandResult";
import HsReadyAdapter from "./ocgAdapter/ctos/ctosHsReady"; import HsReadyAdapter from "./ocgAdapter/ctos/ctosHsReady";
import HsStartAdapter from "./ocgAdapter/ctos/ctosHsStart"; import HsStartAdapter from "./ocgAdapter/ctos/ctosHsStart";
import HandResult from "./ocgAdapter/ctos/ctosHandResult"; import JoinGameAdapter from "./ocgAdapter/ctos/ctosJoinGame";
import TpResult from "./ocgAdapter/ctos/ctosTpResult"; import PlayerInfoAdapter from "./ocgAdapter/ctos/ctosPlayerInfo";
import TimeConfirm from "./ocgAdapter/ctos/ctosTimeConfirm";
import Surrender from "./ocgAdapter/ctos/ctosSurrender"; import Surrender from "./ocgAdapter/ctos/ctosSurrender";
import GameMsgResponse from "./ocgAdapter/ctos/ctosGameMsgResponse/mod"; import TimeConfirm from "./ocgAdapter/ctos/ctosTimeConfirm";
import Chat from "./ocgAdapter/ctos/ctosChat"; import TpResult from "./ocgAdapter/ctos/ctosTpResult";
import UpdateDeckAdapter from "./ocgAdapter/ctos/ctosUpdateDeck";
export function sendUpdateDeck(deck: IDeck) { export function sendUpdateDeck(deck: IDeck) {
const updateDeck = new ygopro.YgoCtosMsg({ const updateDeck = new ygopro.YgoCtosMsg({
......
import axios from "axios"; import axios from "axios";
import NeosConfig from "../../neos.config.json";
import { getCardStr, fetchCard } from "./cards";
import { useConfig } from "@/config";
import { fetchCard, getCardStr } from "./cards";
const NeosConfig = useConfig();
export const DESCRIPTION_LIMIT = 10000; export const DESCRIPTION_LIMIT = 10000;
export async function initStrings() { export async function initStrings() {
......
import { useEnv } from "@/hook"; import { useEnv } from "@/hook";
import NeosDevConfig from "../../neos.config.json"; import NeosDevConfig from "../../neos.config.json";
import NeosProdConfig from "../../neos.config.prod.json"; import NeosProdConfig from "../../neos.config.prod.json";
......
export * from "./useApp"; export * from "./useApp";
export * from "./useEnv"; export * from "./useEnv";
export * from "./useMeshClick";
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux"; import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
import type { RootState, AppDispatch } from "@/store";
import type { AppDispatch, RootState } from "@/store";
// Use throughout your app instead of plain `useDispatch` and `useSelector` // Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch: () => AppDispatch = useDispatch; export const useAppDispatch: () => AppDispatch = useDispatch;
......
// 一些自定义`Hook` // 一些自定义`Hook`
import { ActionEvent } from "@babylonjs/core"; import { ActionEvent } from "@babylonjs/core";
import { MutableRefObject, useEffect, useRef } from "react";
import { Nullable } from "@babylonjs/core/types.js";
import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh.js";
import { ActionManager } from "@babylonjs/core/Actions/actionManager.js";
import { IAction } from "@babylonjs/core/Actions/action.js"; import { IAction } from "@babylonjs/core/Actions/action.js";
import { ActionManager } from "@babylonjs/core/Actions/actionManager.js";
import { ExecuteCodeAction } from "@babylonjs/core/Actions/directActions.js"; import { ExecuteCodeAction } from "@babylonjs/core/Actions/directActions.js";
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh.js";
import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
import { Nullable } from "@babylonjs/core/types.js";
import { MutableRefObject, useEffect, useRef } from "react";
export interface MeshEventType { export interface MeshEventType {
(env: ActionEvent): void; (env: ActionEvent): void;
......
...@@ -19,14 +19,15 @@ ...@@ -19,14 +19,15 @@
* 在进行代码开发的时候需要注意这点。 * 在进行代码开发的时候需要注意这点。
* *
* */ * */
import { ConfigProvider, theme } from "antd";
import zhCN from "antd/locale/zh_CN";
import React from "react"; import React from "react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import Neos from "./ui/Neos";
import { BrowserRouter } from "react-router-dom";
import { Provider } from "react-redux"; import { Provider } from "react-redux";
import { BrowserRouter } from "react-router-dom";
import { store } from "./store"; import { store } from "./store";
import { ConfigProvider, theme } from "antd"; import Neos from "./ui/Neos";
import zhCN from "antd/locale/zh_CN";
const root = ReactDOM.createRoot( const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement document.getElementById("root") as HTMLElement
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
* 所有长连接/Websocket相关的逻辑都应该收敛在这里。 * 所有长连接/Websocket相关的逻辑都应该收敛在这里。
* *
* */ * */
import handleSocketOpen from "../service/onSocketOpen";
import handleSocketMessage from "../service/onSocketMessage"; import handleSocketMessage from "../service/onSocketMessage";
import handleSocketOpen from "../service/onSocketOpen";
export enum socketCmd { export enum socketCmd {
// 建立长连接 // 建立长连接
......
...@@ -6,8 +6,11 @@ ...@@ -6,8 +6,11 @@
* */ * */
import initSqlJs, { Database } from "sql.js"; import initSqlJs, { Database } from "sql.js";
import { CardMeta, CardData, CardText } from "@/api/cards";
import NeosConfig from "../../neos.config.json"; import { CardData, CardMeta, CardText } from "@/api/cards";
import { useConfig } from "@/config";
const NeosConfig = useConfig();
export enum sqliteCmd { export enum sqliteCmd {
// 初始化 // 初始化
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* */ * */
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { RootState } from "@/store"; import { RootState } from "@/store";
export interface chatState { export interface chatState {
......
import { judgeSelf } from "./util";
import { import {
PayloadAction,
CaseReducer,
ActionReducerMapBuilder, ActionReducerMapBuilder,
CaseReducer,
PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { DuelState } from "./mod";
import { RootState } from "@/store";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store";
import { import {
createAsyncMetaThunk, createAsyncMetaThunk,
DuelFieldState, DuelFieldState,
extendState,
extendMeta,
removeCard,
DuelReducer, DuelReducer,
Interactivity,
extendIdleInteractivities, extendIdleInteractivities,
extendMeta,
extendState,
Interactivity,
removeCard,
} from "./generic"; } from "./generic";
import { DuelState } from "./mod";
import { judgeSelf } from "./util";
export interface ExclusionState extends DuelFieldState {} export interface BanishedZoneState extends DuelFieldState {}
// 初始化除外区状态 // 初始化除外区状态
export const initExclusionImpl: CaseReducer< export const initBanishedZoneImpl: CaseReducer<
DuelState, DuelState,
PayloadAction<number> PayloadAction<number>
> = (state, action) => { > = (state, action) => {
const player = action.payload; const player = action.payload;
if (judgeSelf(player, state)) { if (judgeSelf(player, state)) {
state.meExclusion = { inner: [] }; state.meBanishedZone = { inner: [] };
} else { } else {
state.opExclusion = { inner: [] }; state.opBanishedZone = { inner: [] };
} }
}; };
// 增加除外区 // 增加除外区
export const fetchExclusionMeta = createAsyncMetaThunk( export const fetchBanishedZoneMeta = createAsyncMetaThunk(
"duel/fetchExclusionMeta" "duel/fetchBanishedZoneMeta"
); );
export const exclusionCase = (builder: ActionReducerMapBuilder<DuelState>) => { export const banishedZoneCase = (
builder.addCase(fetchExclusionMeta.pending, (state, action) => { builder: ActionReducerMapBuilder<DuelState>
) => {
builder.addCase(fetchBanishedZoneMeta.pending, (state, action) => {
// Meta结果没返回之前先更新`ID` // Meta结果没返回之前先更新`ID`
const controler = action.meta.arg.controler; const controler = action.meta.arg.controler;
const sequence = action.meta.arg.sequence; const sequence = action.meta.arg.sequence;
...@@ -56,51 +60,51 @@ export const exclusionCase = (builder: ActionReducerMapBuilder<DuelState>) => { ...@@ -56,51 +60,51 @@ export const exclusionCase = (builder: ActionReducerMapBuilder<DuelState>) => {
counters: {}, counters: {},
}; };
if (judgeSelf(controler, state)) { if (judgeSelf(controler, state)) {
extendState(state.meExclusion, newExclusion); extendState(state.meBanishedZone, newExclusion);
} else { } else {
extendState(state.opExclusion, newExclusion); extendState(state.opBanishedZone, newExclusion);
} }
}); });
builder.addCase(fetchExclusionMeta.fulfilled, (state, action) => { builder.addCase(fetchBanishedZoneMeta.fulfilled, (state, action) => {
const controler = action.payload.controler; const controler = action.payload.controler;
const sequence = action.payload.sequence; const sequence = action.payload.sequence;
const meta = action.payload.meta; const meta = action.payload.meta;
if (judgeSelf(controler, state)) { if (judgeSelf(controler, state)) {
extendMeta(state.meExclusion, meta, sequence); extendMeta(state.meBanishedZone, meta, sequence);
} else { } else {
extendMeta(state.opExclusion, meta, sequence); extendMeta(state.opBanishedZone, meta, sequence);
} }
}); });
}; };
// 删除除外区 // 删除除外区
export const removeExclusionImpl: CaseReducer< export const removeBanishedZoneImpl: CaseReducer<
DuelState, DuelState,
PayloadAction<{ controler: number; sequence: number }> PayloadAction<{ controler: number; sequence: number }>
> = (state, action) => { > = (state, action) => {
const exclusion = judgeSelf(action.payload.controler, state) const banishedZone = judgeSelf(action.payload.controler, state)
? state.meExclusion ? state.meBanishedZone
: state.opExclusion; : state.opBanishedZone;
removeCard(exclusion, action.payload.sequence); removeCard(banishedZone, action.payload.sequence);
}; };
export const addExclusionIdleInteractivitiesImpl: DuelReducer<{ export const addBanishedZoneIdleInteractivitiesImpl: DuelReducer<{
player: number; player: number;
sequence: number; sequence: number;
interactivity: Interactivity<number>; interactivity: Interactivity<number>;
}> = (state, action) => { }> = (state, action) => {
const exclusion = judgeSelf(action.payload.player, state) const banishedZone = judgeSelf(action.payload.player, state)
? state.meExclusion ? state.meBanishedZone
: state.opExclusion; : state.opBanishedZone;
extendIdleInteractivities( extendIdleInteractivities(
exclusion, banishedZone,
action.payload.sequence, action.payload.sequence,
action.payload.interactivity action.payload.interactivity
); );
}; };
export const selectMeExclusion = (state: RootState) => export const selectMeBanishedZone = (state: RootState) =>
state.duel.meExclusion || { inner: [] }; state.duel.meBanishedZone || { inner: [] };
export const selectopExclusion = (state: RootState) => export const selectOpBanishedZone = (state: RootState) =>
state.duel.opExclusion || { inner: [] }; state.duel.opBanishedZone || { inner: [] };
import { judgeSelf } from "./util";
import { import {
PayloadAction,
CaseReducer,
ActionReducerMapBuilder, ActionReducerMapBuilder,
CaseReducer,
PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { DuelState } from "./mod";
import { RootState } from "@/store";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store";
import { import {
createAsyncMetaThunk, createAsyncMetaThunk,
DuelFieldState, DuelFieldState,
extendState,
extendMeta,
removeCard,
DuelReducer, DuelReducer,
Interactivity,
extendIdleInteractivities, extendIdleInteractivities,
extendMeta,
extendState,
Interactivity,
removeCard,
} from "./generic"; } from "./generic";
import { DuelState } from "./mod";
import { judgeSelf } from "./util";
export interface CemeteryState extends DuelFieldState {} export interface GraveyardState extends DuelFieldState {}
// 初始化墓地状态 // 初始化墓地状态
export const initCemeteryImpl: CaseReducer<DuelState, PayloadAction<number>> = ( export const initGraveyardImpl: CaseReducer<
state, DuelState,
action PayloadAction<number>
) => { > = (state, action) => {
const player = action.payload; const player = action.payload;
if (judgeSelf(player, state)) { if (judgeSelf(player, state)) {
state.meCemetery = { inner: [] }; state.meGraveyard = { inner: [] };
} else { } else {
state.opCemetery = { inner: [] }; state.opGraveyard = { inner: [] };
} }
}; };
// 增加墓地 // 增加墓地
export const fetchCemeteryMeta = createAsyncMetaThunk("duel/fetchCemeteryMeta"); export const fetchGraveyardMeta = createAsyncMetaThunk(
"duel/fetchGraveyardMeta"
);
export const cemeteryCase = (builder: ActionReducerMapBuilder<DuelState>) => { export const graveyardCase = (builder: ActionReducerMapBuilder<DuelState>) => {
builder.addCase(fetchCemeteryMeta.pending, (state, action) => { builder.addCase(fetchGraveyardMeta.pending, (state, action) => {
// Meta结果没返回之前先更新`ID` // Meta结果没返回之前先更新`ID`
const controler = action.meta.arg.controler; const controler = action.meta.arg.controler;
const sequence = action.meta.arg.sequence; const sequence = action.meta.arg.sequence;
const code = action.meta.arg.code; const code = action.meta.arg.code;
const newCemetery = { const newGraveyard = {
occupant: { id: code, data: {}, text: {} }, occupant: { id: code, data: {}, text: {} },
location: { location: {
controler, controler,
...@@ -54,51 +58,51 @@ export const cemeteryCase = (builder: ActionReducerMapBuilder<DuelState>) => { ...@@ -54,51 +58,51 @@ export const cemeteryCase = (builder: ActionReducerMapBuilder<DuelState>) => {
counters: {}, counters: {},
}; };
if (judgeSelf(controler, state)) { if (judgeSelf(controler, state)) {
extendState(state.meCemetery, newCemetery); extendState(state.meGraveyard, newGraveyard);
} else { } else {
extendState(state.opCemetery, newCemetery); extendState(state.opGraveyard, newGraveyard);
} }
}); });
builder.addCase(fetchCemeteryMeta.fulfilled, (state, action) => { builder.addCase(fetchGraveyardMeta.fulfilled, (state, action) => {
const controler = action.payload.controler; const controler = action.payload.controler;
const sequence = action.payload.sequence; const sequence = action.payload.sequence;
const meta = action.payload.meta; const meta = action.payload.meta;
if (judgeSelf(controler, state)) { if (judgeSelf(controler, state)) {
extendMeta(state.meCemetery, meta, sequence); extendMeta(state.meGraveyard, meta, sequence);
} else { } else {
extendMeta(state.opCemetery, meta, sequence); extendMeta(state.opGraveyard, meta, sequence);
} }
}); });
}; };
// 删除墓地 // 删除墓地
export const removeCemeteryImpl: CaseReducer< export const removeGraveyardImpl: CaseReducer<
DuelState, DuelState,
PayloadAction<{ controler: number; sequence: number }> PayloadAction<{ controler: number; sequence: number }>
> = (state, action) => { > = (state, action) => {
const cemetery = judgeSelf(action.payload.controler, state) const graveyard = judgeSelf(action.payload.controler, state)
? state.meCemetery ? state.meGraveyard
: state.opCemetery; : state.opGraveyard;
removeCard(cemetery, action.payload.sequence); removeCard(graveyard, action.payload.sequence);
}; };
export const addCemeteryIdleInteractivitiesImpl: DuelReducer<{ export const addGraveyardIdleInteractivitiesImpl: DuelReducer<{
player: number; player: number;
sequence: number; sequence: number;
interactivity: Interactivity<number>; interactivity: Interactivity<number>;
}> = (state, action) => { }> = (state, action) => {
const cemetery = judgeSelf(action.payload.player, state) const graveyard = judgeSelf(action.payload.player, state)
? state.meCemetery ? state.meGraveyard
: state.opCemetery; : state.opGraveyard;
extendIdleInteractivities( extendIdleInteractivities(
cemetery, graveyard,
action.payload.sequence, action.payload.sequence,
action.payload.interactivity action.payload.interactivity
); );
}; };
export const selectMeCemetery = (state: RootState) => export const selectMeGraveyard = (state: RootState) =>
state.duel.meCemetery || { inner: [] }; state.duel.meGraveyard || { inner: [] };
export const selectOpCemetery = (state: RootState) => export const selectOpGraveyard = (state: RootState) =>
state.duel.opCemetery || { inner: [] }; state.duel.opGraveyard || { inner: [] };
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { import {
clearIdleInteractivities, clearIdleInteractivities,
clearPlaceInteractivities, clearPlaceInteractivities,
...@@ -23,16 +24,16 @@ export const clearAllIdleInteractivitiesImpl: DuelReducer<number> = ( ...@@ -23,16 +24,16 @@ export const clearAllIdleInteractivitiesImpl: DuelReducer<number> = (
state.meHands, state.meHands,
state.meMonsters, state.meMonsters,
state.meMagics, state.meMagics,
state.meCemetery, state.meGraveyard,
state.meExclusion, state.meBanishedZone,
state.meExtraDeck, state.meExtraDeck,
] ]
: [ : [
state.opHands, state.opHands,
state.opMonsters, state.opMonsters,
state.opMagics, state.opMagics,
state.opCemetery, state.opGraveyard,
state.opExclusion, state.opBanishedZone,
state.opExtraDeck, state.opExtraDeck,
]; ];
...@@ -50,15 +51,15 @@ export const clearAllPlaceInteractivitiesImpl: DuelReducer<number> = ( ...@@ -50,15 +51,15 @@ export const clearAllPlaceInteractivitiesImpl: DuelReducer<number> = (
state.meHands, state.meHands,
state.meMonsters, state.meMonsters,
state.meMagics, state.meMagics,
state.meCemetery, state.meGraveyard,
state.meExclusion, state.meBanishedZone,
] ]
: [ : [
state.opHands, state.opHands,
state.opMonsters, state.opMonsters,
state.opMagics, state.opMagics,
state.opCemetery, state.opGraveyard,
state.opExclusion, state.opBanishedZone,
]; ];
states.forEach((item) => clearPlaceInteractivities(item)); states.forEach((item) => clearPlaceInteractivities(item));
...@@ -105,18 +106,18 @@ export const updateFieldDataImpl: DuelReducer<MsgUpdateData> = ( ...@@ -105,18 +106,18 @@ export const updateFieldDataImpl: DuelReducer<MsgUpdateData> = (
break; break;
} }
case ygopro.CardZone.GRAVE: { case ygopro.CardZone.GRAVE: {
const cemetery = judgeSelf(player, state) const graveyard = judgeSelf(player, state)
? state.meCemetery ? state.meGraveyard
: state.opCemetery; : state.opGraveyard;
updateCardData(cemetery, actions); updateCardData(graveyard, actions);
break; break;
} }
case ygopro.CardZone.REMOVED: { case ygopro.CardZone.REMOVED: {
const exclusion = judgeSelf(player, state) const BanishedZone = judgeSelf(player, state)
? state.meExclusion ? state.meBanishedZone
: state.opExclusion; : state.opBanishedZone;
updateCardData(exclusion, actions); updateCardData(BanishedZone, actions);
break; break;
} }
...@@ -139,10 +140,10 @@ export const reloadFieldImpl: DuelReducer<MsgReloadField> = (state, action) => { ...@@ -139,10 +140,10 @@ export const reloadFieldImpl: DuelReducer<MsgReloadField> = (state, action) => {
state.opMonsters = { inner: [] }; state.opMonsters = { inner: [] };
state.meMagics = { inner: [] }; state.meMagics = { inner: [] };
state.opMagics = { inner: [] }; state.opMagics = { inner: [] };
state.meCemetery = { inner: [] }; state.meGraveyard = { inner: [] };
state.opCemetery = { inner: [] }; state.opGraveyard = { inner: [] };
state.meExclusion = { inner: [] }; state.meBanishedZone = { inner: [] };
state.opExclusion = { inner: [] }; state.opBanishedZone = { inner: [] };
state.meHands = { inner: [] }; state.meHands = { inner: [] };
state.opHands = { inner: [] }; state.opHands = { inner: [] };
...@@ -182,20 +183,20 @@ export const reloadFieldImpl: DuelReducer<MsgReloadField> = (state, action) => { ...@@ -182,20 +183,20 @@ export const reloadFieldImpl: DuelReducer<MsgReloadField> = (state, action) => {
player player
); );
// GRAVE // GRAVE
const cemetery = judgeSelf(player, state) const graveyard = judgeSelf(player, state)
? state.meCemetery ? state.meGraveyard
: state.opCemetery; : state.opGraveyard;
reloadFieldMeta( reloadFieldMeta(
cemetery, graveyard,
reload.zone_actions.filter((item) => item.zone == ygopro.CardZone.GRAVE), reload.zone_actions.filter((item) => item.zone == ygopro.CardZone.GRAVE),
player player
); );
// REMOVED // REMOVED
const exclusion = judgeSelf(player, state) const banishedZone = judgeSelf(player, state)
? state.meExclusion ? state.meBanishedZone
: state.opExclusion; : state.opBanishedZone;
reloadFieldMeta( reloadFieldMeta(
exclusion, banishedZone,
reload.zone_actions.filter( reload.zone_actions.filter(
(item) => item.zone == ygopro.CardZone.REMOVED (item) => item.zone == ygopro.CardZone.REMOVED
), ),
......
import { judgeSelf } from "./util"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit";
import { DuelState } from "./mod";
import { RootState } from "@/store";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { DuelFieldState, CardState } from "./generic"; import { RootState } from "@/store";
import { CardState, DuelFieldState } from "./generic";
import { DuelState } from "./mod";
import { judgeSelf } from "./util";
export interface DeckState extends DuelFieldState {} export interface DeckState extends DuelFieldState {}
......
import { ActionReducerMapBuilder } from "@reduxjs/toolkit"; import { ActionReducerMapBuilder } from "@reduxjs/toolkit";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { import {
createAsyncMetaThunk, createAsyncMetaThunk,
createAsyncRepeatedMetaThunk, createAsyncRepeatedMetaThunk,
......
...@@ -4,8 +4,10 @@ import { ...@@ -4,8 +4,10 @@ import {
createAsyncThunk, createAsyncThunk,
PayloadAction, PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { CardMeta, fetchCard } from "@/api/cards"; import { CardMeta, fetchCard } from "@/api/cards";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { DuelState } from "./mod"; import { DuelState } from "./mod";
import ReloadFieldAction = ygopro.StocGameMessage.MsgReloadField.ZoneAction; import ReloadFieldAction = ygopro.StocGameMessage.MsgReloadField.ZoneAction;
type UpdateDataAction = ReturnType< type UpdateDataAction = ReturnType<
......
...@@ -3,20 +3,22 @@ import { ...@@ -3,20 +3,22 @@ import {
CaseReducer, CaseReducer,
PayloadAction, PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { DuelState } from "./mod";
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { judgeSelf } from "./util";
import { import {
Interactivity,
DuelFieldState,
removeCard,
createAsyncMetaThunk, createAsyncMetaThunk,
insertCard,
extendMeta,
createAsyncRepeatedMetaThunk, createAsyncRepeatedMetaThunk,
DuelFieldState,
extendMeta,
insertCard,
Interactivity,
removeCard,
updateCardMeta, updateCardMeta,
} from "./generic"; } from "./generic";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { DuelState } from "./mod";
import { judgeSelf } from "./util";
export interface HandState extends DuelFieldState {} export interface HandState extends DuelFieldState {}
......
import { createAsyncThunk, ActionReducerMapBuilder } from "@reduxjs/toolkit"; import { ActionReducerMapBuilder, createAsyncThunk } from "@reduxjs/toolkit";
import { DuelState } from "./mod";
import { RootState } from "@/store";
import { DESCRIPTION_LIMIT, fetchStrings, getStrings } from "@/api/strings";
import { findCardByLocation } from "./util";
import { fetchCard } from "@/api/cards"; import { fetchCard } from "@/api/cards";
import { DuelReducer } from "./generic";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { DESCRIPTION_LIMIT, fetchStrings, getStrings } from "@/api/strings";
import { RootState } from "@/store";
import { DuelReducer } from "./generic";
import { DuelState } from "./mod";
import { findCardByLocation } from "./util";
export interface HintState { export interface HintState {
code: number; code: number;
......
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "./mod"; import { DuelState } from "./mod";
import { judgeSelf } from "./util"; import { judgeSelf } from "./util";
import MsgUpdateHp = ygopro.StocGameMessage.MsgUpdateHp; import MsgUpdateHp = ygopro.StocGameMessage.MsgUpdateHp;
......
import { judgeSelf } from "./util";
import { import {
PayloadAction,
CaseReducer,
ActionReducerMapBuilder, ActionReducerMapBuilder,
CaseReducer,
PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
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 { import {
clearIdleInteractivities,
clearPlaceInteractivities,
createAsyncMetaThunk, createAsyncMetaThunk,
DuelFieldState, DuelFieldState,
extendIdleInteractivities,
extendOccupant, extendOccupant,
extendPlaceInteractivity, extendPlaceInteractivity,
clearPlaceInteractivities,
removeOccupant,
Interactivity, Interactivity,
extendIdleInteractivities, removeOccupant,
clearIdleInteractivities,
setPosition, setPosition,
} from "./generic"; } from "./generic";
import { DuelState } from "./mod";
import { judgeSelf } from "./util";
export interface MagicState extends DuelFieldState {} export interface MagicState extends DuelFieldState {}
......
...@@ -3,121 +3,123 @@ ...@@ -3,121 +3,123 @@
* *
* */ * */
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { InitInfo, infoInitImpl, updateHpImpl } from "./initInfoSlice";
import { TimeLimit, updateTimeLimitImpl } from "./timeLimit"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store";
import {
addBanishedZoneIdleInteractivitiesImpl,
banishedZoneCase,
BanishedZoneState,
initBanishedZoneImpl,
removeBanishedZoneImpl,
} from "./banishedZoneSlice";
import {
addGraveyardIdleInteractivitiesImpl,
graveyardCase,
GraveyardState,
initGraveyardImpl,
removeGraveyardImpl,
} from "./cemeretySlice";
import {
clearAllIdleInteractivitiesImpl,
clearAllPlaceInteractivitiesImpl,
reloadFieldImpl,
updateFieldDataImpl,
} from "./commonSlice";
import { DeckState, initDeckImpl } from "./deckSlice";
import {
addExtraDeckIdleInteractivitiesImpl,
extraDeckCase,
ExtraDeckState,
removeExtraDeckImpl,
} from "./extraDeckSlice";
import { import {
HandState,
handsCase,
clearHandsIdleInteractivityImpl,
addHandsIdleInteractivityImpl, addHandsIdleInteractivityImpl,
clearHandsIdleInteractivityImpl,
handsCase,
HandState,
removeHandImpl, removeHandImpl,
} from "./handsSlice"; } from "./handsSlice";
import { newTurnImpl } from "./turnSlice"; import { hintCase, HintState, initHintImpl } from "./hintSlice";
import { infoInitImpl, InitInfo, updateHpImpl } from "./initInfoSlice";
import { import {
newPhaseImpl, addMagicIdleInteractivitiesImpl,
PhaseState, addMagicPlaceInteractivitiesImpl,
setEnableBpImpl, clearMagicIdleInteractivitiesImpl,
setEnableM2Impl, clearMagicPlaceInteractivitiesImpl,
setEnableEpImpl, initMagicsImpl,
} from "./phaseSlice"; magicCase,
import { RootState } from "@/store"; MagicState,
import { HintState, hintCase, initHintImpl } from "./hintSlice"; removeMagicImpl,
setMagicPositionImpl,
} from "./magicSlice";
import { import {
checkCardModalCase,
checkCardModalV2Case,
checkCardModalV3Case,
clearCheckCounterImpl,
ModalState, ModalState,
optionModalCase,
resetCheckCardModalImpl,
resetCheckCardModalV2Impl,
resetCheckCardModalV3Impl,
resetOptionModalImpl,
resetPositionModalImpl,
resetSortCardModalImpl,
setCardListModalInfoImpl,
setCardListModalIsOpenImpl,
setCardModalCountersImpl,
setCardModalInteractiviesImpl,
setCardModalIsOpenImpl, setCardModalIsOpenImpl,
setCardModalMetaImpl, setCardModalMetaImpl,
setCardModalInteractiviesImpl, setCheckCardMOdalCancelAbleImpl,
setCardListModalIsOpenImpl, setCheckCardModalCancelResponseImpl,
setCardListModalInfoImpl,
setCheckCardModalIsOpenImpl, setCheckCardModalIsOpenImpl,
setCheckCardModalMinMaxImpl, setCheckCardModalMinMaxImpl,
setCheckCardModalOnSubmitImpl, setCheckCardModalOnSubmitImpl,
setCheckCardMOdalCancelAbleImpl,
setCheckCardModalCancelResponseImpl,
resetCheckCardModalImpl,
setYesNoModalIsOpenImpl,
checkCardModalCase,
YesNoModalCase,
setPositionModalIsOpenImpl,
setPositionModalPositionsImpl,
resetPositionModalImpl,
setOptionModalIsOpenImpl,
resetOptionModalImpl,
optionModalCase,
setCheckCardModalV2IsOpenImpl,
setCheckCardModalV2CancelAbleImpl, setCheckCardModalV2CancelAbleImpl,
setCheckCardModalV2MinMaxImpl,
setCheckCardModalV2FinishAbleImpl, setCheckCardModalV2FinishAbleImpl,
resetCheckCardModalV2Impl, setCheckCardModalV2IsOpenImpl,
setCheckCardModalV2MinMaxImpl,
setCheckCardModalV2ResponseAbleImpl, setCheckCardModalV2ResponseAbleImpl,
checkCardModalV2Case, setCheckCardModalV3AllLevelImpl,
setCheckCardModalV3IsOpenImpl, setCheckCardModalV3IsOpenImpl,
setCheckCardModalV3MinMaxImpl, setCheckCardModalV3MinMaxImpl,
setCheckCardModalV3AllLevelImpl,
setCheckCardModalV3OverFlowImpl, setCheckCardModalV3OverFlowImpl,
setCheckCardModalV3ResponseAbleImpl, setCheckCardModalV3ResponseAbleImpl,
resetCheckCardModalV3Impl,
checkCardModalV3Case,
setCardModalCountersImpl,
setCheckCounterImpl, setCheckCounterImpl,
clearCheckCounterImpl, setOptionModalIsOpenImpl,
setPositionModalIsOpenImpl,
setPositionModalPositionsImpl,
setSortCardModalIsOpenImpl, setSortCardModalIsOpenImpl,
resetSortCardModalImpl, setYesNoModalIsOpenImpl,
sortCardModalCase, sortCardModalCase,
YesNoModalCase,
} from "./modal/mod"; } from "./modal/mod";
import { import {
MonsterState,
initMonstersImpl,
addMonsterPlaceInteractivitiesImpl,
clearMonsterPlaceInteractivitiesImpl,
addMonsterIdleInteractivitiesImpl, addMonsterIdleInteractivitiesImpl,
addMonsterPlaceInteractivitiesImpl,
clearMonsterIdleInteractivitiesImpl, clearMonsterIdleInteractivitiesImpl,
clearMonsterPlaceInteractivitiesImpl,
initMonstersImpl,
monsterCase,
MonsterState,
removeMonsterImpl, removeMonsterImpl,
setMonsterPositionImpl,
removeOverlayImpl, removeOverlayImpl,
setMonsterPositionImpl,
updateMonsterCountersImpl, updateMonsterCountersImpl,
monsterCase,
} from "./monstersSlice"; } from "./monstersSlice";
import { import {
MagicState, newPhaseImpl,
initMagicsImpl, PhaseState,
addMagicPlaceInteractivitiesImpl, setEnableBpImpl,
clearMagicPlaceInteractivitiesImpl, setEnableEpImpl,
addMagicIdleInteractivitiesImpl, setEnableM2Impl,
clearMagicIdleInteractivitiesImpl, } from "./phaseSlice";
removeMagicImpl, import { TimeLimit, updateTimeLimitImpl } from "./timeLimit";
setMagicPositionImpl, import { newTurnImpl } from "./turnSlice";
magicCase,
} from "./magicSlice";
import {
CemeteryState,
initCemeteryImpl,
removeCemeteryImpl,
cemeteryCase,
addCemeteryIdleInteractivitiesImpl,
} from "./cemeretySlice";
import {
ExclusionState,
initExclusionImpl,
removeExclusionImpl,
exclusionCase,
addExclusionIdleInteractivitiesImpl,
} from "./exclusionSlice";
import { DeckState, initDeckImpl } from "./deckSlice";
import {
clearAllIdleInteractivitiesImpl,
clearAllPlaceInteractivitiesImpl,
updateFieldDataImpl,
reloadFieldImpl,
} from "./commonSlice";
import {
ExtraDeckState,
extraDeckCase,
removeExtraDeckImpl,
addExtraDeckIdleInteractivitiesImpl,
} from "./extraDeckSlice";
import MsgWin = ygopro.StocGameMessage.MsgWin; import MsgWin = ygopro.StocGameMessage.MsgWin;
export interface DuelState { export interface DuelState {
...@@ -134,11 +136,11 @@ export interface DuelState { ...@@ -134,11 +136,11 @@ export interface DuelState {
meMagics?: MagicState; // 自己的魔法陷阱区状态 meMagics?: MagicState; // 自己的魔法陷阱区状态
opMagics?: MagicState; // 对手的魔法陷阱区状态 opMagics?: MagicState; // 对手的魔法陷阱区状态
meCemetery?: CemeteryState; // 自己的墓地状态 meGraveyard?: GraveyardState; // 自己的墓地状态
opCemetery?: CemeteryState; // 对手的墓地状态 opGraveyard?: GraveyardState; // 对手的墓地状态
meExclusion?: ExclusionState; // 自己的除外区状态 meBanishedZone?: BanishedZoneState; // 自己的除外区状态
opExclusion?: ExclusionState; // 对手的除外区状态 opBanishedZone?: BanishedZoneState; // 对手的除外区状态
meDeck?: DeckState; // 自己的卡组状态 meDeck?: DeckState; // 自己的卡组状态
opDeck?: DeckState; // 对手的卡组状态 opDeck?: DeckState; // 对手的卡组状态
...@@ -237,14 +239,14 @@ const duelSlice = createSlice({ ...@@ -237,14 +239,14 @@ const duelSlice = createSlice({
removeMagic: removeMagicImpl, removeMagic: removeMagicImpl,
// 墓地相关`Reducer` // 墓地相关`Reducer`
initCemetery: initCemeteryImpl, initGraveyard: initGraveyardImpl,
removeCemetery: removeCemeteryImpl, removeGraveyard: removeGraveyardImpl,
addCemeteryIdleInteractivities: addCemeteryIdleInteractivitiesImpl, addGraveyardIdleInteractivities: addGraveyardIdleInteractivitiesImpl,
// 除外区相关`Reducer` // 除外区相关`Reducer`
initExclusion: initExclusionImpl, initBanishedZone: initBanishedZoneImpl,
removeExclusion: removeExclusionImpl, removeBanishedZone: removeBanishedZoneImpl,
addExclusionIdleInteractivities: addExclusionIdleInteractivitiesImpl, addBanishedZoneIdleInteractivities: addBanishedZoneIdleInteractivitiesImpl,
// 卡组相关`Reducer` // 卡组相关`Reducer`
initDeck: initDeckImpl, initDeck: initDeckImpl,
...@@ -324,8 +326,8 @@ const duelSlice = createSlice({ ...@@ -324,8 +326,8 @@ const duelSlice = createSlice({
hintCase(builder); hintCase(builder);
monsterCase(builder); monsterCase(builder);
magicCase(builder); magicCase(builder);
cemeteryCase(builder); graveyardCase(builder);
exclusionCase(builder); banishedZoneCase(builder);
extraDeckCase(builder); extraDeckCase(builder);
checkCardModalCase(builder); checkCardModalCase(builder);
YesNoModalCase(builder); YesNoModalCase(builder);
...@@ -368,9 +370,9 @@ export const { ...@@ -368,9 +370,9 @@ export const {
setMagicPosition, setMagicPosition,
removeMagic, removeMagic,
removeHand, removeHand,
initCemetery, initGraveyard,
removeCemetery, removeGraveyard,
addCemeteryIdleInteractivities, addGraveyardIdleInteractivities,
setCardListModalIsOpen, setCardListModalIsOpen,
setCardListModalInfo, setCardListModalInfo,
setCheckCardModalIsOpen, setCheckCardModalIsOpen,
...@@ -388,9 +390,9 @@ export const { ...@@ -388,9 +390,9 @@ export const {
initDeck, initDeck,
removeExtraDeck, removeExtraDeck,
addExtraDeckIdleInteractivities, addExtraDeckIdleInteractivities,
initExclusion, initBanishedZone,
removeExclusion, removeBanishedZone,
addExclusionIdleInteractivities, addBanishedZoneIdleInteractivities,
setCheckCardModalV2IsOpen, setCheckCardModalV2IsOpen,
setCheckCardModalV2MinMax, setCheckCardModalV2MinMax,
setCheckCardModalV2CancelAble, setCheckCardModalV2CancelAble,
......
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { DuelState } from "../mod";
import { RootState } from "@/store";
import { CardMeta } from "@/api/cards"; import { CardMeta } from "@/api/cards";
import { RootState } from "@/store";
import { DuelState } from "../mod";
// 更新卡牌列表弹窗打开状态 // 更新卡牌列表弹窗打开状态
export const setCardListModalIsOpenImpl: CaseReducer< export const setCardListModalIsOpenImpl: CaseReducer<
......
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { DuelState } from "../mod";
import { RootState } from "@/store";
import { CardMeta } from "@/api/cards"; import { CardMeta } from "@/api/cards";
import { RootState } from "@/store";
import { DuelState } from "../mod";
// 更新卡牌弹窗打开状态 // 更新卡牌弹窗打开状态
export const setCardModalIsOpenImpl: CaseReducer< export const setCardModalIsOpenImpl: CaseReducer<
......
import { import {
PayloadAction, ActionReducerMapBuilder,
CaseReducer, CaseReducer,
createAsyncThunk, createAsyncThunk,
ActionReducerMapBuilder, PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { fetchCard, getCardStr } from "@/api/cards";
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "../mod"; import { DuelState } from "../mod";
import { cmpCardLocation, findCardByLocation, judgeSelf } from "../util"; import { cmpCardLocation, findCardByLocation, judgeSelf } from "../util";
import { fetchCard, getCardStr } from "@/api/cards";
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
// 更新卡牌选择弹窗打开状态 // 更新卡牌选择弹窗打开状态
export const setCheckCardModalIsOpenImpl: CaseReducer< export const setCheckCardModalIsOpenImpl: CaseReducer<
......
import { DuelState } from "../mod";
import { DuelReducer } from "../generic";
import { import {
ActionReducerMapBuilder, ActionReducerMapBuilder,
CaseReducer, CaseReducer,
createAsyncThunk, createAsyncThunk,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { fetchCard } from "@/api/cards"; import { fetchCard } from "@/api/cards";
import { RootState } from "@/store";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store";
import { DuelReducer } from "../generic";
import { DuelState } from "../mod";
import { findCardByLocation } from "../util"; import { findCardByLocation } from "../util";
// 更新打开状态 // 更新打开状态
......
import { DuelState } from "../mod";
import { DuelReducer } from "../generic";
import { import {
ActionReducerMapBuilder, ActionReducerMapBuilder,
CaseReducer, CaseReducer,
createAsyncThunk, createAsyncThunk,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { fetchCard } from "@/api/cards"; import { fetchCard } from "@/api/cards";
import { RootState } from "@/store";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store";
import { DuelReducer } from "../generic";
import { DuelState } from "../mod";
import { findCardByLocation } from "../util"; import { findCardByLocation } from "../util";
// 更新打开状态 // 更新打开状态
......
// 后续对于`MSG_SELECT_XXX`的处理UI都尽量用`Babylon.js`实现而不会通过`Antd`的`Modal`实现,因此这里不追求工程质量,暂时简单实现下。 // 后续对于`MSG_SELECT_XXX`的处理UI都尽量用`Babylon.js`实现而不会通过`Antd`的`Modal`实现,因此这里不追求工程质量,暂时简单实现下。
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "../mod"; import { DuelState } from "../mod";
import { findCardByLocation } from "../util"; import { findCardByLocation } from "../util";
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
type SelectCounter = ReturnType< type SelectCounter = ReturnType<
typeof ygopro.StocGameMessage.MsgSelectCounter.prototype.toObject typeof ygopro.StocGameMessage.MsgSelectCounter.prototype.toObject
>; >;
......
...@@ -114,13 +114,13 @@ export interface ModalState { ...@@ -114,13 +114,13 @@ export interface ModalState {
}; };
} }
export * from "./cardModalSlice";
export * from "./cardListModalSlice"; export * from "./cardListModalSlice";
export * from "./cardModalSlice";
export * from "./checkCardModalSlice"; export * from "./checkCardModalSlice";
export * from "./yesNoModalSlice";
export * from "./positionModalSlice";
export * from "./optionModalSlice";
export * from "./checkCardModalV2Slice"; export * from "./checkCardModalV2Slice";
export * from "./checkCardModalV3Slice"; export * from "./checkCardModalV3Slice";
export * from "./checkCounterModalSlice"; export * from "./checkCounterModalSlice";
export * from "./optionModalSlice";
export * from "./positionModalSlice";
export * from "./sortCardModalSlice"; export * from "./sortCardModalSlice";
export * from "./yesNoModalSlice";
import { import {
PayloadAction, ActionReducerMapBuilder,
CaseReducer, CaseReducer,
createAsyncThunk, createAsyncThunk,
ActionReducerMapBuilder, PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { DuelState } from "../mod";
import { fetchCard, getCardStr } from "@/api/cards"; import { fetchCard, getCardStr } from "@/api/cards";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "../mod";
export const setOptionModalIsOpenImpl: CaseReducer< export const setOptionModalIsOpenImpl: CaseReducer<
DuelState, DuelState,
PayloadAction<boolean> PayloadAction<boolean>
......
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "../mod"; import { DuelState } from "../mod";
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
export const setPositionModalIsOpenImpl: CaseReducer< export const setPositionModalIsOpenImpl: CaseReducer<
DuelState, DuelState,
......
...@@ -3,9 +3,11 @@ import { ...@@ -3,9 +3,11 @@ import {
CaseReducer, CaseReducer,
createAsyncThunk, createAsyncThunk,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { fetchCard } from "@/api/cards"; import { fetchCard } from "@/api/cards";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelReducer } from "../generic"; import { DuelReducer } from "../generic";
import { DuelState } from "../mod"; import { DuelState } from "../mod";
type SortCard = ReturnType< type SortCard = ReturnType<
......
import { import {
PayloadAction, ActionReducerMapBuilder,
CaseReducer, CaseReducer,
createAsyncThunk, createAsyncThunk,
ActionReducerMapBuilder, PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { CardMeta, fetchCard } from "@/api/cards"; import { CardMeta, fetchCard } from "@/api/cards";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { fetchStrings, getStrings } from "@/api/strings"; import { fetchStrings, getStrings } from "@/api/strings";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "../mod"; import { DuelState } from "../mod";
// 更新YesNo弹窗是否打开状态 // 更新YesNo弹窗是否打开状态
......
import { judgeSelf } from "./util";
import { import {
PayloadAction,
CaseReducer,
ActionReducerMapBuilder, ActionReducerMapBuilder,
CaseReducer,
createAsyncThunk, createAsyncThunk,
PayloadAction,
} from "@reduxjs/toolkit"; } from "@reduxjs/toolkit";
import { DuelState } from "./mod";
import { fetchCard } from "@/api/cards";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { import {
DuelFieldState, clearIdleInteractivities,
Interactivity, clearPlaceInteractivities,
createAsyncMetaThunk, createAsyncMetaThunk,
DuelFieldState,
extendIdleInteractivities,
extendOccupant, extendOccupant,
extendPlaceInteractivity, extendPlaceInteractivity,
clearPlaceInteractivities, Interactivity,
removeOccupant, removeOccupant,
extendIdleInteractivities,
clearIdleInteractivities,
setPosition,
removeOverlay, removeOverlay,
setPosition,
} from "./generic"; } from "./generic";
import { fetchCard } from "@/api/cards"; import { DuelState } from "./mod";
import { judgeSelf } from "./util";
type MsgUpdateCounter = ReturnType< type MsgUpdateCounter = ReturnType<
typeof ygopro.StocGameMessage.MsgUpdateCounter.prototype.toObject typeof ygopro.StocGameMessage.MsgUpdateCounter.prototype.toObject
>; >;
......
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "./mod"; import { DuelState } from "./mod";
export interface PhaseState { export interface PhaseState {
......
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { DuelState } from "./mod"; import { DuelState } from "./mod";
import { judgeSelf } from "./util"; import { judgeSelf } from "./util";
......
import { PayloadAction, CaseReducer } from "@reduxjs/toolkit"; import { CaseReducer, PayloadAction } from "@reduxjs/toolkit";
import { RootState } from "@/store"; import { RootState } from "@/store";
import { DuelState } from "./mod"; import { DuelState } from "./mod";
import { judgeSelf } from "./util"; import { judgeSelf } from "./util";
......
...@@ -3,10 +3,12 @@ ...@@ -3,10 +3,12 @@
* *
* */ * */
import { DuelState } from "./mod";
import { Draft } from "@reduxjs/toolkit"; import { Draft } from "@reduxjs/toolkit";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { CardState } from "./generic"; import { CardState } from "./generic";
import { DuelState } from "./mod";
type Location = type Location =
| ygopro.CardLocation | ygopro.CardLocation
...@@ -59,15 +61,15 @@ export function findCardByLocation( ...@@ -59,15 +61,15 @@ export function findCardByLocation(
return magics?.inner.find(finder); return magics?.inner.find(finder);
} }
case ygopro.CardZone.REMOVED: { case ygopro.CardZone.REMOVED: {
const exclusions = judgeSelf(controler, state) const banishedZones = judgeSelf(controler, state)
? state.meExclusion ? state.meBanishedZone
: state.opExclusion; : state.opBanishedZone;
return exclusions?.inner.find(finder); return banishedZones?.inner.find(finder);
} }
case ygopro.CardZone.GRAVE: { case ygopro.CardZone.GRAVE: {
const cemerety = judgeSelf(controler, state) const cemerety = judgeSelf(controler, state)
? state.meCemetery ? state.meGraveyard
: state.opCemetery; : state.opGraveyard;
return cemerety?.inner.find(finder); return cemerety?.inner.find(finder);
} }
default: { default: {
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* */ * */
import { createSlice } from "@reduxjs/toolkit"; import { createSlice } from "@reduxjs/toolkit";
import { RootState } from "@/store"; import { RootState } from "@/store";
export interface JoinState { export interface JoinState {
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* */ * */
import { createSlice } from "@reduxjs/toolkit"; import { createSlice } from "@reduxjs/toolkit";
import { RootState } from "@/store"; import { RootState } from "@/store";
export interface moraState { export interface moraState {
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* */ * */
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { RootState } from "@/store"; import { RootState } from "@/store";
export interface Player { export interface Player {
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store";
import { fetchHandsMeta } from "@/reducers/duel/handsSlice"; import { fetchHandsMeta } from "@/reducers/duel/handsSlice";
import { fetchEsHintMeta } from "@/reducers/duel/hintSlice"; import { fetchEsHintMeta } from "@/reducers/duel/hintSlice";
import { AppDispatch } from "@/store";
export default ( export default (
draw: ygopro.StocGameMessage.MsgDraw, draw: ygopro.StocGameMessage.MsgDraw,
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { setWaiting } from "@/reducers/duel/mod";
import { store } from "@/store"; import { store } from "@/store";
import onMsgStart from "./start";
import onMsgAttack from "./attack";
import onMsgAttackDisable from "./attackDisable";
import onMsgChaining from "./chaining";
import onMsgDraw from "./draw"; import onMsgDraw from "./draw";
import onMsgNewTurn from "./newTurn"; import onMsgFilpSummoned from "./flipSummoned";
import onMsgNewPhase from "./newPhase"; import onMsgFlipSummoning from "./flipSummoning";
import onMsgHint from "./hint"; import onMsgHint from "./hint";
import onMsgSelectIdleCmd from "./selectIdleCmd";
import onMsgSelectPlace from "./selectPlace";
import onMsgMove from "./move"; import onMsgMove from "./move";
import onMsgNewPhase from "./newPhase";
import onMsgNewTurn from "./newTurn";
import onMsgPosChange from "./posChange";
import onMsgReloadField from "./reloadField";
import onMsgSelectBattleCmd from "./selectBattleCmd";
import onMsgSelectCard from "./selectCard"; import onMsgSelectCard from "./selectCard";
import onMsgSelectChain from "./selectChain"; import onMsgSelectChain from "./selectChain";
import onMsgSelectCounter from "./selectCounter";
import onMsgSelectEffectYn from "./selectEffectYn"; import onMsgSelectEffectYn from "./selectEffectYn";
import onMsgSelectPosition from "./selectPosition"; import onMsgSelectIdleCmd from "./selectIdleCmd";
import onMsgSelectOption from "./selectOption"; import onMsgSelectOption from "./selectOption";
import onMsgShuffleHand from "./shuffleHand"; import onMsgSelectPlace from "./selectPlace";
import onMsgSelectBattleCmd from "./selectBattleCmd"; import onMsgSelectPosition from "./selectPosition";
import onMsgPosChange from "./posChange";
import onMsgSelectUnselectCard from "./selectUnselectCard";
import onMsgSelectYesNo from "./selectYesNo";
import onMsgUpdateHp from "./updateHp";
import onMsgWin from "./win";
import onMsgWait from "./wait";
import onUnimplemented from "./unimplemented";
import onMsgUpdateData from "./updateData";
import onMsgReloadField from "./reloadField";
import onMsgSelectSum from "./selectSum"; import onMsgSelectSum from "./selectSum";
import onMsgSelectTribute from "./selectTribute"; import onMsgSelectTribute from "./selectTribute";
import onMsgUpdateCounter from "./updateCounter"; import onMsgSelectUnselectCard from "./selectUnselectCard";
import onMsgSelectCounter from "./selectCounter"; import onMsgSelectYesNo from "./selectYesNo";
import onMsgSortCard from "./sortCard";
import onMsgSet from "./set"; import onMsgSet from "./set";
import onMsgSwap from "./swap"; import onMsgShuffleHand from "./shuffleHand";
import onMsgAttack from "./attack"; import onMsgSortCard from "./sortCard";
import onMsgAttackDisable from "./attackDisable";
import onMsgChaining from "./chaining";
import onMsgFlipSummoning from "./flipSummoning";
import onMsgFilpSummoned from "./flipSummoned";
import onMsgSpSummoning from "./spSummoning";
import onMsgSpSummoned from "./spSummoned"; import onMsgSpSummoned from "./spSummoned";
import onMsgSummoning from "./summoning"; import onMsgSpSummoning from "./spSummoning";
import onMsgStart from "./start";
import onMsgSummoned from "./summoned"; import onMsgSummoned from "./summoned";
import { setWaiting } from "@/reducers/duel/mod"; import onMsgSummoning from "./summoning";
import onMsgSwap from "./swap";
import onUnimplemented from "./unimplemented";
import onMsgUpdateCounter from "./updateCounter";
import onMsgUpdateData from "./updateData";
import onMsgUpdateHp from "./updateHp";
import onMsgWait from "./wait";
import onMsgWin from "./win";
const ActiveList = [ const ActiveList = [
"select_idle_cmd", "select_idle_cmd",
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store";
import { import {
fetchCommonHintMeta, fetchCommonHintMeta,
fetchEsHintMeta, fetchEsHintMeta,
fetchSelectHintMeta, fetchSelectHintMeta,
} from "@/reducers/duel/hintSlice"; } from "@/reducers/duel/hintSlice";
import { AppDispatch } from "@/store";
import MsgHint = ygopro.StocGameMessage.MsgHint; import MsgHint = ygopro.StocGameMessage.MsgHint;
export default (hint: MsgHint, dispatch: AppDispatch) => { export default (hint: MsgHint, dispatch: AppDispatch) => {
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import MsgMove = ygopro.StocGameMessage.MsgMove; import MsgMove = ygopro.StocGameMessage.MsgMove;
import { AppDispatch } from "@/store"; import { fetchBanishedZoneMeta } from "@/reducers/duel/banishedZoneSlice";
import { import { fetchGraveyardMeta } from "@/reducers/duel/cemeretySlice";
fetchMonsterMeta, import { fetchExtraDeckMeta } from "@/reducers/duel/extraDeckSlice";
fetchOverlayMeta, import { insertHandMeta } from "@/reducers/duel/handsSlice";
} from "@/reducers/duel/monstersSlice"; import { fetchMagicMeta } from "@/reducers/duel/magicSlice";
import { import {
removeCemetery, removeBanishedZone,
removeExclusion,
removeExtraDeck, removeExtraDeck,
removeGraveyard,
removeHand, removeHand,
removeMagic, removeMagic,
removeMonster, removeMonster,
removeOverlay, removeOverlay,
} from "@/reducers/duel/mod"; } from "@/reducers/duel/mod";
import { fetchMagicMeta } from "@/reducers/duel/magicSlice"; import {
import { fetchCemeteryMeta } from "@/reducers/duel/cemeretySlice"; fetchMonsterMeta,
import { insertHandMeta } from "@/reducers/duel/handsSlice"; fetchOverlayMeta,
import { fetchExclusionMeta } from "@/reducers/duel/exclusionSlice"; } from "@/reducers/duel/monstersSlice";
import { fetchExtraDeckMeta } from "@/reducers/duel/extraDeckSlice"; import { AppDispatch } from "@/store";
import { REASON_MATERIAL } from "../../common"; import { REASON_MATERIAL } from "../../common";
const OVERLAY_STACK: { code: number; sequence: number }[] = []; const OVERLAY_STACK: { code: number; sequence: number }[] = [];
...@@ -51,14 +52,17 @@ export default (move: MsgMove, dispatch: AppDispatch) => { ...@@ -51,14 +52,17 @@ export default (move: MsgMove, dispatch: AppDispatch) => {
} }
case ygopro.CardZone.GRAVE: { case ygopro.CardZone.GRAVE: {
dispatch( dispatch(
removeCemetery({ controler: from.controler, sequence: from.sequence }) removeGraveyard({ controler: from.controler, sequence: from.sequence })
); );
break; break;
} }
case ygopro.CardZone.REMOVED: { case ygopro.CardZone.REMOVED: {
dispatch( dispatch(
removeExclusion({ controler: from.controler, sequence: from.sequence }) removeBanishedZone({
controler: from.controler,
sequence: from.sequence,
})
); );
break; break;
...@@ -127,7 +131,7 @@ export default (move: MsgMove, dispatch: AppDispatch) => { ...@@ -127,7 +131,7 @@ export default (move: MsgMove, dispatch: AppDispatch) => {
} }
case ygopro.CardZone.GRAVE: { case ygopro.CardZone.GRAVE: {
dispatch( dispatch(
fetchCemeteryMeta({ fetchGraveyardMeta({
controler: to.controler, controler: to.controler,
sequence: to.sequence, sequence: to.sequence,
code, code,
...@@ -145,7 +149,7 @@ export default (move: MsgMove, dispatch: AppDispatch) => { ...@@ -145,7 +149,7 @@ export default (move: MsgMove, dispatch: AppDispatch) => {
} }
case ygopro.CardZone.REMOVED: { case ygopro.CardZone.REMOVED: {
dispatch( dispatch(
fetchExclusionMeta({ fetchBanishedZoneMeta({
controler: to.controler, controler: to.controler,
sequence: to.sequence, sequence: to.sequence,
code, code,
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store";
import { updatePhase } from "@/reducers/duel/mod"; import { updatePhase } from "@/reducers/duel/mod";
import { AppDispatch } from "@/store";
export default ( export default (
newPhase: ygopro.StocGameMessage.MsgNewPhase, newPhase: ygopro.StocGameMessage.MsgNewPhase,
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store";
import { updateTurn } from "@/reducers/duel/mod"; import { updateTurn } from "@/reducers/duel/mod";
import { AppDispatch } from "@/store";
export default ( export default (
newTurn: ygopro.StocGameMessage.MsgNewTurn, newTurn: ygopro.StocGameMessage.MsgNewTurn,
......
import { ActionCreatorWithPayload } from "@reduxjs/toolkit"; import { ActionCreatorWithPayload } from "@reduxjs/toolkit";
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { Interactivity, InteractType } from "@/reducers/duel/generic"; import { Interactivity, InteractType } from "@/reducers/duel/generic";
import { import {
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store";
import { import {
setCheckCardModalIsOpen, setCheckCardModalIsOpen,
setCheckCardModalMinMax, setCheckCardModalMinMax,
setCheckCardModalOnSubmit, setCheckCardModalOnSubmit,
} from "@/reducers/duel/mod"; } from "@/reducers/duel/mod";
import { fetchCheckCardMeta } from "@/reducers/duel/modal/mod"; import { fetchCheckCardMeta } from "@/reducers/duel/modal/mod";
import { AppDispatch } from "@/store";
import MsgSelectCard = ygopro.StocGameMessage.MsgSelectCard; import MsgSelectCard = ygopro.StocGameMessage.MsgSelectCard;
import { CardZoneToChinese } from "./util"; import { CardZoneToChinese } from "./util";
......
...@@ -10,6 +10,7 @@ import { ...@@ -10,6 +10,7 @@ import {
} from "@/reducers/duel/mod"; } from "@/reducers/duel/mod";
import { fetchCheckCardMeta } from "@/reducers/duel/modal/mod"; import { fetchCheckCardMeta } from "@/reducers/duel/modal/mod";
import { AppDispatch } from "@/store"; import { AppDispatch } from "@/store";
import { CardZoneToChinese } from "./util"; import { CardZoneToChinese } from "./util";
import MsgSelectChain = ygopro.StocGameMessage.MsgSelectChain; import MsgSelectChain = ygopro.StocGameMessage.MsgSelectChain;
......
...@@ -3,6 +3,7 @@ import { ygopro } from "@/api/ocgcore/idl/ocgcore"; ...@@ -3,6 +3,7 @@ import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { setYesNoModalIsOpen } from "@/reducers/duel/mod"; import { setYesNoModalIsOpen } from "@/reducers/duel/mod";
import { fetchYesNoMeta } from "@/reducers/duel/modal/mod"; import { fetchYesNoMeta } from "@/reducers/duel/modal/mod";
import { AppDispatch } from "@/store"; import { AppDispatch } from "@/store";
import { CardZoneToChinese } from "./util"; import { CardZoneToChinese } from "./util";
import MsgSelectEffectYn = ygopro.StocGameMessage.MsgSelectEffectYn; import MsgSelectEffectYn = ygopro.StocGameMessage.MsgSelectEffectYn;
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store";
import { Interactivity, InteractType } from "@/reducers/duel/generic"; import { Interactivity, InteractType } from "@/reducers/duel/generic";
import { import {
addBanishedZoneIdleInteractivities,
addExtraDeckIdleInteractivities,
addGraveyardIdleInteractivities,
addHandsIdleInteractivity, addHandsIdleInteractivity,
addMonsterIdleInteractivities,
addMagicIdleInteractivities, addMagicIdleInteractivities,
addMonsterIdleInteractivities,
clearAllIdleInteractivities,
setEnableBp, setEnableBp,
setEnableEp, setEnableEp,
addCemeteryIdleInteractivities,
clearAllIdleInteractivities,
addExclusionIdleInteractivities,
addExtraDeckIdleInteractivities,
} from "@/reducers/duel/mod"; } from "@/reducers/duel/mod";
import { AppDispatch } from "@/store";
import MsgSelectIdleCmd = ygopro.StocGameMessage.MsgSelectIdleCmd; import MsgSelectIdleCmd = ygopro.StocGameMessage.MsgSelectIdleCmd;
import { ActionCreatorWithPayload } from "@reduxjs/toolkit"; import { ActionCreatorWithPayload } from "@reduxjs/toolkit";
...@@ -83,12 +83,12 @@ export default (selectIdleCmd: MsgSelectIdleCmd, dispatch: AppDispatch) => { ...@@ -83,12 +83,12 @@ export default (selectIdleCmd: MsgSelectIdleCmd, dispatch: AppDispatch) => {
break; break;
} }
case ygopro.CardZone.GRAVE: { case ygopro.CardZone.GRAVE: {
dispatcher(data, interactType, addCemeteryIdleInteractivities); dispatcher(data, interactType, addGraveyardIdleInteractivities);
break; break;
} }
case ygopro.CardZone.REMOVED: { case ygopro.CardZone.REMOVED: {
dispatcher(data, interactType, addExclusionIdleInteractivities); dispatcher(data, interactType, addBanishedZoneIdleInteractivities);
break; break;
} }
......
...@@ -2,8 +2,8 @@ import { ygopro } from "@/api/ocgcore/idl/ocgcore"; ...@@ -2,8 +2,8 @@ import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store"; import { AppDispatch } from "@/store";
import MsgSelectPlace = ygopro.StocGameMessage.MsgSelectPlace; import MsgSelectPlace = ygopro.StocGameMessage.MsgSelectPlace;
import { import {
addMonsterPlaceInteractivities,
addMagicPlaceInteractivities, addMagicPlaceInteractivities,
addMonsterPlaceInteractivities,
} from "@/reducers/duel/mod"; } from "@/reducers/duel/mod";
export default (selectPlace: MsgSelectPlace, dispatch: AppDispatch) => { export default (selectPlace: MsgSelectPlace, dispatch: AppDispatch) => {
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { AppDispatch } from "@/store";
import { import {
infoInit, infoInit,
setSelfType, initBanishedZone,
initMonsters,
initMagics,
initCemetery,
initDeck, initDeck,
initExclusion, initGraveyard,
initHint, initHint,
initMagics,
initMonsters,
setSelfType,
} from "@/reducers/duel/mod"; } from "@/reducers/duel/mod";
import { AppDispatch } from "@/store";
export default ( export default (
start: ygopro.StocGameMessage.MsgStart, start: ygopro.StocGameMessage.MsgStart,
...@@ -40,11 +40,11 @@ export default ( ...@@ -40,11 +40,11 @@ export default (
dispatch(initMonsters(1)); dispatch(initMonsters(1));
dispatch(initMagics(0)); dispatch(initMagics(0));
dispatch(initMagics(1)); dispatch(initMagics(1));
dispatch(initCemetery(0)); dispatch(initGraveyard(0));
dispatch(initCemetery(1)); dispatch(initGraveyard(1));
dispatch(initDeck({ player: 0, deskSize: start.deckSize1 })); dispatch(initDeck({ player: 0, deskSize: start.deckSize1 }));
dispatch(initDeck({ player: 1, deskSize: start.deckSize2 })); dispatch(initDeck({ player: 1, deskSize: start.deckSize2 }));
dispatch(initExclusion(0)); dispatch(initBanishedZone(0));
dispatch(initExclusion(1)); dispatch(initBanishedZone(1));
dispatch(initHint()); dispatch(initHint());
}; };
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { store } from "@/store";
import { updateTimeLimit } from "@/reducers/duel/mod";
import { sendTimeConfirm } from "@/api/ocgcore/ocgHelper"; import { sendTimeConfirm } from "@/api/ocgcore/ocgHelper";
import { updateTimeLimit } from "@/reducers/duel/mod";
import { store } from "@/store";
export default function handleTimeLimit(timeLimit: ygopro.StocTimeLimit) { export default function handleTimeLimit(timeLimit: ygopro.StocTimeLimit) {
const dispatch = store.dispatch; const dispatch = store.dispatch;
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { useConfig } from "@/config";
import { setUnimplemented } from "@/reducers/duel/mod"; import { setUnimplemented } from "@/reducers/duel/mod";
import { AppDispatch } from "@/store"; import { AppDispatch } from "@/store";
import NeosConfig from "../../../neos.config.json";
const NeosConfig = useConfig();
export default ( export default (
unimplemented: ygopro.StocGameMessage.MsgUnimplemented, unimplemented: ygopro.StocGameMessage.MsgUnimplemented,
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { store } from "@/store";
import { player0DeckInfo, player1DeckInfo } from "@/reducers/playerSlice"; import { player0DeckInfo, player1DeckInfo } from "@/reducers/playerSlice";
import { store } from "@/store";
// FIXME: player0 不一定是当前玩家 // FIXME: player0 不一定是当前玩家
export default function handleDeckCount(pb: ygopro.YgoStocMsg) { export default function handleDeckCount(pb: ygopro.YgoStocMsg) {
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { store } from "@/store";
import { selectHandAble } from "@/reducers/moraSlice"; import { selectHandAble } from "@/reducers/moraSlice";
import { store } from "@/store";
export default function handleSelectHand(_: ygopro.YgoStocMsg) { export default function handleSelectHand(_: ygopro.YgoStocMsg) {
const dispatch = store.dispatch; const dispatch = store.dispatch;
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore"; import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import { store } from "@/store";
import { selectTpAble } from "@/reducers/moraSlice"; import { selectTpAble } from "@/reducers/moraSlice";
import { store } from "@/store";
export default function handleSelectTp(_: ygopro.YgoStocMsg) { export default function handleSelectTp(_: ygopro.YgoStocMsg) {
const dispatch = store.dispatch; const dispatch = store.dispatch;
......
...@@ -2,20 +2,21 @@ ...@@ -2,20 +2,21 @@
* 长连接消息事件订阅处理逻辑 * 长连接消息事件订阅处理逻辑
* *
* */ * */
import handleHsPlayerChange from "./room/hsPlayerChange";
import handleTypeChange from "./room/typeChange";
import handleHsPlayerEnter from "./room/hsPlayerEnter";
import handleJoinGame from "./room/joinGame";
import handleChat from "./room/chat";
import handleHsWatchChange from "./room/hsWatchChange";
import { YgoProPacket } from "@/api/ocgcore/ocgAdapter/packet";
import { adaptStoc } from "@/api/ocgcore/ocgAdapter/adapter"; import { adaptStoc } from "@/api/ocgcore/ocgAdapter/adapter";
import handleSelectHand from "./mora/selectHand"; import { YgoProPacket } from "@/api/ocgcore/ocgAdapter/packet";
import handleSelectTp from "./mora/selectTp";
import handleDeckCount from "./mora/deckCount";
import handleGameMsg from "./duel/gameMsg"; import handleGameMsg from "./duel/gameMsg";
import handleTimeLimit from "./duel/timeLimit"; import handleTimeLimit from "./duel/timeLimit";
import handleDeckCount from "./mora/deckCount";
import handleSelectHand from "./mora/selectHand";
import handleSelectTp from "./mora/selectTp";
import handleChat from "./room/chat";
import handleDuelStart from "./room/duelStart"; import handleDuelStart from "./room/duelStart";
import handleHsPlayerChange from "./room/hsPlayerChange";
import handleHsPlayerEnter from "./room/hsPlayerEnter";
import handleHsWatchChange from "./room/hsWatchChange";
import handleJoinGame from "./room/joinGame";
import handleTypeChange from "./room/typeChange";
/* /*
* 先将从长连接中读取到的二进制数据通过Adapter转成protobuf结构体, * 先将从长连接中读取到的二进制数据通过Adapter转成protobuf结构体,
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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