Commit e5a7247c authored by timel's avatar timel

refactor: make a config module

parent a12d47ba
Pipeline #21149 failed with stages
in 14 seconds
import { useEnv } from "../hook";
const { DEV, VITE_IS_AI_MODE, VITE_IS_AI_FIRST } = useEnv();
interface AutomationConfig {
isAiMode: boolean;
isAiFirst: boolean;
}
const defaultConfig: AutomationConfig = {
isAiMode: false,
isAiFirst: false,
};
const aiModeConfig: AutomationConfig = {
isAiMode: true,
isAiFirst: VITE_IS_AI_FIRST,
};
const genAutomationConfig = () => {
if (DEV) {
if (VITE_IS_AI_MODE) {
return aiModeConfig;
}
// 待拓展
}
return defaultConfig;
};
export const automationConfig: AutomationConfig = genAutomationConfig();
/*
* 旨在跳过登录界面,直接进入游戏(和AI对战、后续可能增加自动的PVP)。
* 仅在开发环境下生效,便于开发者快速调节决斗界面。
*/
import { useEnv } from ".";
import { useEnv } from "../hook";
const { DEV, VITE_IS_AI_MODE, VITE_IS_AI_FIRST, VITE_AI_MODE_DEFAULT_DECK } =
useEnv();
const { DEV, VITE_IS_AI_MODE, VITE_AI_MODE_DEFAULT_DECK } = useEnv();
interface PrepareConfig {
interface DefaultsConfig {
defaultPlayer: string;
defaultDeck: string;
defaultPassword: string;
defaultMora: string;
isAiMode: boolean;
isAiFirst: boolean;
}
const autoModeConfig: PrepareConfig = {
const defaultConfig: DefaultsConfig = {
defaultPlayer: "",
// 无需考虑undefined的情况,如果为undefined,界面上会显示【请选择】
defaultDeck: VITE_AI_MODE_DEFAULT_DECK,
defaultPassword: "",
defaultMora: "scissors",
isAiMode: false,
isAiFirst: false,
};
const aiModeConfig: PrepareConfig = {
...autoModeConfig,
const aiModeConfig: DefaultsConfig = {
...defaultConfig,
defaultPlayer: `AiKiller${Math.random().toString(36).slice(2)}}`,
defaultPassword: "AI",
isAiMode: true,
isAiFirst: VITE_IS_AI_FIRST,
};
export function useConfig(): PrepareConfig {
const genDefaultsConfig = () => {
if (DEV) {
if (VITE_IS_AI_MODE) {
return aiModeConfig;
......@@ -42,5 +31,7 @@ export function useConfig(): PrepareConfig {
// 待拓展
}
return autoModeConfig;
}
return defaultConfig;
};
export const defaultsConfig: DefaultsConfig = genDefaultsConfig();
import { useEnv } from "../hook";
import NeosDevConfig from "../../neos.config.json";
import NeosProdConfig from "../../neos.config.prod.json";
const { DEV } = useEnv();
type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y
? 1
: 2
? true
: false;
type Expect<T extends true> = T;
/**
* 确保两个json文件的结构一致,不一致会报错
*/
type _ = Expect<Equal<typeof NeosDevConfig, typeof NeosProdConfig>>;
export const envConfig = DEV ? NeosDevConfig : NeosProdConfig;
import { automationConfig } from "./automation";
import { defaultsConfig } from "./defaults";
import { envConfig } from "./env";
export const useConfig = () => ({
automation: automationConfig,
defaults: defaultsConfig,
...envConfig,
} satisfies Record<string, unknown>);
export * from "./useApp";
export * from "./useEnv";
export * from "./useConfig";
......@@ -11,10 +11,13 @@ import React, { useState, ChangeEvent, useEffect } from "react";
import { useNavigate } from "react-router-dom";
import "../styles/core.scss";
import NeosConfig from "../../neos.config.json";
import { useConfig } from "../hook";
import { useConfig } from "../config";
const serverConfig = NeosConfig.servers;
const { isAiMode, defaultPlayer, defaultPassword } = useConfig();
const {
defaults: { defaultPlayer, defaultPassword },
automation: { isAiMode },
} = useConfig();
export default function Login() {
const [player, setPlayer] = useState(defaultPlayer);
......
import React from "react";
import { sendHandResult, sendTpResult } from "../api/ocgcore/ocgHelper";
import { useAppSelector, useConfig } from "../hook";
import { useAppSelector } from "../hook";
import { useConfig } from "../config";
import {
selectHandSelectAble,
unSelectHandAble,
......@@ -18,7 +19,10 @@ import {
TableOutlined,
} from "@ant-design/icons";
const { isAiMode, isAiFirst, defaultMora } = useConfig();
const {
automation: { isAiMode, isAiFirst },
defaults: { defaultMora },
} = useConfig();
const Mora = () => {
const dispatch = store.dispatch;
......
......@@ -19,7 +19,8 @@ import {
selectPlayer0,
selectPlayer1,
} from "../reducers/playerSlice";
import { useAppSelector, useConfig } from "../hook";
import { useAppSelector } from "../hook";
import { useConfig } from "../config";
import { selectJoined } from "../reducers/joinSlice";
import { selectChat } from "../reducers/chatSlice";
import { fetchDeck, type IDeck, DeckManager } from "../api/deck";
......@@ -48,7 +49,10 @@ import { initStrings } from "../api/strings";
const READY_STATE = "ready";
const { isAiMode, defaultDeck } = useConfig();
const {
defaults: { defaultDeck },
automation: { isAiMode },
} = useConfig();
const WaitRoom = () => {
const params = useParams<{
......
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