From 2ed15c4782614df2fb10d61a17fb339ce3adf26c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B0=A6=E5=90=9B?=
<73606411+setube@users.noreply.github.com>
Date: Thu, 18 Dec 2025 03:47:38 +0800
Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96UI=E7=BB=84?=
=?UTF-8?q?=E4=BB=B6=E7=BB=93=E6=9E=84=E4=B8=8E=E7=A7=AF=E5=88=86=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
重构部分UI组件脚本结构,统一导入风格,提升可维护性。CardUnlockOverlay解锁条件弹窗改为列表展示,提升可读性。修复QueueNotifications滚动区域高度。ScrollableDialogContent增加最大高度。StarsBackground与ParticlesBg组件代码格式优化。App.vue引入玩家积分定时更新逻辑,NPC成长系统补充间谍探测器修复。
---
src/App.vue | 152 +++---
src/components/CardUnlockOverlay.vue | 30 +-
src/components/QueueNotifications.vue | 2 +-
.../ui/bg-stars/StarsBackground.vue | 185 ++++---
src/components/ui/bg-stars/index.ts | 2 +-
.../ui/dialog/ScrollableDialogContent.vue | 2 +-
.../ui/particles-bg/ParticlesBg.vue | 452 +++++++++---------
src/components/ui/particles-bg/index.ts | 2 +-
src/components/ui/separator/Separator.vue | 34 +-
src/components/ui/separator/index.ts | 2 +-
src/components/ui/sheet/Sheet.vue | 26 +-
src/components/ui/sheet/SheetClose.vue | 19 +-
src/components/ui/sheet/SheetContent.vue | 85 ++--
src/components/ui/sheet/SheetDescription.vue | 30 +-
src/components/ui/sheet/SheetFooter.vue | 20 +-
src/components/ui/sheet/SheetHeader.vue | 19 +-
src/components/ui/sheet/SheetOverlay.vue | 31 +-
src/components/ui/sheet/SheetTitle.vue | 30 +-
src/components/ui/sheet/SheetTrigger.vue | 19 +-
src/components/ui/sheet/index.ts | 16 +-
src/components/ui/skeleton/Skeleton.vue | 27 +-
src/components/ui/skeleton/index.ts | 2 +-
src/config/gameConfig.ts | 10 +-
src/locales/de.ts | 11 +-
src/locales/en.ts | 7 +-
src/locales/ja.ts | 11 +-
src/locales/ko.ts | 11 +-
src/locales/ru.ts | 10 +-
src/locales/zh-CN.ts | 7 +-
src/locales/zh-TW.ts | 10 +-
src/logic/npcBehaviorLogic.ts | 188 ++++++--
src/logic/npcGrowthLogic.ts | 138 ++++--
src/logic/publicLogic.ts | 131 ++++-
src/logic/resourceLogic.ts | 2 +-
src/logic/shipValidation.ts | 6 +-
src/utils/migration.ts | 42 +-
src/views/BuildingsView.vue | 78 ++-
src/views/DiplomacyView.vue | 117 +++++
src/views/FleetView.vue | 27 +-
src/views/GMView.vue | 15 +-
src/views/MessagesView.vue | 7 +-
src/views/ResearchView.vue | 76 ++-
42 files changed, 1342 insertions(+), 749 deletions(-)
diff --git a/src/App.vue b/src/App.vue
index bf59852..238823f 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -200,49 +200,49 @@
{{ t('fleetView.totalCargoCapacity') }}: {{ formatNumber(getTotalCargoCapacity()) }} | {{ t('fleetView.used') }}:
@@ -344,7 +358,7 @@
import { useGameConfig } from '@/composables/useGameConfig'
import { computed, ref, onMounted, onUnmounted, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
- import { ShipType, MissionType, BuildingType } from '@/types/game'
+ import { ShipType, MissionType, BuildingType, TechnologyType } from '@/types/game'
import type { Fleet, Resources } from '@/types/game'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
@@ -366,7 +380,7 @@
AlertDialogTitle
} from '@/components/ui/alert-dialog'
import UnlockRequirement from '@/components/UnlockRequirement.vue'
- import { Sword, Package, Rocket as RocketIcon, Eye, Users, Recycle, Skull, Gift } from 'lucide-vue-next'
+ import { Sword, Package, Rocket as RocketIcon, Eye, Users, Recycle, Skull, Gift, Compass } from 'lucide-vue-next'
import { formatNumber, formatTime } from '@/utils/format'
import * as shipValidation from '@/logic/shipValidation'
import * as fleetLogic from '@/logic/fleetLogic'
@@ -397,7 +411,8 @@
// 计算最大舰队任务槽位
const maxFleetMissions = computed(() => {
const bonuses = officerLogic.calculateActiveBonuses(gameStore.player.officers, Date.now())
- return publicLogic.getMaxFleetMissions(bonuses.additionalFleetSlots)
+ const computerTechLevel = gameStore.player.technologies[TechnologyType.ComputerTechnology] || 0
+ return publicLogic.getMaxFleetMissions(bonuses.additionalFleetSlots, computerTechLevel)
})
const activeTab = ref<'fleet' | 'send' | 'missions'>('fleet')
@@ -504,6 +519,7 @@
{ type: MissionType.Colonize, name: t('fleetView.colonize'), icon: RocketIcon },
{ type: MissionType.Spy, name: t('fleetView.spy'), icon: Eye },
{ type: MissionType.Deploy, name: t('fleetView.deploy'), icon: Users },
+ { type: MissionType.Expedition, name: t('fleetView.expedition'), icon: Compass },
{ type: MissionType.Recycle, name: t('fleetView.recycle'), icon: Recycle },
{ type: MissionType.Destroy, name: t('fleetView.destroy'), icon: Skull }
])
@@ -616,7 +632,8 @@
fleet,
cargo,
gameStore.player.officers,
- currentMissions
+ currentMissions,
+ gameStore.player.technologies
)
if (!validation.valid) return false
const shouldDeductCargo = missionType === MissionType.Transport
diff --git a/src/views/GMView.vue b/src/views/GMView.vue
index 788c2c3..68c93e5 100644
--- a/src/views/GMView.vue
+++ b/src/views/GMView.vue
@@ -331,6 +331,7 @@
} from '@/components/ui/alert-dialog'
import { BuildingType, TechnologyType, ShipType, DefenseType, OfficerType } from '@/types/game'
import * as npcBehaviorLogic from '@/logic/npcBehaviorLogic'
+ import * as publicLogic from '@/logic/publicLogic'
import { Home } from 'lucide-vue-next'
const router = useRouter()
@@ -340,6 +341,11 @@
const { t } = useI18n()
const { BUILDINGS, TECHNOLOGIES, SHIPS, DEFENSES, OFFICERS } = useGameConfig()
+ // 更新玩家积分的辅助函数
+ const updatePlayerPoints = () => {
+ gameStore.player.points = publicLogic.calculatePlayerPoints(gameStore.player)
+ }
+
const goHome = () => {
router.push('/')
}
@@ -407,22 +413,26 @@
const setBuildingLevel = (building: BuildingType, level: number) => {
if (selectedPlanet.value) {
selectedPlanet.value.buildings[building] = level
+ updatePlayerPoints()
}
}
const setTechnologyLevel = (tech: TechnologyType, level: number) => {
gameStore.player.technologies[tech] = level
+ updatePlayerPoints()
}
const setShipCount = (ship: ShipType, count: number) => {
if (selectedPlanet.value) {
selectedPlanet.value.fleet[ship] = (selectedPlanet.value.fleet[ship] || 0) + count
+ updatePlayerPoints()
}
}
const setDefenseCount = (defense: DefenseType, count: number) => {
if (selectedPlanet.value) {
selectedPlanet.value.defense[defense] = (selectedPlanet.value.defense[defense] || 0) + count
+ updatePlayerPoints()
}
}
@@ -614,7 +624,7 @@
const maxAllResources = () => {
if (!selectedPlanet.value) return
- const maxAmount = 1000000000 // 10亿
+ const maxAmount = 1000000000000000000
selectedPlanet.value.resources.metal = maxAmount
selectedPlanet.value.resources.crystal = maxAmount
selectedPlanet.value.resources.deuterium = maxAmount
@@ -708,6 +718,9 @@
}
})
+ // 更新玩家积分(因为建筑/科技/舰队/防御可能已改变)
+ updatePlayerPoints()
+
toast.success(
t('gmView.completeQueuesSuccess', {
buildingCount,
diff --git a/src/views/MessagesView.vue b/src/views/MessagesView.vue
index 0332997..b759e6b 100644
--- a/src/views/MessagesView.vue
+++ b/src/views/MessagesView.vue
@@ -4,7 +4,7 @@