mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 16:05:12 +08:00
feat: 重构战报弹窗与模拟器视图,优化UI与逻辑
重构BattleReportDialog和BattleSimulatorView相关静态资源,替换旧版JS/CSS文件,提升界面一致性和交互体验。新增和优化空状态、滚动区域等通用UI组件,移除部分冗余composable,完善多语言内容。引入导弹逻辑,补充版本检测工具,提升整体代码结构和可维护性。
This commit is contained in:
@@ -12,19 +12,34 @@
|
||||
<TabsList class="grid w-full grid-cols-4">
|
||||
<TabsTrigger value="all">
|
||||
{{ t('diplomacy.tabs.all') }}
|
||||
<Badge variant="secondary" class="ml-2">{{ allNpcs.length }}</Badge>
|
||||
<Badge variant="outline" class="ml-2 bg-blue-100 dark:bg-blue-950 text-blue-700 dark:text-blue-300 border-blue-300 dark:border-blue-700">{{ allNpcs.length }}</Badge>
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="friendly">
|
||||
{{ t('diplomacy.tabs.friendly') }}
|
||||
<Badge variant="secondary" class="ml-2">{{ friendlyNpcs.length }}</Badge>
|
||||
<Badge
|
||||
variant="outline"
|
||||
class="ml-2 bg-green-100 dark:bg-green-950 text-green-700 dark:text-green-300 border-green-300 dark:border-green-700"
|
||||
>
|
||||
{{ friendlyNpcs.length }}
|
||||
</Badge>
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="neutral">
|
||||
{{ t('diplomacy.tabs.neutral') }}
|
||||
<Badge variant="secondary" class="ml-2">{{ neutralNpcs.length }}</Badge>
|
||||
<Badge
|
||||
variant="outline"
|
||||
class="ml-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600"
|
||||
>
|
||||
{{ neutralNpcs.length }}
|
||||
</Badge>
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="hostile">
|
||||
{{ t('diplomacy.tabs.hostile') }}
|
||||
<Badge variant="secondary" class="ml-2">{{ hostileNpcs.length }}</Badge>
|
||||
<Badge
|
||||
variant="outline"
|
||||
class="ml-2 bg-red-100 dark:bg-red-950 text-red-700 dark:text-red-300 border-red-300 dark:border-red-700"
|
||||
>
|
||||
{{ hostileNpcs.length }}
|
||||
</Badge>
|
||||
</TabsTrigger>
|
||||
</TabsList>
|
||||
|
||||
@@ -202,7 +217,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, ref } from 'vue'
|
||||
import { computed, ref, onMounted } from 'vue'
|
||||
import { useGameStore } from '@/stores/gameStore'
|
||||
import { useNPCStore } from '@/stores/npcStore'
|
||||
import { useI18n } from '@/composables/useI18n'
|
||||
@@ -222,6 +237,52 @@
|
||||
|
||||
const activeTab = ref('all')
|
||||
|
||||
// 检测并生成NPC盟友
|
||||
const initializeNPCAllies = () => {
|
||||
const npcs = npcStore.npcs
|
||||
if (npcs.length < 2) return // 至少需要2个NPC才能生成盟友关系
|
||||
|
||||
npcs.forEach(npc => {
|
||||
// 如果NPC没有盟友列表,初始化为空数组
|
||||
if (!npc.allies) {
|
||||
npc.allies = []
|
||||
}
|
||||
|
||||
// 如果NPC没有盟友,随机生成1-2个盟友
|
||||
if (npc.allies.length === 0) {
|
||||
const otherNpcs = npcs.filter(n => n.id !== npc.id)
|
||||
if (otherNpcs.length === 0) return
|
||||
|
||||
// 随机选择1-2个盟友
|
||||
const allyCount = Math.min(Math.floor(Math.random() * 2) + 1, otherNpcs.length)
|
||||
const shuffled = [...otherNpcs].sort(() => Math.random() - 0.5)
|
||||
const selectedAllies = shuffled.slice(0, allyCount)
|
||||
|
||||
selectedAllies.forEach(ally => {
|
||||
// 添加双向盟友关系
|
||||
if (!npc.allies!.includes(ally.id)) {
|
||||
npc.allies!.push(ally.id)
|
||||
}
|
||||
|
||||
// 确保盟友也有盟友列表
|
||||
if (!ally.allies) {
|
||||
ally.allies = []
|
||||
}
|
||||
|
||||
// 确保双向关系
|
||||
if (!ally.allies.includes(npc.id)) {
|
||||
ally.allies.push(npc.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 组件挂载时初始化NPC盟友
|
||||
onMounted(() => {
|
||||
initializeNPCAllies()
|
||||
})
|
||||
|
||||
// 分页状态
|
||||
const ITEMS_PER_PAGE = 20
|
||||
const currentPage = ref<Record<string, number>>({
|
||||
|
||||
Reference in New Issue
Block a user