feat: 新增队列与外交通知组件及新手引导

引入队列通知(QueueNotifications)和外交通知(DiplomaticNotifications)组件,优化主界面队列与外交报告展示,支持一键查看与跳转。重构App.vue,移除原有队列展示,改为弹出式通知,支持功能解锁提示与新手引导(TutorialOverlay)。完善NPC外交事件处理,导弹攻击等行为影响好感度并生成报告。优化部分UI细节与多语言文本,提升交互体验。
This commit is contained in:
谦君
2025-12-17 21:06:34 +08:00
parent 053bd24855
commit cfcde0b024
38 changed files with 3605 additions and 420 deletions

View File

@@ -36,9 +36,10 @@ export const calculateDistance = (
/**
* 计算飞行时间
* 平衡后的时间倍率,确保游戏节奏合理
*/
export const calculateFlightTime = (distance: number, minSpeed: number): number => {
return Math.max(10, Math.floor((distance * 10000) / minSpeed)) // 至少10秒
return Math.max(10, Math.floor((distance * 50) / minSpeed)) // 至少10秒
}
/**
@@ -717,7 +718,8 @@ export const updateFleetMissions = async (
attacker: Player,
defender: Player | null,
now: number,
allNpcs?: NPC[]
allNpcs?: NPC[],
locale?: Locale
): Promise<{
completedMissions: string[]
battleReports: BattleResult[]
@@ -767,7 +769,24 @@ export const updateFleetMissions = async (
planets.set(moonKey, attackResult.moon)
}
if (attackResult.debrisField) {
newDebrisFields.push(attackResult.debrisField)
// 检查该位置是否已存在残骸场
const existingDebris = debrisFields.get(attackResult.debrisField.id)
if (existingDebris) {
// 累加残骸资源
const updatedDebris: DebrisField = {
...existingDebris,
resources: {
metal: existingDebris.resources.metal + attackResult.debrisField.resources.metal,
crystal: existingDebris.resources.crystal + attackResult.debrisField.resources.crystal
}
}
debrisFields.set(attackResult.debrisField.id, updatedDebris)
updatedDebrisFields.push(updatedDebris)
} else {
// 新建残骸场
debrisFields.set(attackResult.debrisField.id, attackResult.debrisField)
newDebrisFields.push(attackResult.debrisField)
}
}
}
break
@@ -821,6 +840,15 @@ export const updateFleetMissions = async (
if (destroyResult && destroyResult.success && destroyResult.planetId) {
// 星球被摧毁
destroyedPlanetIds.push(destroyResult.planetId)
// 处理外交关系如果目标是NPC星球
if (targetPlanet && targetPlanet.ownerId && allNpcs && locale) {
const planetOwner = allNpcs.find(npc => npc.id === targetPlanet.ownerId)
if (planetOwner) {
diplomaticLogic.handlePlanetDestructionReputation(attacker, targetPlanet, planetOwner, allNpcs, locale)
}
}
planets.delete(targetKey)
}
break