feat: 初始化项目结构与核心功能

引入项目基础目录结构,包含多语言支持、主要页面与组件、核心游戏逻辑、UI 组件库、加密与本地持久化、自动化 Docker 构建流程、GitHub issue 模板(中英文)、README(中英文)、LICENSE 及开发配置文件。实现 OGame 单机版主要功能模块,为后续开发和扩展奠定基础。
This commit is contained in:
谦君
2025-12-11 14:49:25 +08:00
commit 705ee8c3db
178 changed files with 17258 additions and 0 deletions

231
src/logic/shipLogic.ts Normal file
View File

@@ -0,0 +1,231 @@
import type { Resources, BuildQueueItem, Fleet } from '@/types/game'
import { ShipType, DefenseType, BuildingType, TechnologyType } from '@/types/game'
import { SHIPS, DEFENSES } from '@/config/gameConfig'
/**
* 计算舰船建造成本
*/
export const calculateShipCost = (shipType: ShipType, quantity: number): Resources => {
const config = SHIPS[shipType]
return {
metal: config.cost.metal * quantity,
crystal: config.cost.crystal * quantity,
deuterium: config.cost.deuterium * quantity,
darkMatter: config.cost.darkMatter * quantity,
energy: 0
}
}
/**
* 计算防御设施建造成本
*/
export const calculateDefenseCost = (defenseType: DefenseType, quantity: number): Resources => {
const config = DEFENSES[defenseType]
return {
metal: config.cost.metal * quantity,
crystal: config.cost.crystal * quantity,
deuterium: config.cost.deuterium * quantity,
darkMatter: config.cost.darkMatter * quantity,
energy: 0
}
}
/**
* 计算舰船建造时间
*/
export const calculateShipBuildTime = (shipType: ShipType, quantity: number, buildingSpeedBonus: number = 0): number => {
const config = SHIPS[shipType]
const baseTime = config.buildTime * quantity
const speedMultiplier = 1 - buildingSpeedBonus / 100
return Math.floor(baseTime * speedMultiplier)
}
/**
* 计算防御设施建造时间
*/
export const calculateDefenseBuildTime = (defenseType: DefenseType, quantity: number, buildingSpeedBonus: number = 0): number => {
const config = DEFENSES[defenseType]
const baseTime = config.buildTime * quantity
const speedMultiplier = 1 - buildingSpeedBonus / 100
return Math.floor(baseTime * speedMultiplier)
}
/**
* 检查舰船建造条件
*/
export const checkShipRequirements = (
shipType: ShipType,
buildings: Partial<Record<BuildingType, number>>,
technologies: Partial<Record<TechnologyType, number>>
): boolean => {
const config = SHIPS[shipType]
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 checkDefenseRequirements = (
defenseType: DefenseType,
buildings: Partial<Record<BuildingType, number>>,
technologies: Partial<Record<TechnologyType, number>>
): boolean => {
const config = DEFENSES[defenseType]
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 checkShieldDomeLimit = (
defenseType: DefenseType,
currentDefense: Partial<Record<DefenseType, number>>,
quantity: number
): boolean => {
if (defenseType === DefenseType.SmallShieldDome || defenseType === DefenseType.LargeShieldDome) {
if ((currentDefense[defenseType] || 0) > 0) {
return false
}
if (quantity > 1) {
return false
}
}
return true
}
/**
* 创建舰船建造队列项
*/
export const createShipQueueItem = (shipType: ShipType, quantity: number, buildTime: number): BuildQueueItem => {
const now = Date.now()
return {
id: `ship_${now}`,
type: 'ship',
itemType: shipType,
quantity,
startTime: now,
endTime: now + buildTime * 1000
}
}
/**
* 创建防御设施建造队列项
*/
export const createDefenseQueueItem = (defenseType: DefenseType, quantity: number, buildTime: number): BuildQueueItem => {
const now = Date.now()
return {
id: `defense_${now}`,
type: 'defense',
itemType: defenseType,
quantity,
startTime: now,
endTime: now + buildTime * 1000
}
}
/**
* 检查舰队是否足够
*/
export const checkFleetAvailable = (currentFleet: Partial<Fleet>, requiredFleet: Partial<Fleet>): boolean => {
for (const [shipType, count] of Object.entries(requiredFleet)) {
if ((currentFleet[shipType as ShipType] || 0) < count) {
return false
}
}
return true
}
/**
* 计算舰队燃料消耗(包含货物重量影响)
* @param fleet 舰队组成
* @param fuelConsumptionReduction 燃料消耗减少百分比
* @param cargo 携带的货物(可选)
* @returns 总燃料消耗(重氢)
*/
export const calculateFleetFuelConsumption = (
fleet: Partial<Fleet>,
fuelConsumptionReduction: number = 0,
cargo?: Resources
): number => {
// 计算舰船基础燃料消耗
let baseFuelNeeded = 0
for (const [shipType, count] of Object.entries(fleet)) {
const config = SHIPS[shipType as ShipType]
baseFuelNeeded += config.fuelConsumption * count
}
// 计算货物额外燃料消耗
// 每1000单位资源增加1点燃料消耗
let cargoFuelNeeded = 0
if (cargo) {
const totalCargo = cargo.metal + cargo.crystal + cargo.deuterium + cargo.darkMatter
cargoFuelNeeded = Math.floor(totalCargo / 1000)
}
// 应用燃料消耗减少加成(仅应用于基础燃料,不影响货物燃料)
const reductionMultiplier = 1 - fuelConsumptionReduction / 100
const reducedBaseFuel = Math.floor(baseFuelNeeded * reductionMultiplier)
return reducedBaseFuel + cargoFuelNeeded
}
/**
* 计算舰队最慢速度
*/
export const calculateFleetMinSpeed = (fleet: Partial<Fleet>, fleetSpeedBonus: number = 0): number => {
let minSpeed = Infinity
for (const [shipType, count] of Object.entries(fleet)) {
if (count > 0) {
const config = SHIPS[shipType as ShipType]
minSpeed = Math.min(minSpeed, config.speed)
}
}
const speedMultiplier = 1 + fleetSpeedBonus / 100
return Math.floor(minSpeed * speedMultiplier)
}
/**
* 扣除舰队
*/
export const deductFleet = (currentFleet: Fleet, fleet: Partial<Fleet>): void => {
for (const [shipType, count] of Object.entries(fleet)) {
currentFleet[shipType as ShipType] -= count
}
}
/**
* 添加舰队
*/
export const addFleet = (currentFleet: Fleet, fleet: Partial<Fleet>): void => {
for (const [shipType, count] of Object.entries(fleet)) {
if (count > 0) {
currentFleet[shipType as ShipType] += count
}
}
}