mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 16:05:12 +08:00
feat: 新增战报弹窗与舰队模拟器,重构UI组件
新增 BattleReportDialog、SpyReportDialog、NumberWithTooltip 等组件,完善舰队模拟器功能。重构并引入 Sheet、Sidebar、Tooltip、Skeleton 等 UI 组件,优化界面结构。实现 battle.worker 支持战斗计算,增加 universeStore、fleetStorageLogic 等核心逻辑,完善多语言与类型定义。
This commit is contained in:
@@ -21,10 +21,13 @@ export const BuildingType = {
|
||||
CrystalStorage: 'crystalStorage',
|
||||
DeuteriumTank: 'deuteriumTank',
|
||||
DarkMatterCollector: 'darkMatterCollector', // 暗物质收集器
|
||||
Terraformer: 'terraformer', // 地形改造器
|
||||
// 月球专属建筑
|
||||
LunarBase: 'lunarBase', // 月球基地
|
||||
SensorPhalanx: 'sensorPhalanx', // 传感器阵列
|
||||
JumpGate: 'jumpGate' // 跳跃门
|
||||
JumpGate: 'jumpGate', // 跳跃门
|
||||
// 特殊建筑
|
||||
PlanetDestroyerFactory: 'planetDestroyerFactory' // 行星毁灭者工厂
|
||||
} as const
|
||||
|
||||
export type BuildingType = (typeof BuildingType)[keyof typeof BuildingType]
|
||||
@@ -38,9 +41,12 @@ export interface BuildingConfig {
|
||||
baseTime: number // 基础建造时间(秒)
|
||||
costMultiplier: number // 升级成本倍数
|
||||
spaceUsage: number // 占用空间
|
||||
fleetStorageBonus?: number // 每级增加的舰队仓储(可选)
|
||||
planetOnly?: boolean // 仅行星可建造
|
||||
moonOnly?: boolean // 仅月球可建造
|
||||
requirements?: Partial<Record<BuildingType | TechnologyType, number>> // 前置条件
|
||||
maxLevel?: number // 最大等级(可选,不设置则无上限)
|
||||
requirements?: Partial<Record<BuildingType | TechnologyType, number>> // 前置条件(初始解锁)
|
||||
levelRequirements?: Record<number, Partial<Record<BuildingType | TechnologyType, number>>> // 等级升级条件
|
||||
}
|
||||
|
||||
// 建筑实例
|
||||
@@ -60,7 +66,9 @@ export const TechnologyType = {
|
||||
CombustionDrive: 'combustionDrive',
|
||||
ImpulseDrive: 'impulseDrive',
|
||||
HyperspaceDrive: 'hyperspaceDrive',
|
||||
DarkMatterTechnology: 'darkMatterTechnology' // 暗物质技术
|
||||
DarkMatterTechnology: 'darkMatterTechnology', // 暗物质技术
|
||||
TerraformingTechnology: 'terraformingTechnology', // 地形改造技术
|
||||
PlanetDestructionTech: 'planetDestructionTech' // 行星毁灭技术
|
||||
} as const
|
||||
|
||||
export type TechnologyType = (typeof TechnologyType)[keyof typeof TechnologyType]
|
||||
@@ -73,7 +81,10 @@ export interface TechnologyConfig {
|
||||
baseCost: Resources
|
||||
baseTime: number
|
||||
costMultiplier: number
|
||||
requirements?: Partial<Record<BuildingType | TechnologyType, number>>
|
||||
fleetStorageBonus?: number // 每级增加的舰队仓储(全局,可选)
|
||||
maxLevel?: number // 最大等级(可选,不设置则无上限)
|
||||
requirements?: Partial<Record<BuildingType | TechnologyType, number>> // 前置条件(初始解锁)
|
||||
levelRequirements?: Record<number, Partial<Record<BuildingType | TechnologyType, number>>> // 等级升级条件
|
||||
}
|
||||
|
||||
// 科技实例
|
||||
@@ -91,7 +102,8 @@ export const DefenseType = {
|
||||
IonCannon: 'ionCannon',
|
||||
PlasmaTurret: 'plasmaTurret',
|
||||
SmallShieldDome: 'smallShieldDome',
|
||||
LargeShieldDome: 'largeShieldDome'
|
||||
LargeShieldDome: 'largeShieldDome',
|
||||
PlanetaryShield: 'planetaryShield' // 行星护盾
|
||||
} as const
|
||||
|
||||
export type DefenseType = (typeof DefenseType)[keyof typeof DefenseType]
|
||||
@@ -120,7 +132,8 @@ export const ShipType = {
|
||||
ColonyShip: 'colonyShip',
|
||||
Recycler: 'recycler',
|
||||
EspionageProbe: 'espionageProbe',
|
||||
DarkMatterHarvester: 'darkMatterHarvester' // 暗物质采集船
|
||||
DarkMatterHarvester: 'darkMatterHarvester', // 暗物质采集船
|
||||
Deathstar: 'deathstar' // 死星
|
||||
} as const
|
||||
|
||||
export type ShipType = (typeof ShipType)[keyof typeof ShipType]
|
||||
@@ -138,6 +151,7 @@ export interface ShipConfig {
|
||||
armor: number
|
||||
speed: number
|
||||
fuelConsumption: number
|
||||
storageUsage: number // 占用舰队仓储
|
||||
requirements?: Partial<Record<BuildingType | TechnologyType, number>>
|
||||
}
|
||||
|
||||
@@ -153,6 +167,7 @@ export interface Fleet {
|
||||
[ShipType.Recycler]: number
|
||||
[ShipType.EspionageProbe]: number
|
||||
[ShipType.DarkMatterHarvester]: number
|
||||
[ShipType.Deathstar]: number
|
||||
}
|
||||
|
||||
// 舰队任务类型
|
||||
@@ -163,7 +178,9 @@ export const MissionType = {
|
||||
Spy: 'spy',
|
||||
Deploy: 'deploy',
|
||||
Expedition: 'expedition',
|
||||
HarvestDarkMatter: 'harvestDarkMatter' // 暗物质采集
|
||||
HarvestDarkMatter: 'harvestDarkMatter', // 暗物质采集
|
||||
Recycle: 'recycle', // 回收残骸
|
||||
Destroy: 'destroy' // 行星毁灭
|
||||
} as const
|
||||
|
||||
export type MissionType = (typeof MissionType)[keyof typeof MissionType]
|
||||
@@ -201,8 +218,27 @@ export interface BattleResult {
|
||||
defense: Partial<Record<DefenseType, number>>
|
||||
}
|
||||
winner: 'attacker' | 'defender' | 'draw'
|
||||
read?: boolean // 已读状态
|
||||
plunder: Resources
|
||||
debrisField: Resources
|
||||
// 新增详细信息
|
||||
rounds?: number
|
||||
attackerRemaining?: Partial<Fleet>
|
||||
defenderRemaining?: {
|
||||
fleet: Partial<Fleet>
|
||||
defense: Partial<Record<DefenseType, number>>
|
||||
}
|
||||
roundDetails?: Array<{
|
||||
round: number
|
||||
attackerLosses: Partial<Fleet>
|
||||
defenderLosses: {
|
||||
fleet: Partial<Fleet>
|
||||
defense: Partial<Record<DefenseType, number>>
|
||||
}
|
||||
attackerRemainingPower: number
|
||||
defenderRemainingPower: number
|
||||
}>
|
||||
moonChance?: number // 月球生成概率
|
||||
}
|
||||
|
||||
// 间谍报告
|
||||
@@ -218,6 +254,16 @@ export interface SpyReport {
|
||||
buildings?: Partial<Record<BuildingType, number>>
|
||||
technologies?: Partial<Record<TechnologyType, number>>
|
||||
detectionChance: number
|
||||
read?: boolean // 已读状态
|
||||
}
|
||||
|
||||
// 残骸场
|
||||
export interface DebrisField {
|
||||
id: string
|
||||
position: { galaxy: number; system: number; position: number }
|
||||
resources: Pick<Resources, 'metal' | 'crystal'> // 残骸场只包含金属和晶体
|
||||
createdAt: number
|
||||
expiresAt?: number // 可选的过期时间
|
||||
}
|
||||
|
||||
// 建造队列项
|
||||
@@ -244,6 +290,7 @@ export interface Planet {
|
||||
buildQueue: BuildQueueItem[]
|
||||
lastUpdate: number
|
||||
maxSpace: number // 最大空间
|
||||
maxFleetStorage: number // 舰队仓储上限
|
||||
isMoon: boolean // 是否为月球
|
||||
parentPlanetId?: string // 如果是月球,指向母星的ID
|
||||
}
|
||||
|
||||
126
src/types/worker.ts
Normal file
126
src/types/worker.ts
Normal file
@@ -0,0 +1,126 @@
|
||||
import type { Fleet, Resources } from './game'
|
||||
import { DefenseType } from './game'
|
||||
|
||||
/**
|
||||
* Worker 消息类型
|
||||
*/
|
||||
export const WorkerMessageType = {
|
||||
// 战斗模拟相关
|
||||
SIMULATE_BATTLE: 'SIMULATE_BATTLE',
|
||||
CALCULATE_PLUNDER: 'CALCULATE_PLUNDER',
|
||||
CALCULATE_DEBRIS: 'CALCULATE_DEBRIS',
|
||||
|
||||
// 通用响应
|
||||
SUCCESS: 'SUCCESS',
|
||||
ERROR: 'ERROR'
|
||||
} as const
|
||||
|
||||
export type WorkerMessageType = (typeof WorkerMessageType)[keyof typeof WorkerMessageType]
|
||||
|
||||
/**
|
||||
* 战斗方数据
|
||||
*/
|
||||
export interface BattleSideData {
|
||||
ships: Partial<Fleet>
|
||||
defense?: Partial<Record<DefenseType, number>>
|
||||
weaponTech?: number
|
||||
shieldTech?: number
|
||||
armorTech?: number
|
||||
}
|
||||
|
||||
/**
|
||||
* 战斗模拟结果
|
||||
*/
|
||||
export interface BattleSimulationResult {
|
||||
winner: 'attacker' | 'defender' | 'draw'
|
||||
rounds: number
|
||||
attackerLosses: Partial<Fleet>
|
||||
defenderLosses: {
|
||||
fleet: Partial<Fleet>
|
||||
defense: Partial<Record<DefenseType, number>>
|
||||
}
|
||||
attackerRemaining: Partial<Fleet>
|
||||
defenderRemaining: {
|
||||
fleet: Partial<Fleet>
|
||||
defense: Partial<Record<DefenseType, number>>
|
||||
}
|
||||
roundDetails: Array<{
|
||||
round: number
|
||||
attackerLosses: Partial<Fleet>
|
||||
defenderLosses: {
|
||||
fleet: Partial<Fleet>
|
||||
defense: Partial<Record<DefenseType, number>>
|
||||
}
|
||||
attackerRemainingPower: number
|
||||
defenderRemainingPower: number
|
||||
}>
|
||||
}
|
||||
|
||||
/**
|
||||
* Worker 消息基础接口
|
||||
*/
|
||||
export interface WorkerMessageBase {
|
||||
id: string
|
||||
type: WorkerMessageType
|
||||
}
|
||||
|
||||
/**
|
||||
* Worker 请求消息
|
||||
*/
|
||||
export interface WorkerRequestMessage extends WorkerMessageBase {
|
||||
payload: unknown
|
||||
}
|
||||
|
||||
/**
|
||||
* Worker 响应消息
|
||||
*/
|
||||
export interface WorkerResponseMessage extends WorkerMessageBase {
|
||||
success: boolean
|
||||
data?: unknown
|
||||
error?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 战斗模拟请求
|
||||
*/
|
||||
export interface SimulateBattleRequest extends WorkerRequestMessage {
|
||||
type: typeof WorkerMessageType.SIMULATE_BATTLE
|
||||
payload: {
|
||||
attacker: BattleSideData
|
||||
defender: BattleSideData
|
||||
maxRounds?: number
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 掠夺计算请求
|
||||
*/
|
||||
export interface CalculatePlunderRequest extends WorkerRequestMessage {
|
||||
type: typeof WorkerMessageType.CALCULATE_PLUNDER
|
||||
payload: {
|
||||
defenderResources: Resources
|
||||
attackerFleet: Partial<Fleet>
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 残骸场计算请求
|
||||
*/
|
||||
export interface CalculateDebrisRequest extends WorkerRequestMessage {
|
||||
type: typeof WorkerMessageType.CALCULATE_DEBRIS
|
||||
payload: {
|
||||
attackerLosses: Partial<Fleet>
|
||||
defenderLosses: {
|
||||
fleet: Partial<Fleet>
|
||||
defense: Partial<Record<DefenseType, number>>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 所有 Worker 请求类型
|
||||
*/
|
||||
export type WorkerRequest =
|
||||
| SimulateBattleRequest
|
||||
| CalculatePlunderRequest
|
||||
| CalculateDebrisRequest
|
||||
Reference in New Issue
Block a user