mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 07:55:11 +08:00
refactor: 优化UI组件结构与积分系统
重构部分UI组件脚本结构,统一导入风格,提升可维护性。CardUnlockOverlay解锁条件弹窗改为列表展示,提升可读性。修复QueueNotifications滚动区域高度。ScrollableDialogContent增加最大高度。StarsBackground与ParticlesBg组件代码格式优化。App.vue引入玩家积分定时更新逻辑,NPC成长系统补充间谍探测器修复。
This commit is contained in:
@@ -3,12 +3,13 @@
|
||||
* 提供跨模块共享的通用业务逻辑功能
|
||||
*/
|
||||
|
||||
import { BuildingType, TechnologyType } from '@/types/game'
|
||||
import type { Planet, Resources, Officer, BuildingConfig, TechnologyConfig } from '@/types/game'
|
||||
import { BuildingType, TechnologyType, ShipType, DefenseType } from '@/types/game'
|
||||
import type { Planet, Resources, Officer, BuildingConfig, TechnologyConfig, Player } from '@/types/game'
|
||||
import { OfficerType } from '@/types/game'
|
||||
import * as officerLogic from '@/logic/officerLogic'
|
||||
import * as resourceLogic from '@/logic/resourceLogic'
|
||||
import { scaleResources } from '@/utils/speed'
|
||||
import { BUILDINGS, TECHNOLOGIES, SHIPS, DEFENSES } from '@/config/gameConfig'
|
||||
|
||||
/**
|
||||
* 获取特定等级的升级条件
|
||||
@@ -139,8 +140,128 @@ export const getMaxResearchQueue = (technologies: Partial<Record<TechnologyType,
|
||||
/**
|
||||
* 计算最大舰队任务数量
|
||||
* @param additionalFleetSlots 军官提供的额外槽位数量
|
||||
* @returns 最大舰队任务数量(基础1个 + 军官加成,最多10个)
|
||||
* @param computerTechnologyLevel 计算机技术等级
|
||||
* @returns 最大舰队任务数量(基础1个 + 计算机技术等级 + 军官加成,最多20个)
|
||||
*/
|
||||
export const getMaxFleetMissions = (additionalFleetSlots: number = 0): number => {
|
||||
return Math.min(1 + additionalFleetSlots, 10)
|
||||
export const getMaxFleetMissions = (additionalFleetSlots: number = 0, computerTechnologyLevel: number = 0): number => {
|
||||
return Math.min(1 + computerTechnologyLevel + additionalFleetSlots, 20)
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算建筑的总成本(从等级1到目标等级的累计成本)
|
||||
* @param buildingType 建筑类型
|
||||
* @param level 目标等级
|
||||
* @returns 总资源成本(金属+水晶+重氢)
|
||||
*/
|
||||
const calculateBuildingTotalCost = (buildingType: BuildingType, level: number): number => {
|
||||
if (level <= 0) return 0
|
||||
|
||||
const config = BUILDINGS[buildingType]
|
||||
if (!config) return 0
|
||||
|
||||
let totalCost = 0
|
||||
const { baseCost, costMultiplier } = config
|
||||
|
||||
// 累加从等级1到目标等级的所有成本
|
||||
for (let i = 1; i <= level; i++) {
|
||||
const levelCost = {
|
||||
metal: Math.floor(baseCost.metal * Math.pow(costMultiplier, i - 1)),
|
||||
crystal: Math.floor(baseCost.crystal * Math.pow(costMultiplier, i - 1)),
|
||||
deuterium: Math.floor(baseCost.deuterium * Math.pow(costMultiplier, i - 1))
|
||||
}
|
||||
totalCost += levelCost.metal + levelCost.crystal + levelCost.deuterium
|
||||
}
|
||||
|
||||
return totalCost
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算科技的总成本(从等级1到目标等级的累计成本)
|
||||
* @param techType 科技类型
|
||||
* @param level 目标等级
|
||||
* @returns 总资源成本(金属+水晶+重氢)
|
||||
*/
|
||||
const calculateTechnologyTotalCost = (techType: TechnologyType, level: number): number => {
|
||||
if (level <= 0) return 0
|
||||
|
||||
const config = TECHNOLOGIES[techType]
|
||||
if (!config) return 0
|
||||
|
||||
let totalCost = 0
|
||||
const { baseCost, costMultiplier } = config
|
||||
|
||||
// 累加从等级1到目标等级的所有成本
|
||||
for (let i = 1; i <= level; i++) {
|
||||
const levelCost = {
|
||||
metal: Math.floor(baseCost.metal * Math.pow(costMultiplier, i - 1)),
|
||||
crystal: Math.floor(baseCost.crystal * Math.pow(costMultiplier, i - 1)),
|
||||
deuterium: Math.floor(baseCost.deuterium * Math.pow(costMultiplier, i - 1))
|
||||
}
|
||||
totalCost += levelCost.metal + levelCost.crystal + levelCost.deuterium
|
||||
}
|
||||
|
||||
return totalCost
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算单个舰船的成本
|
||||
* @param shipType 舰船类型
|
||||
* @returns 单个舰船的资源成本(金属+水晶+重氢)
|
||||
*/
|
||||
const calculateShipUnitCost = (shipType: ShipType): number => {
|
||||
const config = SHIPS[shipType]
|
||||
if (!config) return 0
|
||||
|
||||
return config.cost.metal + config.cost.crystal + config.cost.deuterium
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算单个防御的成本
|
||||
* @param defenseType 防御类型
|
||||
* @returns 单个防御的资源成本(金属+水晶+重氢)
|
||||
*/
|
||||
const calculateDefenseUnitCost = (defenseType: DefenseType): number => {
|
||||
const config = DEFENSES[defenseType]
|
||||
if (!config) return 0
|
||||
|
||||
return config.cost.metal + config.cost.crystal + config.cost.deuterium
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算玩家的总积分
|
||||
* 积分规则:(建筑成本 + 科技成本 + 舰队成本 + 防御成本) / 1000
|
||||
* @param player 玩家对象
|
||||
* @returns 玩家总积分
|
||||
*/
|
||||
export const calculatePlayerPoints = (player: Player): number => {
|
||||
let totalCost = 0
|
||||
|
||||
// 1. 计算所有星球的建筑成本
|
||||
player.planets.forEach(planet => {
|
||||
Object.entries(planet.buildings).forEach(([buildingType, level]) => {
|
||||
totalCost += calculateBuildingTotalCost(buildingType as BuildingType, level)
|
||||
})
|
||||
})
|
||||
|
||||
// 2. 计算科技成本
|
||||
Object.entries(player.technologies).forEach(([techType, level]) => {
|
||||
totalCost += calculateTechnologyTotalCost(techType as TechnologyType, level)
|
||||
})
|
||||
|
||||
// 3. 计算所有星球的舰队成本
|
||||
player.planets.forEach(planet => {
|
||||
Object.entries(planet.fleet).forEach(([shipType, count]) => {
|
||||
totalCost += calculateShipUnitCost(shipType as ShipType) * count
|
||||
})
|
||||
})
|
||||
|
||||
// 4. 计算所有星球的防御成本
|
||||
player.planets.forEach(planet => {
|
||||
Object.entries(planet.defense).forEach(([defenseType, count]) => {
|
||||
totalCost += calculateDefenseUnitCost(defenseType as DefenseType) * count
|
||||
})
|
||||
})
|
||||
|
||||
// 每1000资源 = 1积分
|
||||
return Math.floor(totalCost / 1000)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user