Commit 489aea76 authored by timel's avatar timel

feat: structure deck

parent 459664e9
Pipeline #21146 failed with stages
in 2 minutes and 50 seconds
#created by ygopro2
#main
14124483
9411399
9411399
18094166
18094166
18094166
40044918
40044918
59392529
50720316
50720316
27780618
27780618
16605586
16605586
22865492
22865492
23434538
23434538
14558127
14558127
13650422
83965310
81439173
8949584
8949584
32807846
52947044
45906428
24094653
21143940
21143940
21143940
48130397
24224830
24224830
12071500
24299458
24299458
10045474
#extra
86165817
41209827
29095552
40854197
60461804
60461804
22908820
58481572
58481572
89870349
46759931
63813056
1948619
58004362
58004362
!side
27204311
34267821
34267821
43534808
43534808
94145021
94145021
18144506
54693926
54693926
43898403
43898403
65681983
23002292
#created by ygopro2
#main
27204311
33331231
37351133
37351133
26077387
26077387
26077387
23434538
23434538
23434538
14558127
14558127
14558127
97268402
97268402
18144506
25955749
99550630
35261759
35261759
73628505
63166095
63166095
46271408
67169062
32807846
70368879
70368879
51227866
9726840
9726840
52340444
24224830
24224830
98338152
98338152
24299458
24010609
24010609
97616504
50005218
67616300
10045474
10045474
#extra
85289965
86066372
49202162
38342335
45819647
2857636
50588353
75147529
12421694
90673288
90673288
90673288
63288573
8491308
8491308
!side
27204311
33331231
34267821
34267821
24508238
73642296
59438930
59438930
5133471
24299458
83326048
83326048
69452756
69452756
23002292
...@@ -54,7 +54,8 @@ ...@@ -54,7 +54,8 @@
"sass": "^1.58.0", "sass": "^1.58.0",
"typescript": "^4.8.4", "typescript": "^4.8.4",
"vite": "^3.1.0", "vite": "^3.1.0",
"vite-plugin-wasm-pack": "^0.1.12" "vite-plugin-wasm-pack": "^0.1.12",
"vite-ydk-loader": "^0.0.2"
} }
}, },
"node_modules/@adobe/css-tools": { "node_modules/@adobe/css-tools": {
...@@ -26076,6 +26077,12 @@ ...@@ -26076,6 +26077,12 @@
"node": ">= 10.0.0" "node": ">= 10.0.0"
} }
}, },
"node_modules/vite-ydk-loader": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/vite-ydk-loader/-/vite-ydk-loader-0.0.2.tgz",
"integrity": "sha512-4Yn+RxcCXoRLIkCY4w7TU2hZrNiQmBe0X9T3w1Do4GBiuSDHrqAa7jBavhq78+5c2yPNvHTrfmY3g70ziaH62A==",
"dev": true
},
"node_modules/vm-browserify": { "node_modules/vm-browserify": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
...@@ -47292,6 +47299,12 @@ ...@@ -47292,6 +47299,12 @@
} }
} }
}, },
"vite-ydk-loader": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/vite-ydk-loader/-/vite-ydk-loader-0.0.2.tgz",
"integrity": "sha512-4Yn+RxcCXoRLIkCY4w7TU2hZrNiQmBe0X9T3w1Do4GBiuSDHrqAa7jBavhq78+5c2yPNvHTrfmY3g70ziaH62A==",
"dev": true
},
"vm-browserify": { "vm-browserify": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
import { DECKS } from "./structureDeck"; const DECKS: Record<string, { default: IDeck }> = import.meta.glob(
"/neos-assets/structure-decks/*.ydk",
{
eager: true,
}
);
const DeckManager = _objToMap(DECKS); export const DeckManager = _objToMap(
Object.keys(DECKS).map((key) => ({
...DECKS[key].default,
deckName: key.split("/").pop()?.split(".")[0] ?? "undefined",
}))
);
/* /*
* 返回卡组资源。 * 返回卡组资源。
......
import type { IDeck } from ".";
/**
* 预设卡组。
*/
export const DECKS: IDeck[] = [
{
deckName: "hero",
main: [
14124483, 9411399, 9411399, 18094166, 18094166, 18094166, 40044918,
40044918, 59392529, 50720316, 50720316, 27780618, 27780618, 16605586,
16605586, 22865492, 22865492, 23434538, 23434538, 14558127, 14558127,
13650422, 83965310, 81439173, 8949584, 8949584, 32807846, 52947044,
45906428, 24094653, 21143940, 21143940, 21143940, 48130397, 24224830,
24224830, 12071500, 24299458, 24299458, 10045474,
],
extra: [
86165817, 41209827, 29095552, 40854197, 60461804, 60461804, 22908820,
58481572, 58481572, 89870349, 46759931, 63813056, 1948619, 58004362,
58004362,
],
side: [
27204311, 34267821, 34267821, 43534808, 43534808, 94145021, 94145021,
18144506, 54693926, 54693926, 43898403, 43898403, 65681983, 23002292,
],
},
{
deckName: "Sky Striker Ace",
main: [
27204311, 33331231, 37351133, 37351133, 26077387, 26077387, 26077387,
23434538, 23434538, 23434538, 14558127, 14558127, 14558127, 97268402,
97268402, 18144506, 25955749, 99550630, 35261759, 35261759, 73628505,
63166095, 63166095, 46271408, 67169062, 32807846, 70368879, 70368879,
51227866, 9726840, 9726840, 52340444, 24224830, 24224830, 98338152,
98338152, 24299458, 24010609, 24010609, 97616504, 50005218, 67616300,
10045474, 10045474,
],
extra: [
85289965, 86066372, 49202162, 38342335, 45819647, 2857636, 50588353,
75147529, 12421694, 90673288, 90673288, 90673288, 63288573, 8491308,
8491308,
],
side: [
27204311, 33331231, 34267821, 34267821, 24508238, 73642296, 59438930,
59438930, 5133471, 24299458, 83326048, 83326048, 69452756, 69452756,
23002292,
],
},
];
...@@ -18,13 +18,13 @@ interface AutoModeConfig { ...@@ -18,13 +18,13 @@ interface AutoModeConfig {
const autoModeConfig: AutoModeConfig = { const autoModeConfig: AutoModeConfig = {
defaultPlayer: "", defaultPlayer: "",
defaultDeck: "", defaultDeck: VITE_AI_MODE_DEFAULT_DECK ?? "Hero",
defaultPassword: "", defaultPassword: "",
}; };
const aiModeConfig: AutoModeConfig = { const aiModeConfig: AutoModeConfig = {
defaultPlayer: "AiKiller", ...autoModeConfig,
defaultDeck: VITE_AI_MODE_DEFAULT_DECK ?? "hero", defaultPlayer: `AiKiller${Math.random().toString(36).slice(2)}}`,
defaultPassword: "AI", defaultPassword: "AI",
defaultMora: "scissors", defaultMora: "scissors",
isAiMode: true, isAiMode: true,
......
...@@ -6,15 +6,15 @@ export const useEnv = (): ImportMetaEnv => { ...@@ -6,15 +6,15 @@ export const useEnv = (): ImportMetaEnv => {
const env = import.meta.env; const env = import.meta.env;
const ret: any = {}; const ret: any = {};
for (const envKey of Object.keys(env)) { Object.keys(env).forEach((envKey) => {
let envValue = env[envKey];
// 转成正确的布尔类型 // 转成正确的布尔类型
envValue = ret[envKey] =
envValue === "true" ? true : envValue === "false" ? false : envValue; env[envKey] === "true"
? true
ret[envKey] = envValue; : env[envKey] === "false"
} ? false
: env[envKey];
});
return ret; return ret;
}; };
...@@ -4,10 +4,10 @@ import { ...@@ -4,10 +4,10 @@ import {
Avatar, Avatar,
Space, Space,
Button, Button,
Dropdown,
notification, notification,
Upload, Upload,
message, message,
Select,
} from "antd"; } from "antd";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
...@@ -22,7 +22,7 @@ import { ...@@ -22,7 +22,7 @@ import {
import { useAppSelector, useAutoMode } from "../hook"; import { useAppSelector, useAutoMode } from "../hook";
import { selectJoined } from "../reducers/joinSlice"; import { selectJoined } from "../reducers/joinSlice";
import { selectChat } from "../reducers/chatSlice"; import { selectChat } from "../reducers/chatSlice";
import { fetchDeck, IDeck } from "../api/deck"; import { fetchDeck, type IDeck, DeckManager } from "../api/deck";
import { import {
sendUpdateDeck, sendUpdateDeck,
sendHsReady, sendHsReady,
...@@ -34,17 +34,15 @@ import { ...@@ -34,17 +34,15 @@ import {
LoginOutlined, LoginOutlined,
LogoutOutlined, LogoutOutlined,
SendOutlined, SendOutlined,
DownOutlined,
TagOutlined, TagOutlined,
UploadOutlined, UploadOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
import { initMeExtraDeckMeta } from "../reducers/duel/extraDeckSlice"; import { initMeExtraDeckMeta } from "../reducers/duel/extraDeckSlice";
import type { MenuProps, UploadProps } from "antd"; import type { UploadProps } from "antd";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { selectDuelStart } from "../reducers/moraSlice"; import { selectDuelStart } from "../reducers/moraSlice";
import NeosConfig from "../../neos.config.json"; import NeosConfig from "../../neos.config.json";
import YGOProDeck from "ygopro-deck-encode"; import YGOProDeck from "ygopro-deck-encode";
//@ts-ignore
import rustInit from "rust-src"; import rustInit from "rust-src";
import { initStrings } from "../api/strings"; import { initStrings } from "../api/strings";
...@@ -117,17 +115,13 @@ const WaitRoom = () => { ...@@ -117,17 +115,13 @@ const WaitRoom = () => {
const player1 = useAppSelector(selectPlayer1); const player1 = useAppSelector(selectPlayer1);
const duelStart = useAppSelector(selectDuelStart); const duelStart = useAppSelector(selectDuelStart);
const [api, contextHolder] = notification.useNotification(); const [api, contextHolder] = notification.useNotification();
const [deckTitle, setDeckTitle] = useState("请选择卡组");
// FIXME: 这些数据应该从`store`中获取 // FIXME: 这些数据应该从`store`中获取
// TODO: 云卡组 // TODO: 云卡组
const DEFAULT_DECK = "hero"; const decks = [...DeckManager.keys()].map((deckName) => ({
const decks: MenuProps["items"] = [ value: deckName,
{ label: deckName,
label: DEFAULT_DECK, }));
key: DEFAULT_DECK,
},
];
const [uploadState, setUploadState] = useState(""); const [uploadState, setUploadState] = useState("");
const uploadProps: UploadProps = { const uploadProps: UploadProps = {
name: "file", name: "file",
...@@ -172,7 +166,6 @@ const WaitRoom = () => { ...@@ -172,7 +166,6 @@ const WaitRoom = () => {
const handleChoseDeck = async (deckName: string) => { const handleChoseDeck = async (deckName: string) => {
const deck = await fetchDeck(deckName); const deck = await fetchDeck(deckName);
await onDeckReady(deck); await onDeckReady(deck);
setDeckTitle(deckName);
}; };
const handleChoseReady = () => { const handleChoseReady = () => {
...@@ -276,19 +269,11 @@ const WaitRoom = () => { ...@@ -276,19 +269,11 @@ const WaitRoom = () => {
)} )}
</Space> </Space>
<Space wrap size={16}> <Space wrap size={16}>
<Dropdown <Select
menu={{ defaultValue={defaultDeck}
items: decks, onChange={handleChoseDeck}
onClick: ({ key }) => handleChoseDeck(key), options={decks}
}} />
>
<a onClick={(e) => e.preventDefault()}>
<Space>
{deckTitle}
<DownOutlined />
</Space>
</a>
</Dropdown>
</Space> </Space>
<Space> <Space>
<Upload {...uploadProps}> <Upload {...uploadProps}>
......
import { defineConfig } from 'vite' import { defineConfig } from "vite";
import react from '@vitejs/plugin-react' import react from "@vitejs/plugin-react";
import svgr from 'vite-plugin-svgr' import svgr from "vite-plugin-svgr";
import wasmPack from 'vite-plugin-wasm-pack'; import wasmPack from "vite-plugin-wasm-pack";
import ydkLoader from "vite-ydk-loader";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
build: { build: {
minify: false minify: false,
}, },
plugins: [react(), svgr(), wasmPack('./rust-src')] plugins: [react(), svgr(), wasmPack("./rust-src"), ydkLoader()],
}) resolve: {
extensions: [".js", ".json", ".ydk"],
},
});
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