mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 07:55:11 +08:00
feat: 新增战报弹窗与舰队模拟器,重构UI组件
新增 BattleReportDialog、SpyReportDialog、NumberWithTooltip 等组件,完善舰队模拟器功能。重构并引入 Sheet、Sidebar、Tooltip、Skeleton 等 UI 组件,优化界面结构。实现 battle.worker 支持战斗计算,增加 universeStore、fleetStorageLogic 等核心逻辑,完善多语言与类型定义。
This commit is contained in:
@@ -5,11 +5,12 @@ import pkg from '../../package.json'
|
||||
export const encryptData = (data: any): string => {
|
||||
try {
|
||||
const jsonStr = JSON.stringify(data)
|
||||
return CryptoJS.AES.encrypt(jsonStr, pkg.name).toString()
|
||||
const encrypted = CryptoJS.AES.encrypt(jsonStr, pkg.name).toString()
|
||||
return encrypted
|
||||
} catch (error) {
|
||||
console.error('数据加密失败:', error)
|
||||
return ''
|
||||
console.error(error)
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
// 数据解密
|
||||
@@ -19,7 +20,7 @@ export const decryptData = (data: string): any => {
|
||||
const decryptedStr = bytes.toString(CryptoJS.enc.Utf8)
|
||||
return JSON.parse(decryptedStr)
|
||||
} catch (error) {
|
||||
console.error('数据解密失败:', error)
|
||||
console.error(error)
|
||||
return {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,15 +29,19 @@ export const getResourceColor = (current: number, max: number): string => {
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化时间(秒转为时分秒)
|
||||
* 格式化时间(秒转为天时分秒)
|
||||
* @param seconds 秒数
|
||||
* @param units 时间单位 {hour, minute, second}
|
||||
* @returns 格式化后的时间字符串(双位数格式,例如 00:05:08)
|
||||
* @returns 格式化后的时间字符串(例如 2d 05:30:15 或 05:30:15)
|
||||
*/
|
||||
export const formatTime = (seconds: number): string => {
|
||||
const hours = Math.floor(seconds / 3600)
|
||||
const days = Math.floor(seconds / 86400)
|
||||
const hours = Math.floor((seconds % 86400) / 3600)
|
||||
const minutes = Math.floor((seconds % 3600) / 60)
|
||||
const secs = Math.floor(seconds % 60)
|
||||
|
||||
if (days > 0) {
|
||||
return `${days}:${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
|
||||
}
|
||||
return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
|
||||
}
|
||||
|
||||
|
||||
74
src/utils/migration.ts
Normal file
74
src/utils/migration.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import type { Planet, DebrisField } from '@/types/game'
|
||||
import { decryptData, encryptData } from './crypto'
|
||||
import pkg from '../../package.json'
|
||||
|
||||
/**
|
||||
* 数据迁移工具
|
||||
* 用于从旧版本数据结构迁移到新版本
|
||||
*/
|
||||
|
||||
/**
|
||||
* 执行数据迁移
|
||||
* 将旧版本的 universePlanets 和 debrisFields 从 gameStore 迁移到 universeStore
|
||||
*/
|
||||
export const migrateGameData = (): void => {
|
||||
try {
|
||||
const storageKey = pkg.name
|
||||
const universeStorageKey = `${pkg.name}-universe`
|
||||
|
||||
// 读取旧的加密存档
|
||||
const oldEncryptedData = localStorage.getItem(storageKey)
|
||||
if (!oldEncryptedData) return
|
||||
|
||||
// 尝试解密(如果是加密格式)
|
||||
let oldData: any
|
||||
try {
|
||||
oldData = decryptData(oldEncryptedData)
|
||||
} catch {
|
||||
// 解密失败,可能是新格式(未加密),直接解析
|
||||
try {
|
||||
oldData = JSON.parse(oldEncryptedData)
|
||||
} catch {
|
||||
return // 无法解析,放弃迁移
|
||||
}
|
||||
}
|
||||
|
||||
// 检查是否需要迁移
|
||||
const hasOldMapData = oldData.universePlanets || oldData.debrisFields
|
||||
if (!hasOldMapData) return
|
||||
|
||||
// 准备 universeStore 数据
|
||||
const universeData: {
|
||||
planets: Record<string, Planet>
|
||||
debrisFields: Record<string, DebrisField>
|
||||
} = {
|
||||
planets: {},
|
||||
debrisFields: {}
|
||||
}
|
||||
|
||||
// 迁移星球数据(排除玩家星球)
|
||||
if (oldData.universePlanets) {
|
||||
const oldPlanets = oldData.universePlanets as Record<string, Planet>
|
||||
const playerPlanets = oldData.player?.planets || []
|
||||
const playerPlanetIds = new Set(playerPlanets.map((p: Planet) => p.id))
|
||||
Object.entries(oldPlanets).forEach(([key, planet]) => {
|
||||
// 只迁移非玩家星球
|
||||
if (!playerPlanetIds.has(planet.id)) {
|
||||
universeData.planets[key] = planet
|
||||
}
|
||||
})
|
||||
delete oldData.universePlanets
|
||||
}
|
||||
|
||||
// 迁移残骸场数据
|
||||
if (oldData.debrisFields) {
|
||||
universeData.debrisFields = oldData.debrisFields
|
||||
delete oldData.debrisFields
|
||||
}
|
||||
// 保存迁移后的数据
|
||||
localStorage.setItem(universeStorageKey, encryptData(universeData))
|
||||
localStorage.setItem(storageKey, encryptData(oldData))
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user