mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 16:05:12 +08:00
feat: 初始化项目结构与核心功能
引入项目基础目录结构,包含多语言支持、主要页面与组件、核心游戏逻辑、UI 组件库、加密与本地持久化、自动化 Docker 构建流程、GitHub issue 模板(中英文)、README(中英文)、LICENSE 及开发配置文件。实现 OGame 单机版主要功能模块,为后续开发和扩展奠定基础。
This commit is contained in:
137
src/logic/pointsLogic.ts
Normal file
137
src/logic/pointsLogic.ts
Normal file
@@ -0,0 +1,137 @@
|
||||
import type { Player, Resources, BuildingType, TechnologyType, ShipType, DefenseType } from '@/types/game'
|
||||
import { SHIPS } from '@/config/gameConfig'
|
||||
import { DEFENSES } from '@/config/gameConfig'
|
||||
import * as buildingLogic from './buildingLogic'
|
||||
import * as researchLogic from './researchLogic'
|
||||
|
||||
/**
|
||||
* 计算资源总和(仅计算金属+晶体+重氢)
|
||||
* 根据游戏规则:不包括暗物质和能量
|
||||
*/
|
||||
export const calculateResourceCost = (resources: Resources): number => {
|
||||
return resources.metal + resources.crystal + resources.deuterium
|
||||
}
|
||||
|
||||
/**
|
||||
* 将资源总和转换为积分
|
||||
* 规则:每1000资源 = 1分
|
||||
*/
|
||||
export const calculatePointsFromResources = (resourceCost: number): number => {
|
||||
return Math.floor(resourceCost / 1000)
|
||||
}
|
||||
|
||||
/**
|
||||
* 为玩家添加积分
|
||||
*/
|
||||
export const addPoints = (player: Player, points: number): void => {
|
||||
player.points += points
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算建筑升级到指定等级所获得的积分
|
||||
* @param buildingType 建筑类型
|
||||
* @param fromLevel 起始等级(不包括)
|
||||
* @param toLevel 目标等级(包括)
|
||||
* @returns 积分数
|
||||
*/
|
||||
export const calculateBuildingPoints = (buildingType: BuildingType, fromLevel: number, toLevel: number): number => {
|
||||
let totalPoints = 0
|
||||
for (let level = fromLevel + 1; level <= toLevel; level++) {
|
||||
const cost = buildingLogic.calculateBuildingCost(buildingType, level)
|
||||
const resourceCost = calculateResourceCost(cost)
|
||||
totalPoints += calculatePointsFromResources(resourceCost)
|
||||
}
|
||||
return totalPoints
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算科技研究到指定等级所获得的积分
|
||||
* @param technologyType 科技类型
|
||||
* @param fromLevel 起始等级(不包括)
|
||||
* @param toLevel 目标等级(包括)
|
||||
* @returns 积分数
|
||||
*/
|
||||
export const calculateTechnologyPoints = (technologyType: TechnologyType, fromLevel: number, toLevel: number): number => {
|
||||
let totalPoints = 0
|
||||
for (let level = fromLevel + 1; level <= toLevel; level++) {
|
||||
const cost = researchLogic.calculateTechnologyCost(technologyType, level)
|
||||
const resourceCost = calculateResourceCost(cost)
|
||||
totalPoints += calculatePointsFromResources(resourceCost)
|
||||
}
|
||||
return totalPoints
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算舰船建造所获得的积分
|
||||
* @param shipType 舰船类型
|
||||
* @param quantity 数量
|
||||
* @returns 积分数
|
||||
*/
|
||||
export const calculateShipPoints = (shipType: ShipType, quantity: number): number => {
|
||||
const config = SHIPS[shipType]
|
||||
const resourceCost = calculateResourceCost(config.cost)
|
||||
const pointsPerShip = calculatePointsFromResources(resourceCost)
|
||||
return pointsPerShip * quantity
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算防御建造所获得的积分
|
||||
* @param defenseType 防御类型
|
||||
* @param quantity 数量
|
||||
* @returns 积分数
|
||||
*/
|
||||
export const calculateDefensePoints = (defenseType: DefenseType, quantity: number): number => {
|
||||
const config = DEFENSES[defenseType]
|
||||
const resourceCost = calculateResourceCost(config.cost)
|
||||
const pointsPerDefense = calculatePointsFromResources(resourceCost)
|
||||
return pointsPerDefense * quantity
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算玩家当前的总积分(用于数据迁移或重新计算)
|
||||
* 会计算所有建筑、科技、舰船、防御的累积积分
|
||||
*/
|
||||
export const calculateTotalPlayerPoints = (player: Player): number => {
|
||||
let totalPoints = 0
|
||||
|
||||
// 计算所有星球的建筑积分
|
||||
for (const planet of player.planets) {
|
||||
for (const [buildingType, level] of Object.entries(planet.buildings)) {
|
||||
if (level > 0) {
|
||||
totalPoints += calculateBuildingPoints(buildingType as BuildingType, 0, level)
|
||||
}
|
||||
}
|
||||
|
||||
// 计算所有星球的舰船积分
|
||||
for (const [shipType, quantity] of Object.entries(planet.fleet)) {
|
||||
if (quantity > 0) {
|
||||
totalPoints += calculateShipPoints(shipType as ShipType, quantity)
|
||||
}
|
||||
}
|
||||
|
||||
// 计算所有星球的防御积分
|
||||
for (const [defenseType, quantity] of Object.entries(planet.defense)) {
|
||||
if (quantity > 0) {
|
||||
totalPoints += calculateDefensePoints(defenseType as DefenseType, quantity)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 计算所有科技的积分
|
||||
for (const [technologyType, level] of Object.entries(player.technologies)) {
|
||||
if (level > 0) {
|
||||
totalPoints += calculateTechnologyPoints(technologyType as TechnologyType, 0, level)
|
||||
}
|
||||
}
|
||||
|
||||
// 计算正在飞行的舰队积分(舰队已经建造,所以也计入积分)
|
||||
for (const mission of player.fleetMissions) {
|
||||
for (const [shipType, quantity] of Object.entries(mission.fleet)) {
|
||||
if (quantity && quantity > 0) {
|
||||
totalPoints += calculateShipPoints(shipType as ShipType, quantity)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return totalPoints
|
||||
}
|
||||
Reference in New Issue
Block a user