mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 07:55:11 +08:00
引入项目基础目录结构,包含多语言支持、主要页面与组件、核心游戏逻辑、UI 组件库、加密与本地持久化、自动化 Docker 构建流程、GitHub issue 模板(中英文)、README(中英文)、LICENSE 及开发配置文件。实现 OGame 单机版主要功能模块,为后续开发和扩展奠定基础。
169 lines
4.7 KiB
TypeScript
169 lines
4.7 KiB
TypeScript
import type { Planet, Resources, BuildQueueItem, Fleet, Officer } from '@/types/game'
|
|
import { ShipType, DefenseType, TechnologyType, OfficerType } from '@/types/game'
|
|
import * as shipLogic from './shipLogic'
|
|
import * as resourceLogic from './resourceLogic'
|
|
import * as officerLogic from './officerLogic'
|
|
import * as publicLogic from './publicLogic'
|
|
|
|
/**
|
|
* 验证舰船建造的所有条件
|
|
*/
|
|
export const validateShipBuild = (
|
|
planet: Planet,
|
|
shipType: ShipType,
|
|
quantity: number,
|
|
technologies: Partial<Record<TechnologyType, number>>
|
|
): {
|
|
valid: boolean
|
|
reason?: string
|
|
} => {
|
|
const totalCost = shipLogic.calculateShipCost(shipType, quantity)
|
|
|
|
// 检查前置条件
|
|
if (!shipLogic.checkShipRequirements(shipType, planet.buildings, technologies)) {
|
|
return { valid: false, reason: 'errors.requirementsNotMet' }
|
|
}
|
|
|
|
// 检查资源
|
|
if (!resourceLogic.checkResourcesAvailable(planet.resources, totalCost)) {
|
|
return { valid: false, reason: 'errors.insufficientResources' }
|
|
}
|
|
|
|
return { valid: true }
|
|
}
|
|
|
|
/**
|
|
* 执行舰船建造
|
|
*/
|
|
export const executeShipBuild = (
|
|
planet: Planet,
|
|
shipType: ShipType,
|
|
quantity: number,
|
|
officers: Record<OfficerType, Officer>
|
|
): BuildQueueItem => {
|
|
const totalCost = shipLogic.calculateShipCost(shipType, quantity)
|
|
|
|
// 计算军官加成
|
|
const bonuses = officerLogic.calculateActiveBonuses(officers, Date.now())
|
|
const buildTime = shipLogic.calculateShipBuildTime(shipType, quantity, bonuses.buildingSpeedBonus)
|
|
|
|
// 扣除资源
|
|
resourceLogic.deductResources(planet.resources, totalCost)
|
|
|
|
// 创建队列项
|
|
return shipLogic.createShipQueueItem(shipType, quantity, buildTime)
|
|
}
|
|
|
|
/**
|
|
* 验证防御建造的所有条件
|
|
*/
|
|
export const validateDefenseBuild = (
|
|
planet: Planet,
|
|
defenseType: DefenseType,
|
|
quantity: number,
|
|
technologies: Partial<Record<TechnologyType, number>>
|
|
): {
|
|
valid: boolean
|
|
reason?: string
|
|
} => {
|
|
const totalCost = shipLogic.calculateDefenseCost(defenseType, quantity)
|
|
|
|
// 检查前置条件
|
|
if (!shipLogic.checkDefenseRequirements(defenseType, planet.buildings, technologies)) {
|
|
return { valid: false, reason: 'errors.requirementsNotMet' }
|
|
}
|
|
|
|
// 检查资源
|
|
if (!resourceLogic.checkResourcesAvailable(planet.resources, totalCost)) {
|
|
return { valid: false, reason: 'errors.insufficientResources' }
|
|
}
|
|
|
|
// 护盾罩限制
|
|
if (!shipLogic.checkShieldDomeLimit(defenseType, planet.defense, quantity)) {
|
|
return { valid: false, reason: 'errors.shieldDomeLimit' }
|
|
}
|
|
|
|
return { valid: true }
|
|
}
|
|
|
|
/**
|
|
* 执行防御建造
|
|
*/
|
|
export const executeDefenseBuild = (
|
|
planet: Planet,
|
|
defenseType: DefenseType,
|
|
quantity: number,
|
|
officers: Record<OfficerType, Officer>
|
|
): BuildQueueItem => {
|
|
const totalCost = shipLogic.calculateDefenseCost(defenseType, quantity)
|
|
|
|
// 计算军官加成
|
|
const bonuses = officerLogic.calculateActiveBonuses(officers, Date.now())
|
|
const buildTime = shipLogic.calculateDefenseBuildTime(defenseType, quantity, bonuses.buildingSpeedBonus)
|
|
|
|
// 扣除资源
|
|
resourceLogic.deductResources(planet.resources, totalCost)
|
|
|
|
// 创建队列项
|
|
return shipLogic.createDefenseQueueItem(defenseType, quantity, buildTime)
|
|
}
|
|
|
|
/**
|
|
* 验证舰队派遣的所有条件
|
|
*/
|
|
export const validateFleetDispatch = (
|
|
planet: Planet,
|
|
fleet: Partial<Fleet>,
|
|
cargo: Resources,
|
|
officers: Record<OfficerType, Officer>,
|
|
currentFleetMissions: number = 0
|
|
): {
|
|
valid: boolean
|
|
reason?: string
|
|
fuelNeeded?: number
|
|
} => {
|
|
// 计算军官加成
|
|
const bonuses = officerLogic.calculateActiveBonuses(officers, Date.now())
|
|
|
|
// 检查舰队任务槽位是否已满
|
|
const maxFleetMissions = publicLogic.getMaxFleetMissions(bonuses.additionalFleetSlots)
|
|
if (currentFleetMissions >= maxFleetMissions) {
|
|
return { valid: false, reason: 'errors.fleetMissionsFull' }
|
|
}
|
|
|
|
// 检查舰队是否足够
|
|
if (!shipLogic.checkFleetAvailable(planet.fleet, fleet)) {
|
|
return { valid: false, reason: 'errors.insufficientFleet' }
|
|
}
|
|
|
|
// 检查是否有足够的重氢作为燃料(包含货物重量影响)
|
|
const fuelNeeded = shipLogic.calculateFleetFuelConsumption(fleet, bonuses.fuelConsumptionReduction, cargo)
|
|
if (planet.resources.deuterium < fuelNeeded) {
|
|
return { valid: false, reason: 'errors.insufficientFuel', fuelNeeded }
|
|
}
|
|
|
|
return { valid: true, fuelNeeded }
|
|
}
|
|
|
|
/**
|
|
* 执行舰队派遣(扣除舰队和燃料)
|
|
*/
|
|
export const executeFleetDispatch = (
|
|
planet: Planet,
|
|
fleet: Partial<Fleet>,
|
|
fuelNeeded: number,
|
|
shouldDeductCargo: boolean,
|
|
cargo: Resources
|
|
): void => {
|
|
// 扣除舰队
|
|
shipLogic.deductFleet(planet.fleet, fleet)
|
|
|
|
// 扣除燃料
|
|
planet.resources.deuterium -= fuelNeeded
|
|
|
|
// 扣除运输的资源
|
|
if (shouldDeductCargo) {
|
|
resourceLogic.deductResources(planet.resources, cargo)
|
|
}
|
|
}
|