diff --git a/app/page.tsx b/app/page.tsx deleted file mode 100644 index 2329466..0000000 --- a/app/page.tsx +++ /dev/null @@ -1,310 +0,0 @@ -'use client'; - -import { useState, useEffect } from 'react'; -import { Resources, ShipType, LotteryResult, Language } from '../types/lottery'; -import { calculateProbabilities } from '../utils/lottery'; -import { getTranslation, getItemName } from '../utils/i18n'; - -// 帮助弹框组件 -function HelpModal({ isOpen, onClose, title, children }: { - isOpen: boolean; - onClose: () => void; - title: string; - children: React.ReactNode; -}) { - if (!isOpen) return null; - - return ( -
-
-
-

{title}

- -
-
- {children} -
-
-
- ); -} - -export default function Home() { - const [language, setLanguage] = useState('zh_cn'); - const [isHelpOpen, setIsHelpOpen] = useState(false); - const t = getTranslation(language); - - // 更新页面标题 - useEffect(() => { - document.title = t.title; - }, [language, t.title]); - - const [resources, setResources] = useState({ - fuel: 10, - steel: 10, - ammo: 10, - bauxite: 10 - }); - const [shipType, setShipType] = useState('gun'); - const [hqLevel, setHqLevel] = useState(120); - const [results, setResults] = useState([]); - const [isCalculating, setIsCalculating] = useState(false); - - const handleCalculate = async () => { - if (isCalculating) return; - - // 验证资源值是否在合法范围内 - const isValid = Object.values(resources).every(value => value >= 10 && value <= 300); - if (!isValid) { - alert('请确保所有资源值在10-300之间'); - return; - } - - setIsCalculating(true); - try { - const results = await calculateProbabilities(resources, shipType, hqLevel); - console.log('计算结果:', results); - setResults(results); - } catch (error) { - console.error('计算概率时出错:', error); - alert('计算概率时出错,请检查输入值和奖池数据'); - } finally { - setIsCalculating(false); - } - }; - - const handleResourceChange = (key: keyof Resources, value: string) => { - const numValue = value === '' ? 10 : Math.min(300, Math.max(10, parseInt(value) || 10)); - setResources(prev => ({ ...prev, [key]: numValue })); - }; - - const totalProbability = results.reduce((sum, item) => sum + item.probability, 0); - const failureRate = 100 - totalProbability; - - return ( -
-
-
-

{t.title}

- -
- -
-
-
- - handleResourceChange('fuel', e.target.value)} - className="w-full p-2 border rounded dark:bg-gray-700 dark:text-gray-100 dark:border-gray-600" - min="10" - max="300" - placeholder="10" - /> -
-
- - handleResourceChange('steel', e.target.value)} - className="w-full p-2 border rounded dark:bg-gray-700 dark:text-gray-100 dark:border-gray-600" - min="10" - max="300" - placeholder="10" - /> -
-
- - handleResourceChange('ammo', e.target.value)} - className="w-full p-2 border rounded dark:bg-gray-700 dark:text-gray-100 dark:border-gray-600" - min="10" - max="300" - placeholder="10" - /> -
-
- - handleResourceChange('bauxite', e.target.value)} - className="w-full p-2 border rounded dark:bg-gray-700 dark:text-gray-100 dark:border-gray-600" - min="10" - max="300" - placeholder="10" - /> -
-
- -
-
-
- - -
- -
-
- - setHqLevel(Math.max(1, Math.min(120, parseInt(e.target.value) || 120)))} - className="w-full p-2 border rounded dark:bg-gray-700 dark:text-gray-100 dark:border-gray-600" - min="1" - max="120" - placeholder="120" - /> -
-
- - -
- - {results.length > 0 && ( -
-

{t.resultTitle}

-
- {results.map((result, index) => ( -
-
- - {result.itemName && getItemName({ name: { - ja_jp: result.itemName, - ja_kana: '', - ja_romaji: '', - zh_cn: result.itemName - }}, language)} - - - ({t.pools[result.poolName.split('(')[0] as keyof typeof t.pools]}) - {t.rarity}:{result.rarity} - - {result.requiredResources && ( -
- {t.minRequirement}: {result.requiredResources.fuel}{t.resources.fuel}/ - {result.requiredResources.ammo}{t.resources.ammo}/ - {result.requiredResources.steel}{t.resources.steel}/ - {result.requiredResources.bauxite}{t.resources.bauxite} -
- )} -
- {result.probability}% -
- ))} -
-
- {t.developmentFailed} - {failureRate}% -
- {results[0]?.failureReasons && results[0].failureReasons.length > 0 && ( -
-
{t.failureReasons}:
-
- {results[0].failureReasons.map((failure, index) => ( -
-
- - {getItemName({ name: { - ja_jp: failure.itemName, - ja_kana: '', - ja_romaji: '', - zh_cn: failure.itemName - }}, language)} - - - - {t.reasons[failure.reason as keyof typeof t.reasons]} - -
- {failure.requiredLevel && ( -
- {t.requiredLevel}: {failure.requiredLevel} -
- )} - {failure.requiredResources && ( -
- {t.requiredResources}: {failure.requiredResources.fuel}{t.resources.fuel}/ - {failure.requiredResources.ammo}{t.resources.ammo}/ - {failure.requiredResources.steel}{t.resources.steel}/ - {failure.requiredResources.bauxite}{t.resources.bauxite} -
- )} -
- ))} -
-
- )} -
-
-
- )} -
- - setIsHelpOpen(false)} - title={t.shipTypeHelp.title} - > -
-

{t.shipTypeHelp.gun}

-

{t.shipTypeHelp.torp}

-

{t.shipTypeHelp.air}

-

{t.shipTypeHelp.sub}

-
-
-
- ); -} diff --git a/next.config.ts b/next.config.ts index 0666348..5083fe5 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,7 @@ /** @type {import('next').NextConfig} */ const nextConfig = { output: 'export', - basePath: "/kc-development-tools", + basePath: '/kc-development-tools', images: { unoptimized: true, }, diff --git a/utils/secretaryService.ts b/utils/secretaryService.ts index cafbe7e..ec2a5af 100644 --- a/utils/secretaryService.ts +++ b/utils/secretaryService.ts @@ -1,6 +1,7 @@ import { SecretaryData } from '@/types/secretary'; const STORAGE_KEY = 'secretary_bonus_data'; +const BASE_PATH = '/kc-development-tools'; // 从 localStorage 获取数据 export function getSecretaryData(): SecretaryData[] { @@ -60,7 +61,7 @@ export async function initializeData() { const existingData = localStorage.getItem(STORAGE_KEY); if (!existingData) { try { - const response = await fetch('/data/secretary_bonus.json'); + const response = await fetch(`${BASE_PATH}/data/secretary_bonus.json`); const initialData = await response.json(); saveSecretaryData(initialData); } catch (error) {