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

340
src/types/game.ts Normal file
View File

@@ -0,0 +1,340 @@
// 资源类型
export interface Resources {
metal: number
crystal: number
deuterium: number
darkMatter: number // 暗物质
energy: number // 电量(实时计算,不存储)
}
// 建筑类型
export const BuildingType = {
MetalMine: 'metalMine',
CrystalMine: 'crystalMine',
DeuteriumSynthesizer: 'deuteriumSynthesizer',
SolarPlant: 'solarPlant',
RoboticsFactory: 'roboticsFactory',
NaniteFactory: 'naniteFactory', // 纳米工厂
Shipyard: 'shipyard',
ResearchLab: 'researchLab',
MetalStorage: 'metalStorage',
CrystalStorage: 'crystalStorage',
DeuteriumTank: 'deuteriumTank',
DarkMatterCollector: 'darkMatterCollector', // 暗物质收集器
// 月球专属建筑
LunarBase: 'lunarBase', // 月球基地
SensorPhalanx: 'sensorPhalanx', // 传感器阵列
JumpGate: 'jumpGate' // 跳跃门
} as const
export type BuildingType = (typeof BuildingType)[keyof typeof BuildingType]
// 建筑配置
export interface BuildingConfig {
id: BuildingType
name: string
description: string
baseCost: Resources
baseTime: number // 基础建造时间(秒)
costMultiplier: number // 升级成本倍数
spaceUsage: number // 占用空间
planetOnly?: boolean // 仅行星可建造
moonOnly?: boolean // 仅月球可建造
requirements?: Partial<Record<BuildingType | TechnologyType, number>> // 前置条件
}
// 建筑实例
export interface Building {
type: BuildingType
level: number
}
// 研究科技类型
export const TechnologyType = {
EnergyTechnology: 'energyTechnology',
LaserTechnology: 'laserTechnology',
IonTechnology: 'ionTechnology',
HyperspaceTechnology: 'hyperspaceTechnology',
PlasmaTechnology: 'plasmaTechnology',
ComputerTechnology: 'computerTechnology', // 计算机技术
CombustionDrive: 'combustionDrive',
ImpulseDrive: 'impulseDrive',
HyperspaceDrive: 'hyperspaceDrive',
DarkMatterTechnology: 'darkMatterTechnology' // 暗物质技术
} as const
export type TechnologyType = (typeof TechnologyType)[keyof typeof TechnologyType]
// 科技配置
export interface TechnologyConfig {
id: TechnologyType
name: string
description: string
baseCost: Resources
baseTime: number
costMultiplier: number
requirements?: Partial<Record<BuildingType | TechnologyType, number>>
}
// 科技实例
export interface Technology {
type: TechnologyType
level: number
}
// 防御设施类型
export const DefenseType = {
RocketLauncher: 'rocketLauncher',
LightLaser: 'lightLaser',
HeavyLaser: 'heavyLaser',
GaussCannon: 'gaussCannon',
IonCannon: 'ionCannon',
PlasmaTurret: 'plasmaTurret',
SmallShieldDome: 'smallShieldDome',
LargeShieldDome: 'largeShieldDome'
} as const
export type DefenseType = (typeof DefenseType)[keyof typeof DefenseType]
// 防御设施配置
export interface DefenseConfig {
id: DefenseType
name: string
description: string
cost: Resources
buildTime: number
attack: number
shield: number
armor: number
requirements?: Partial<Record<BuildingType | TechnologyType, number>>
}
// 舰船类型
export const ShipType = {
LightFighter: 'lightFighter',
HeavyFighter: 'heavyFighter',
Cruiser: 'cruiser',
Battleship: 'battleship',
SmallCargo: 'smallCargo',
LargeCargo: 'largeCargo',
ColonyShip: 'colonyShip',
Recycler: 'recycler',
EspionageProbe: 'espionageProbe',
DarkMatterHarvester: 'darkMatterHarvester' // 暗物质采集船
} as const
export type ShipType = (typeof ShipType)[keyof typeof ShipType]
// 舰船配置
export interface ShipConfig {
id: ShipType
name: string
description: string
cost: Resources
buildTime: number
cargoCapacity: number
attack: number
shield: number
armor: number
speed: number
fuelConsumption: number
requirements?: Partial<Record<BuildingType | TechnologyType, number>>
}
// 舰船实例
export interface Fleet {
[ShipType.LightFighter]: number
[ShipType.HeavyFighter]: number
[ShipType.Cruiser]: number
[ShipType.Battleship]: number
[ShipType.SmallCargo]: number
[ShipType.LargeCargo]: number
[ShipType.ColonyShip]: number
[ShipType.Recycler]: number
[ShipType.EspionageProbe]: number
[ShipType.DarkMatterHarvester]: number
}
// 舰队任务类型
export const MissionType = {
Attack: 'attack',
Transport: 'transport',
Colonize: 'colonize',
Spy: 'spy',
Deploy: 'deploy',
Expedition: 'expedition',
HarvestDarkMatter: 'harvestDarkMatter' // 暗物质采集
} as const
export type MissionType = (typeof MissionType)[keyof typeof MissionType]
// 舰队任务
export interface FleetMission {
id: string
playerId: string
originPlanetId: string
targetPosition: { galaxy: number; system: number; position: number }
targetPlanetId?: string
missionType: MissionType
fleet: Partial<Fleet>
cargo: Resources
departureTime: number
arrivalTime: number
returnTime?: number
status: 'outbound' | 'returning' | 'arrived'
}
// 战斗结果
export interface BattleResult {
id: string
timestamp: number
attackerId: string
defenderId: string
attackerPlanetId: string
defenderPlanetId: string
attackerFleet: Partial<Fleet>
defenderFleet: Partial<Fleet>
defenderDefense: Partial<Record<DefenseType, number>>
attackerLosses: Partial<Fleet>
defenderLosses: {
fleet: Partial<Fleet>
defense: Partial<Record<DefenseType, number>>
}
winner: 'attacker' | 'defender' | 'draw'
plunder: Resources
debrisField: Resources
}
// 间谍报告
export interface SpyReport {
id: string
timestamp: number
spyId: string
targetPlanetId: string
targetPlayerId: string
resources: Resources
fleet?: Partial<Fleet>
defense?: Partial<Record<DefenseType, number>>
buildings?: Partial<Record<BuildingType, number>>
technologies?: Partial<Record<TechnologyType, number>>
detectionChance: number
}
// 建造队列项
export interface BuildQueueItem {
id: string
type: 'building' | 'technology' | 'ship' | 'defense' | 'demolish'
itemType: BuildingType | TechnologyType | ShipType | DefenseType
targetLevel?: number // 用于建筑和科技
quantity?: number // 用于舰船和防御
startTime: number
endTime: number
}
// 星球
export interface Planet {
id: string
name: string
ownerId?: string
position: { galaxy: number; system: number; position: number }
resources: Resources
buildings: Record<BuildingType, number>
fleet: Fleet
defense: Record<DefenseType, number>
buildQueue: BuildQueueItem[]
lastUpdate: number
maxSpace: number // 最大空间
isMoon: boolean // 是否为月球
parentPlanetId?: string // 如果是月球,指向母星的ID
}
// 月球特殊配置
export interface MoonConfig {
minDebrisField: number // 生成月球所需的最小残骸场
baseChance: number // 基础生成概率
maxChance: number // 最大生成概率
chancePerDebris: number // 每单位残骸增加的概率
}
// 军官类型
export const OfficerType = {
Commander: 'commander', // 指挥官 - 增加建筑队列
Admiral: 'admiral', // 上将 - 增加舰队槽位
Engineer: 'engineer', // 工程师 - 增加防御和能量
Geologist: 'geologist', // 地质学家 - 增加资源产量
Technocrat: 'technocrat', // 技术专家 - 减少研究时间
DarkMatterSpecialist: 'darkMatterSpecialist' // 暗物质专家 - 增加暗物质产量
} as const
export type OfficerType = (typeof OfficerType)[keyof typeof OfficerType]
// 军官配置
export interface OfficerConfig {
id: OfficerType
name: string
description: string
cost: Resources // 招募成本
weeklyMaintenance: Resources // 每周维护费用
benefits: {
buildingSpeedBonus?: number // 建筑速度加成 (百分比)
researchSpeedBonus?: number // 研究速度加成 (百分比)
resourceProductionBonus?: number // 资源产量加成 (百分比)
darkMatterProductionBonus?: number // 暗物质产量加成 (百分比)
energyProductionBonus?: number // 电量产出加成 (百分比)
fleetSpeedBonus?: number // 舰队速度加成 (百分比)
fuelConsumptionReduction?: number // 燃料消耗减少 (百分比)
defenseBonus?: number // 防御加成 (百分比)
additionalBuildQueue?: number // 额外建筑队列
additionalFleetSlots?: number // 额外舰队槽位
storageCapacityBonus?: number // 仓储容量加成 (百分比)
}
}
// 军官实例
export interface Officer {
type: OfficerType
active: boolean
hiredAt?: number // 招募时间
expiresAt?: number // 到期时间
}
// 玩家
export interface Player {
id: string
name: string
planets: Planet[]
technologies: Record<TechnologyType, number>
officers: Record<OfficerType, Officer>
researchQueue: BuildQueueItem[]
fleetMissions: FleetMission[]
battleReports: BattleResult[]
spyReports: SpyReport[]
points: number // 总积分每1000资源=1分
}
// 游戏状态
export interface GameState {
player: Player
currentPlanetId: string
gameTime: number
isPaused: boolean
universe: Universe
}
// 宇宙
export interface Universe {
galaxies: number
systems: number
positions: number
planets: Map<string, Planet> // key: "galaxy:system:position"
npcs: NPC[]
}
// NPC玩家
export interface NPC {
id: string
name: string
planets: Planet[]
technologies: Record<TechnologyType, number>
difficulty: 'easy' | 'medium' | 'hard'
}