Files
ogame-vue-ts/src/logic/researchLogic.ts
谦君 59dd7bfd05 feat: 重构战报弹窗与模拟器视图,优化UI与逻辑
重构BattleReportDialog和BattleSimulatorView相关静态资源,替换旧版JS/CSS文件,提升界面一致性和交互体验。新增和优化空状态、滚动区域等通用UI组件,移除部分冗余composable,完善多语言内容。引入导弹逻辑,补充版本检测工具,提升整体代码结构和可维护性。
2025-12-15 20:04:40 +08:00

120 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { Resources, BuildQueueItem } from '@/types/game'
import { TechnologyType, BuildingType } from '@/types/game'
import { TECHNOLOGIES } from '@/config/gameConfig'
import * as pointsLogic from './pointsLogic'
// 用于生成唯一ID的计数器
let researchQueueIdCounter = 0
/**
* 计算科技研究成本
*/
export const calculateTechnologyCost = (techType: TechnologyType, targetLevel: number): Resources => {
const config = TECHNOLOGIES[techType]
const multiplier = Math.pow(config.costMultiplier, targetLevel - 1)
return {
metal: Math.floor(config.baseCost.metal * multiplier),
crystal: Math.floor(config.baseCost.crystal * multiplier),
deuterium: Math.floor(config.baseCost.deuterium * multiplier),
darkMatter: Math.floor(config.baseCost.darkMatter * multiplier),
energy: 0
}
}
/**
* 计算科技研究时间
* @param techType 科技类型
* @param currentLevel 当前等级
* @param researchSpeedBonus 军官等提供的研究速度加成百分比
* @param researchLabLevel 研究实验室等级
* @param energyTechLevel 能源技术等级
*/
export const calculateTechnologyTime = (
techType: TechnologyType,
currentLevel: number,
researchSpeedBonus: number = 0,
researchLabLevel: number = 1,
energyTechLevel: number = 0
): number => {
const config = TECHNOLOGIES[techType]
const baseTime = config.baseTime * Math.pow(config.costMultiplier, currentLevel)
// 研究实验室和能源技术的加速:研究时间 / (研究实验室等级 × (1 + 能源技术等级))
// 研究实验室等级至少为1防止除以0
const labLevel = Math.max(1, researchLabLevel)
const techSpeedDivisor = labLevel * (1 + energyTechLevel)
// 军官等的百分比加成
const speedMultiplier = 1 - researchSpeedBonus / 100
return Math.floor((baseTime / techSpeedDivisor) * speedMultiplier)
}
/**
* 检查科技研究条件
*/
export const checkTechnologyRequirements = (
techType: TechnologyType,
buildings: Partial<Record<BuildingType, number>>,
technologies: Partial<Record<TechnologyType, number>>
): boolean => {
const config = TECHNOLOGIES[techType]
if (!config.requirements) return true
for (const [key, level] of Object.entries(config.requirements)) {
if (Object.values(BuildingType).includes(key as BuildingType)) {
if ((buildings[key as BuildingType] || 0) < level) {
return false
}
} else if (Object.values(TechnologyType).includes(key as TechnologyType)) {
if ((technologies[key as TechnologyType] || 0) < level) {
return false
}
}
}
return true
}
/**
* 创建研究队列项
*/
export const createResearchQueueItem = (techType: TechnologyType, targetLevel: number, researchTime: number): BuildQueueItem => {
const now = Date.now()
researchQueueIdCounter++
return {
id: `research_${now}_${researchQueueIdCounter}`,
type: 'technology',
itemType: techType,
targetLevel,
startTime: now,
endTime: now + researchTime * 1000
}
}
/**
* 处理研究完成
*/
export const completeResearchQueue = (
researchQueue: BuildQueueItem[],
technologies: Partial<Record<TechnologyType, number>>,
now: number,
onPointsEarned?: (points: number, type: 'technology', itemType: string, level: number) => void
): BuildQueueItem[] => {
return researchQueue.filter(item => {
if (now >= item.endTime) {
// 研究完成
const oldLevel = technologies[item.itemType as TechnologyType] || 0
const newLevel = item.targetLevel || 0
technologies[item.itemType as TechnologyType] = newLevel
// 计算并累积积分
if (onPointsEarned && newLevel > oldLevel) {
const points = pointsLogic.calculateTechnologyPoints(item.itemType as TechnologyType, oldLevel, newLevel)
onPointsEarned(points, 'technology', item.itemType, newLevel)
}
return false
}
return true
})
}