refactor 3:

- EnemyManager.cs 不再计算 droppedCoin / droppedGold / baseDamage,只在敌人隐藏完成后区分“击杀”还是“非击杀到家”,并把 DREnemy 上报给 CombatScheduler。
- CombatScheduler.cs 新增统一入口:
  - OnEnemyDefeated(DREnemy enemy):通过 EnemyDropResolver 解析掉落,再调用 CombatInRunResourceManager 入账,并按结果决定是否触发局外掉落判定。
  - OnEnemyReachedBase(DREnemy enemy):从 enemy.BaseDamage 解析伤害,再统一扣减基地血量。
This commit is contained in:
SepComet 2026-03-07 14:42:19 +08:00
parent 01750e1b83
commit 91eeeaaeea
3 changed files with 24 additions and 39 deletions

View File

@ -26,6 +26,7 @@ namespace GeometryTD.CustomComponent
private readonly CombatLoadSession _loadSession = new(); private readonly CombatLoadSession _loadSession = new();
private readonly CombatEventBridge _eventBridge = new(); private readonly CombatEventBridge _eventBridge = new();
private readonly CombatInRunResourceManager _combatInRunResourceManager = new(); private readonly CombatInRunResourceManager _combatInRunResourceManager = new();
private readonly EnemyDropResolver _enemyDropResolver = new();
private EntityComponent _entity; private EntityComponent _entity;
private DRLevel _currentLevel; private DRLevel _currentLevel;
@ -178,14 +179,14 @@ namespace GeometryTD.CustomComponent
return _phaseLoopRuntime.TryRequestEndCombat(); return _phaseLoopRuntime.TryRequestEndCombat();
} }
public void OnEnemyReachedBase(int baseDamage) public void OnEnemyReachedBase(DREnemy enemy)
{ {
if (!IsRunning) if (!IsRunning)
{ {
return; return;
} }
int resolvedBaseDamage = Mathf.Max(0, baseDamage); int resolvedBaseDamage = enemy != null ? Mathf.Max(0, enemy.BaseDamage) : 0;
if (resolvedBaseDamage <= 0) if (resolvedBaseDamage <= 0)
{ {
return; return;
@ -194,18 +195,28 @@ namespace GeometryTD.CustomComponent
ApplyBaseDamage(resolvedBaseDamage); ApplyBaseDamage(resolvedBaseDamage);
} }
public void OnEnemyDefeatedRewardResolved(int gainedCoin, int gainedGold) public void OnEnemyDefeated(DREnemy enemy)
{ {
_combatInRunResourceManager.AddEnemyDefeatedReward(gainedCoin, gainedGold);
if (!IsRunning) if (!IsRunning)
{ {
return; return;
} }
_combatInRunResourceManager.TryRollOutGameItemDrop( EnemyDropResolveContext context = new(
enemy,
_phaseLoopRuntime.DisplayPhaseIndex, _phaseLoopRuntime.DisplayPhaseIndex,
ResolveCurrentThemeType()); ResolveCurrentThemeType());
EnemyDropResolveResult result = _enemyDropResolver.Resolve(context);
_combatInRunResourceManager.AddEnemyDefeatedReward(result.Coin, result.Gold);
if (!result.ShouldRollOutGameItem)
{
return;
}
_combatInRunResourceManager.TryRollOutGameItemDrop(
context.DisplayPhaseIndex,
context.ThemeType);
} }
public bool OnCombatFinishReturnRequested() public bool OnCombatFinishReturnRequested()

View File

@ -5,7 +5,6 @@ using GeometryTD.Entity;
using GeometryTD.Entity.EntityData; using GeometryTD.Entity.EntityData;
using UnityEngine; using UnityEngine;
using UnityGameFramework.Runtime; using UnityGameFramework.Runtime;
using Random = UnityEngine.Random;
namespace GeometryTD.CustomComponent namespace GeometryTD.CustomComponent
{ {
@ -207,33 +206,15 @@ namespace GeometryTD.CustomComponent
bool wasKilled = EnemyEntity.TryConsumeKilledFlag(ne.EntityId); bool wasKilled = EnemyEntity.TryConsumeKilledFlag(ne.EntityId);
bool isCombatRunning = _combatScheduler != null && _combatScheduler.IsRunning; bool isCombatRunning = _combatScheduler != null && _combatScheduler.IsRunning;
int baseDamage = 0;
int droppedCoin = 0;
int droppedGold = 0;
if (enemyConfig != null)
{
baseDamage = Mathf.Max(0, enemyConfig.BaseDamage);
if (wasKilled)
{
droppedCoin = Mathf.Max(0, enemyConfig.DropCoin);
float dropRate = enemyConfig.DropPercent > 1f
? Mathf.Clamp01(enemyConfig.DropPercent * 0.01f)
: Mathf.Clamp01(enemyConfig.DropPercent);
if (enemyConfig.DropGold > 0 && dropRate > 0f && Random.value <= dropRate)
{
droppedGold = Mathf.Max(0, enemyConfig.DropGold);
}
}
}
if (isCombatRunning && wasKilled) if (isCombatRunning && wasKilled && enemyConfig != null)
{ {
_defeatedEnemyCount++; _defeatedEnemyCount++;
_combatScheduler.OnEnemyDefeatedRewardResolved(droppedCoin, droppedGold); _combatScheduler.OnEnemyDefeated(enemyConfig);
} }
else if (isCombatRunning && baseDamage > 0) else if (isCombatRunning && !wasKilled && enemyConfig != null)
{ {
_combatScheduler.OnEnemyReachedBase(baseDamage); _combatScheduler.OnEnemyReachedBase(enemyConfig);
} }
} }
} }

View File

@ -1,11 +1,4 @@
//------------------------------------------------------------ using GameFramework.DataTable;
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using GameFramework.DataTable;
using System; using System;
using GeometryTD.CustomUtility; using GeometryTD.CustomUtility;
using GeometryTD.DataTable; using GeometryTD.DataTable;
@ -17,7 +10,7 @@ namespace GeometryTD
{ {
public static class EntityExtension public static class EntityExtension
{ {
private static int s_SerialId = 0; private static int _serialId = 0;
public static EntityBase GetGameEntity(this EntityComponent entityComponent, int entityId) public static EntityBase GetGameEntity(this EntityComponent entityComponent, int entityId)
{ {
@ -97,7 +90,7 @@ namespace GeometryTD
public static int GenerateSerialId(this EntityComponent entityComponent) public static int GenerateSerialId(this EntityComponent entityComponent)
{ {
return --s_SerialId; return --_serialId;
} }
} }
} }