feat: 重构战报弹窗与模拟器视图,优化UI与逻辑

重构BattleReportDialog和BattleSimulatorView相关静态资源,替换旧版JS/CSS文件,提升界面一致性和交互体验。新增和优化空状态、滚动区域等通用UI组件,移除部分冗余composable,完善多语言内容。引入导弹逻辑,补充版本检测工具,提升整体代码结构和可维护性。
This commit is contained in:
谦君
2025-12-15 20:04:40 +08:00
parent 9b9fda0400
commit 59dd7bfd05
126 changed files with 3944 additions and 1487 deletions

View File

@@ -5,6 +5,29 @@
<h1 class="text-2xl sm:text-3xl font-bold mb-4 sm:mb-6">{{ t('defenseView.title') }}</h1>
<!-- 导弹容量显示 -->
<div v-if="missileSiloCapacity > 0" class="mb-4 sm:mb-6 p-3 sm:p-4 bg-muted/50 rounded-lg border">
<div class="flex items-center justify-between">
<div class="text-sm sm:text-base font-medium">{{ t('defenseView.missileCapacity') }}:</div>
<div class="text-sm sm:text-base font-bold">
<span :class="currentMissileCount > missileSiloCapacity ? 'text-destructive' : 'text-primary'">
{{ formatNumber(currentMissileCount) }}
</span>
<span class="text-muted-foreground mx-1">/</span>
<span>{{ formatNumber(missileSiloCapacity) }}</span>
</div>
</div>
<div class="mt-2">
<div class="w-full bg-background rounded-full h-2.5 sm:h-3 overflow-hidden">
<div
class="h-full transition-all duration-300"
:class="currentMissileCount > missileSiloCapacity ? 'bg-destructive' : 'bg-primary'"
:style="{ width: `${Math.min((currentMissileCount / missileSiloCapacity) * 100, 100)}%` }"
/>
</div>
</div>
</div>
<div class="grid grid-cols-2 sm:grid-cols-3 gap-3 sm:gap-4">
<Card v-for="defenseType in Object.values(DefenseType)" :key="defenseType" class="relative">
<CardUnlockOverlay :requirements="DEFENSES[defenseType].requirements" />
@@ -156,6 +179,7 @@
import { formatNumber, getResourceCostColor } from '@/utils/format'
import * as publicLogic from '@/logic/publicLogic'
import * as shipValidation from '@/logic/shipValidation'
import * as shipLogic from '@/logic/shipLogic'
const gameStore = useGameStore()
const detailDialog = useDetailDialogStore()
@@ -163,6 +187,17 @@
const { DEFENSES } = useGameConfig()
const planet = computed(() => gameStore.currentPlanet)
// 导弹容量相关计算
const missileSiloCapacity = computed(() => {
if (!planet.value) return 0
return shipLogic.calculateMissileSiloCapacity(planet.value.buildings)
})
const currentMissileCount = computed(() => {
if (!planet.value) return 0
return shipLogic.calculateCurrentMissileCount(planet.value.defense)
})
// AlertDialog 状态
const alertDialogOpen = ref(false)
const alertDialogTitle = ref('')
@@ -197,11 +232,12 @@
}
const buildDefense = (defenseType: DefenseType, quantity: number): boolean => {
if (!gameStore.currentPlanet) return false
const validation = shipValidation.validateDefenseBuild(gameStore.currentPlanet, defenseType, quantity, gameStore.player.technologies)
const currentPlanet = gameStore.currentPlanet
if (!currentPlanet) return false
const validation = shipValidation.validateDefenseBuild(currentPlanet, defenseType, quantity, gameStore.player.technologies)
if (!validation.valid) return false
const queueItem = shipValidation.executeDefenseBuild(gameStore.currentPlanet, defenseType, quantity, gameStore.player.officers)
gameStore.currentPlanet.buildQueue.push(queueItem)
const queueItem = shipValidation.executeDefenseBuild(currentPlanet, defenseType, quantity, gameStore.player.officers)
currentPlanet.buildQueue.push(queueItem)
return true
}