Files
ogame-vue-ts/src/logic/pointsLogic.ts
谦君 705ee8c3db feat: 初始化项目结构与核心功能
引入项目基础目录结构,包含多语言支持、主要页面与组件、核心游戏逻辑、UI 组件库、加密与本地持久化、自动化 Docker 构建流程、GitHub issue 模板(中英文)、README(中英文)、LICENSE 及开发配置文件。实现 OGame 单机版主要功能模块,为后续开发和扩展奠定基础。
2025-12-11 14:49:25 +08:00

138 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}