diff --git a/Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs b/Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs index f1e2e7e..d1ff363 100644 --- a/Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs +++ b/Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs @@ -26,6 +26,7 @@ namespace GeometryTD.CustomComponent private readonly CombatLoadSession _loadSession = new(); private readonly CombatEventBridge _eventBridge = new(); private readonly CombatInRunResourceManager _combatInRunResourceManager = new(); + private readonly EnemyDropResolver _enemyDropResolver = new(); private EntityComponent _entity; private DRLevel _currentLevel; @@ -178,14 +179,14 @@ namespace GeometryTD.CustomComponent return _phaseLoopRuntime.TryRequestEndCombat(); } - public void OnEnemyReachedBase(int baseDamage) + public void OnEnemyReachedBase(DREnemy enemy) { if (!IsRunning) { return; } - int resolvedBaseDamage = Mathf.Max(0, baseDamage); + int resolvedBaseDamage = enemy != null ? Mathf.Max(0, enemy.BaseDamage) : 0; if (resolvedBaseDamage <= 0) { return; @@ -194,18 +195,28 @@ namespace GeometryTD.CustomComponent ApplyBaseDamage(resolvedBaseDamage); } - public void OnEnemyDefeatedRewardResolved(int gainedCoin, int gainedGold) + public void OnEnemyDefeated(DREnemy enemy) { - _combatInRunResourceManager.AddEnemyDefeatedReward(gainedCoin, gainedGold); - if (!IsRunning) { return; } - _combatInRunResourceManager.TryRollOutGameItemDrop( + EnemyDropResolveContext context = new( + enemy, _phaseLoopRuntime.DisplayPhaseIndex, 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() diff --git a/Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.cs b/Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.cs index f240184..29dbd2a 100644 --- a/Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.cs +++ b/Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.cs @@ -5,7 +5,6 @@ using GeometryTD.Entity; using GeometryTD.Entity.EntityData; using UnityEngine; using UnityGameFramework.Runtime; -using Random = UnityEngine.Random; namespace GeometryTD.CustomComponent { @@ -207,33 +206,15 @@ namespace GeometryTD.CustomComponent bool wasKilled = EnemyEntity.TryConsumeKilledFlag(ne.EntityId); 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++; - _combatScheduler.OnEnemyDefeatedRewardResolved(droppedCoin, droppedGold); + _combatScheduler.OnEnemyDefeated(enemyConfig); } - else if (isCombatRunning && baseDamage > 0) + else if (isCombatRunning && !wasKilled && enemyConfig != null) { - _combatScheduler.OnEnemyReachedBase(baseDamage); + _combatScheduler.OnEnemyReachedBase(enemyConfig); } } } diff --git a/Assets/GameMain/Scripts/Entity/EntityExtension.cs b/Assets/GameMain/Scripts/Entity/EntityExtension.cs index b03515c..933a66f 100644 --- a/Assets/GameMain/Scripts/Entity/EntityExtension.cs +++ b/Assets/GameMain/Scripts/Entity/EntityExtension.cs @@ -1,11 +1,4 @@ -//------------------------------------------------------------ -// Game Framework -// Copyright © 2013-2021 Jiang Yin. All rights reserved. -// Homepage: https://gameframework.cn/ -// Feedback: mailto:ellan@gameframework.cn -//------------------------------------------------------------ - -using GameFramework.DataTable; +using GameFramework.DataTable; using System; using GeometryTD.CustomUtility; using GeometryTD.DataTable; @@ -17,7 +10,7 @@ namespace GeometryTD { public static class EntityExtension { - private static int s_SerialId = 0; + private static int _serialId = 0; public static EntityBase GetGameEntity(this EntityComponent entityComponent, int entityId) { @@ -97,7 +90,7 @@ namespace GeometryTD public static int GenerateSerialId(this EntityComponent entityComponent) { - return --s_SerialId; + return --_serialId; } } }