Files
ogame-vue-ts/src/logic/battleLogic.ts
谦君 cfcde0b024 feat: 新增队列与外交通知组件及新手引导
引入队列通知(QueueNotifications)和外交通知(DiplomaticNotifications)组件,优化主界面队列与外交报告展示,支持一键查看与跳转。重构App.vue,移除原有队列展示,改为弹出式通知,支持功能解锁提示与新手引导(TutorialOverlay)。完善NPC外交事件处理,导弹攻击等行为影响好感度并生成报告。优化部分UI细节与多语言文本,提升交互体验。
2025-12-17 21:06:34 +08:00

116 lines
4.0 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 { Fleet, Resources, BattleResult, Officer, TechnologyType } from '@/types/game'
import { DefenseType, OfficerType } from '@/types/game'
import { workerManager } from '@/workers/workerManager'
import { MOON_CONFIG } from '@/config/gameConfig'
/**
* 执行战斗模拟
* 使用 Web Worker 在后台线程中执行计算密集型的战斗模拟
*/
export const simulateBattle = async (
attackerFleet: Partial<Fleet>,
defenderFleet: Partial<Fleet>,
defenderDefense: Partial<Record<DefenseType, number>>,
defenderResources: Resources,
_attackerOfficers: Record<OfficerType, Officer>,
_defenderOfficers: Record<OfficerType, Officer>,
attackerTechnologies: Record<TechnologyType, number>,
defenderTechnologies: Record<TechnologyType, number>
): Promise<BattleResult> => {
// 从科技系统读取实际科技等级
const attackerWeaponTech = attackerTechnologies['weaponsTechnology'] || 0
const attackerShieldTech = attackerTechnologies['shieldingTechnology'] || 0
const attackerArmorTech = attackerTechnologies['armourTechnology'] || 0
const defenderWeaponTech = defenderTechnologies['weaponsTechnology'] || 0
const defenderShieldTech = defenderTechnologies['shieldingTechnology'] || 0
const defenderArmorTech = defenderTechnologies['armourTechnology'] || 0
// 使用 Worker 执行战斗模拟
const simulationResult = await workerManager.simulateBattle({
attacker: {
ships: attackerFleet,
weaponTech: attackerWeaponTech,
shieldTech: attackerShieldTech,
armorTech: attackerArmorTech
},
defender: {
ships: defenderFleet,
defense: defenderDefense,
weaponTech: defenderWeaponTech,
shieldTech: defenderShieldTech,
armorTech: defenderArmorTech
},
maxRounds: 6 // 最多6回合
})
// 计算掠夺(仅攻击方胜利时)
const plunder =
simulationResult.winner === 'attacker'
? await workerManager.calculatePlunder({
defenderResources,
attackerFleet: simulationResult.attackerRemaining
})
: { metal: 0, crystal: 0, deuterium: 0, darkMatter: 0, energy: 0 }
// 计算残骸场
const debrisField = await workerManager.calculateDebris({
attackerLosses: simulationResult.attackerLosses,
defenderLosses: simulationResult.defenderLosses
})
// 计算月球生成概率(根据残骸场总量)
const totalDebris = debrisField.metal + debrisField.crystal
const moonChance = Math.min(MOON_CONFIG.baseChance + Math.floor(totalDebris / MOON_CONFIG.chancePerDebris), MOON_CONFIG.maxChance) / 100 // 转换为0-1的概率
// 生成战斗报告
const battleResult: BattleResult = {
id: `battle_${Date.now()}`,
timestamp: Date.now(),
attackerId: '',
defenderId: '',
attackerPlanetId: '',
defenderPlanetId: '',
attackerFleet,
defenderFleet,
defenderDefense,
attackerLosses: simulationResult.attackerLosses,
defenderLosses: simulationResult.defenderLosses,
winner: simulationResult.winner,
plunder,
debrisField,
// 新增详细信息
rounds: simulationResult.rounds,
attackerRemaining: simulationResult.attackerRemaining,
defenderRemaining: simulationResult.defenderRemaining,
roundDetails: simulationResult.roundDetails,
moonChance
}
return battleResult
}
/**
* 计算防御设施修复防御有70%概率修复)
*/
export const repairDefense = (
defenseBeforeBattle: Partial<Record<DefenseType, number>>,
defenseAfterBattle: Partial<Record<DefenseType, number>>
): Partial<Record<DefenseType, number>> => {
const repaired: Partial<Record<DefenseType, number>> = { ...defenseAfterBattle }
Object.keys(defenseBeforeBattle).forEach(defenseType => {
const before = defenseBeforeBattle[defenseType as DefenseType] || 0
const after = defenseAfterBattle[defenseType as DefenseType] || 0
const lost = before - after
if (lost > 0) {
// 70%修复概率
const repairedCount = Math.floor(lost * 0.7)
repaired[defenseType as DefenseType] = after + repairedCount
}
})
return repaired
}