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:
parent
01750e1b83
commit
91eeeaaeea
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue