Files
ogame-vue-ts/src/logic/gameLogic.ts
谦君 731d79673b feat: 新增战报弹窗与舰队模拟器,重构UI组件
新增 BattleReportDialog、SpyReportDialog、NumberWithTooltip 等组件,完善舰队模拟器功能。重构并引入 Sheet、Sidebar、Tooltip、Skeleton 等 UI 组件,优化界面结构。实现 battle.worker 支持战斗计算,增加 universeStore、fleetStorageLogic 等核心逻辑,完善多语言与类型定义。
2025-12-13 11:14:23 +08:00

139 lines
3.8 KiB
TypeScript

import type { Planet, Player, BuildQueueItem, Officer } from '@/types/game'
import { TechnologyType, OfficerType } from '@/types/game'
import * as officerLogic from './officerLogic'
import * as buildingLogic from './buildingLogic'
import * as researchLogic from './researchLogic'
import * as pointsLogic from './pointsLogic'
import * as planetLogic from './planetLogic'
import * as resourceLogic from './resourceLogic'
/**
* 初始化玩家数据
*/
export const initializePlayer = (playerId: string, playerName: string = 'Commander'): Player => {
const player: Player = {
id: playerId,
name: playerName,
planets: [],
technologies: {} as Record<TechnologyType, number>,
officers: {} as Record<OfficerType, Officer>,
researchQueue: [],
fleetMissions: [],
battleReports: [],
spyReports: [],
points: 0
}
// 初始化科技等级
Object.values(TechnologyType).forEach(tech => {
player.technologies[tech] = 0
})
// 初始化军官状态
Object.values(OfficerType).forEach(officer => {
player.officers[officer] = officerLogic.createInactiveOfficer(officer)
})
return player
}
/**
* 检查是否需要初始化游戏
*/
export const shouldInitializeGame = (planets: Planet[]): boolean => {
return planets.length === 0
}
/**
* 更新所有星球的最后更新时间
*/
export const updatePlanetsLastUpdate = (planets: Planet[], now: number): void => {
planets.forEach(planet => {
planet.lastUpdate = now
})
}
/**
* 生成星系位置列表
*/
export const generateSystemPositions = (
_galaxy: number,
_system: number,
count: number = 10
): Array<{ position: number; planet: Planet | null }> => {
const result: Array<{ position: number; planet: Planet | null }> = []
for (let pos = 1; pos <= count; pos++) {
result.push({ position: pos, planet: null })
}
return result
}
/**
* 生成随机NPC星球位置
*/
export const generateRandomPosition = (): { galaxy: number; system: number; position: number } => {
return {
galaxy: Math.floor(Math.random() * 9) + 1,
system: Math.floor(Math.random() * 10) + 1,
position: Math.floor(Math.random() * 10) + 1
}
}
/**
* 生成位置键
*/
export const generatePositionKey = (galaxy: number, system: number, position: number): string => {
return `${galaxy}:${system}:${position}`
}
/**
* 更新游戏状态 - 处理所有星球和任务
*/
export const processGameUpdate = (
player: Player,
now: number
): {
updatedResearchQueue: BuildQueueItem[]
} => {
// 获取军官加成
const bonuses = officerLogic.calculateActiveBonuses(player.officers, now)
// 创建积分回调函数
const onPointsEarned = (points: number, _type: string, _itemType: string, _level?: number, _quantity?: number) => {
pointsLogic.addPoints(player, points)
}
// 更新所有星球资源(直接同步计算,避免 Worker 通信开销)
player.planets.forEach(planet => {
resourceLogic.updatePlanetResources(planet, now, bonuses)
})
// 更新所有星球其他状态
player.planets.forEach(planet => {
// 检查建造队列
buildingLogic.completeBuildQueue(planet, now, onPointsEarned)
// 更新星球最大空间
if (planet.isMoon) {
planet.maxSpace = planetLogic.calculateMoonMaxSpace(planet)
} else {
const terraformingTechLevel = player.technologies[TechnologyType.TerraformingTechnology] || 0
planet.maxSpace = planetLogic.calculatePlanetMaxSpace(planet, terraformingTechLevel)
}
})
// 检查研究队列
const updatedResearchQueue = researchLogic.completeResearchQueue(player.researchQueue, player.technologies, now, onPointsEarned)
return {
updatedResearchQueue
}
}
/**
* 检查并返回过期的军官列表
*/
export const checkOfficersExpiration = (officers: Record<OfficerType, Officer>, now: number): void => {
officerLogic.checkAndDeactivateExpiredOfficers(officers, now)
}