diff --git a/Assets/_Project/Definitions/BuilderEffects.meta b/Assets/_Project/Definitions/BuilderEffects.meta deleted file mode 100644 index c619ee9..0000000 --- a/Assets/_Project/Definitions/BuilderEffects.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3e6583debe83da83abe53dec4eb2454b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset deleted file mode 100644 index 3f1044b..0000000 --- a/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset +++ /dev/null @@ -1,16 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5ce77a7f27ed228a0ad0494dfc1a4749, type: 3} - m_Name: GoldPerKillEffect - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderEffects.GoldPerKillEffectDefinition - DisplayName: Gold Per Kill - BonusGoldPerKill: 1 diff --git a/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta deleted file mode 100644 index c0cfe61..0000000 --- a/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 419fac0976a3e0a20827beff81826161 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset b/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset deleted file mode 100644 index 391470d..0000000 --- a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset +++ /dev/null @@ -1,19 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4eaef3264612070c48fbc6a987c89858, type: 3} - m_Name: Draft_BuilderEffect_GoldPerKill - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.BuilderEffectDraftOption - DisplayName: Gold Per Kill - Description: Get more gold per kill - Icon: {fileID: 0} - Weight: 1 - Kind: 0 diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta b/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta deleted file mode 100644 index 3d7d0d2..0000000 --- a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 65ff25c1c8a89f7df8e88f71968c1c98 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Player/Player.prefab b/Assets/_Project/Prefabs/Player/Player.prefab index 33c1316..666ff7b 100644 --- a/Assets/_Project/Prefabs/Player/Player.prefab +++ b/Assets/_Project/Prefabs/Player/Player.prefab @@ -16,7 +16,6 @@ GameObject: - component: {fileID: 2806524246861401760} - component: {fileID: 2806524246861401799} - component: {fileID: 2806524246861401801} - - component: {fileID: 5683786710272852339} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -51,7 +50,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 121878297 + GlobalObjectIdHash: 1552073510 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -130,7 +129,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b7e4c91a08f5d2461a3f8e6c25b09d74, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerTowerDeck ShowTopMostFoldoutHeaderGroup: 1 --- !u!114 &2806524246861401801 @@ -143,19 +142,6 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 2b8f4d1e6c3a497051d8e2f7a9c1b063, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.PlayerDraft ShowTopMostFoldoutHeaderGroup: 1 ---- !u!114 &5683786710272852339 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3493329038866903420} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 72dac94cde24af07ea0b5c77b228be34, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderUpgradeManager - ShowTopMostFoldoutHeaderGroup: 1 diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 3264d21..14f1ebc 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -27937,52 +27937,6 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 20, y: 1, z: 13} m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &2079088111 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2079088113} - - component: {fileID: 2079088112} - m_Layer: 0 - m_Name: BuilderEffectPool - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2079088112 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2079088111} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6226c6e672c5b358a9cdc2a1bee47daf, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderEffects.BuilderEffectPool - effects: - - {fileID: 11400000, guid: 419fac0976a3e0a20827beff81826161, type: 2} ---- !u!4 &2079088113 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2079088111} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -5.96326, y: 0, z: -13.28562} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2090447971 GameObject: m_ObjectHideFlags: 0 @@ -28564,7 +28518,6 @@ MonoBehaviour: options: - {fileID: 11400000, guid: 6b1d3f8a2c5e4097b8a1d0c3e6f9b240, type: 2} - {fileID: 11400000, guid: f4a2b8d1c6e93f05a7b2d4c8e1f6a930, type: 2} - - {fileID: 11400000, guid: 65ff25c1c8a89f7df8e88f71968c1c98, type: 2} --- !u!4 &2139601601 Transform: m_ObjectHideFlags: 0 @@ -28961,4 +28914,3 @@ SceneRoots: - {fileID: 2139601601} - {fileID: 176580462} - {fileID: 516125087} - - {fileID: 2079088113} diff --git a/Assets/_Project/Scripts/Core/BuilderEffectKind.cs b/Assets/_Project/Scripts/Core/BuilderEffectKind.cs deleted file mode 100644 index 4a731f7..0000000 --- a/Assets/_Project/Scripts/Core/BuilderEffectKind.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Assets/_Project/Scripts/Core/BuilderEffectKind.cs -namespace TD.Core -{ - /// - /// Identifies which builder effect a - /// represents. Backs a - /// bitmask on , so keep this to 32 entries - /// or fewer (or widen the mask to ulong if it ever needs more). - /// - public enum BuilderEffectKind : byte - { - GoldPerKill = 0, - } -} diff --git a/Assets/_Project/Scripts/Core/BuilderEffectKind.cs.meta b/Assets/_Project/Scripts/Core/BuilderEffectKind.cs.meta deleted file mode 100644 index 6eaad35..0000000 --- a/Assets/_Project/Scripts/Core/BuilderEffectKind.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 4e5626ef347960fd2880acfcefa7cc38 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects.meta deleted file mode 100644 index 26d9048..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderEffects.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dd9f1f667cfdcbf6d9ee44acc270f128 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs deleted file mode 100644 index 12be8ff..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs -using UnityEngine; -using TD.Core; - -namespace TD.Gameplay.BuilderEffects -{ - /// - /// Base class for one builder effect — a passive perk that applies to every tower a - /// player's Builder constructs (e.g. "kills yield bonus gold"). Granted via the draft - /// () and tracked per-player by - /// . - /// - /// - /// One asset per kind. is fixed per subclass (each concrete - /// type overrides it to its own ), so there's no way to - /// mis-tag an asset in the inspector. uses it to build a - /// fixed-size, enum-indexed lookup table — no scanning to resolve a kind to its data. - /// - /// No shared "Apply" contract. Concrete subclasses (e.g. - /// ) carry whatever payload they need. Effects with - /// different application shapes — a simple value read at an existing game-event hook vs. - /// behavior that needs its own component on the tower — are still just subclasses; consumers - /// query the concrete type they care about directly (see - /// ). - /// - public abstract class BuilderEffectDefinition : ScriptableObject - { - /// Which builder effect this asset's data belongs to. - public abstract BuilderEffectKind Kind { get; } - - [Tooltip("Name shown wherever a player's active builder effects are listed.")] - public string DisplayName; - } -} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs.meta deleted file mode 100644 index 039a631..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 3a939cb6af19202e1a9bddf01d9f1857 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs deleted file mode 100644 index 0c926e1..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs -using System; -using UnityEngine; -using TD.Core; - -namespace TD.Gameplay.BuilderEffects -{ - /// - /// Scene singleton holding every available this match, - /// authored as a flat array in the inspector for convenience. Internally it builds a - /// fixed-size table indexed by so lookups are a single array - /// access, not a scan. - /// - /// - /// Plain MonoBehaviour: identical on every peer (same assets), so there is nothing to sync. - /// The server reads it to resolve grants; clients read it to render an "active effects" list. - /// - public class BuilderEffectPool : MonoBehaviour - { - public static BuilderEffectPool Instance { get; private set; } - - [Tooltip("Every BuilderEffectDefinition asset available this match. One entry per " + - "BuilderEffectKind — order doesn't matter, Kind on the asset itself decides " + - "its slot.")] - [SerializeField] private BuilderEffectDefinition[] effects; - - // Fixed-size, enum-indexed lookup built once in Awake. Sized to the enum's entry count, - // not authored count, so an out-of-range Kind is a compile-time impossibility rather - // than a bounds check we'd otherwise need on every Get(). - private BuilderEffectDefinition[] byKind; - - private void Awake() - { - if (Instance != null && Instance != this) - { - Debug.LogError("[BuilderEffectPool] Multiple instances detected. Only one per scene."); - return; - } - Instance = this; - - int kindCount = Enum.GetValues(typeof(BuilderEffectKind)).Length; - byKind = new BuilderEffectDefinition[kindCount]; - if (effects == null) return; - - for (int i = 0; i < effects.Length; i++) - { - var def = effects[i]; - if (def == null) continue; - byKind[(int)def.Kind] = def; - } - } - - private void OnDestroy() - { - if (Instance == this) Instance = null; - } - - /// Returns the effect asset for , or null if none is - /// authored in this pool. - public BuilderEffectDefinition Get(BuilderEffectKind kind) - { - int i = (int)kind; - return (byKind != null && i >= 0 && i < byKind.Length) ? byKind[i] : null; - } - } -} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs.meta deleted file mode 100644 index 438b507..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 6226c6e672c5b358a9cdc2a1bee47daf \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs deleted file mode 100644 index 775d4c0..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs -using UnityEngine; -using TD.Core; - -namespace TD.Gameplay.BuilderEffects -{ - /// - /// Builder effect #1 — every tower the player owns yields extra gold per kill. - /// Read by , which - /// queries when awarding kill gold. - /// - [CreateAssetMenu(fileName = "GoldPerKillEffect", menuName = "TD/Builder Effects/Gold Per Kill")] - public class GoldPerKillEffectDefinition : BuilderEffectDefinition - { - public override BuilderEffectKind Kind => BuilderEffectKind.GoldPerKill; - - [Tooltip("Flat bonus gold awarded on top of the normal kill reward, for every kill by " + - "any of this player's towers.")] - [Min(0)] - public int BonusGoldPerKill = 1; - } -} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs.meta deleted file mode 100644 index f6342a3..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 5ce77a7f27ed228a0ad0494dfc1a4749 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs deleted file mode 100644 index 5f07d31..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs +++ /dev/null @@ -1,122 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs -using System.Collections.Generic; -using Unity.Netcode; -using UnityEngine; -using TD.Core; -using TD.Gameplay.BuilderEffects; - -namespace TD.Gameplay -{ - /// - /// Per-player set of granted builder effects. Lives on the Player prefab alongside - /// , , and - /// . - /// - /// - /// List of granted kinds. A builder effect carries no per-grant state (no - /// level, no enable/disable toggle) — it's either granted or it isn't — so the granted set - /// is a of values. Stored as - /// byte because NetworkList<T> requires T : IEquatable<T> - /// and plain enums don't implement that (see for the - /// same constraint on a struct); byte already does, for free. - /// - /// Granted via draft. - /// calls when a player picks it. Effects are permanent for - /// the match — there is no revoke. - /// - /// Query, don't snapshot. Consumers (e.g. awarding - /// kill gold) query this manager live at the point of use rather than towers caching their - /// own copy — every tower a player owns benefits immediately, including ones built before - /// the effect was granted. - /// - /// Generic accessor, not one method per effect. - /// is the only way to read an effect's tunable data. - /// This keeps the API surface fixed as the effect roster grows — a new effect kind adds a - /// call site where it's consumed (e.g. a new line in WaveManager), not a new method - /// here. - /// - public class BuilderUpgradeManager : NetworkBehaviour - { - // ----- Static registry (mirrors PlayerGoldManager / PlayerTowerDeck) ----- - - private static readonly Dictionary s_byClientId - = new Dictionary(); - - /// Returns the manager owned by the given client, or null. - public static BuilderUpgradeManager GetForClient(ulong clientId) - { - s_byClientId.TryGetValue(clientId, out var mgr); - return mgr; - } - - /// Convenience: the local client's own manager. - public static BuilderUpgradeManager Local - { - get - { - var nm = NetworkManager.Singleton; - if (nm == null || !nm.IsClient) return null; - return GetForClient(nm.LocalClientId); - } - } - - // ----- Networked state -------------------------------------------- - - // Granted effect kinds, stored as byte (see class remarks for why not the enum - // directly). readPerm Everyone (consistent with the other per-player managers); - // writePerm Server — both are NetworkList's defaults. - private readonly NetworkList grantedKinds = new NetworkList(); - - /// Fired on every peer when a new effect is granted. - public event System.Action OnUpgradesChanged; - - // ----- NGO lifecycle ------------------------------------------------ - - public override void OnNetworkSpawn() - { - s_byClientId[OwnerClientId] = this; - grantedKinds.OnListChanged += HandleGrantedKindsChanged; - } - - public override void OnNetworkDespawn() - { - grantedKinds.OnListChanged -= HandleGrantedKindsChanged; - - if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) - s_byClientId.Remove(OwnerClientId); - } - - private void HandleGrantedKindsChanged(NetworkListEvent change) => OnUpgradesChanged?.Invoke(); - - // ----- Read API ----------------------------------------------------- - - /// True if this player has been granted the given effect. - public bool PlayerHasEffect(BuilderEffectKind kind) => grantedKinds.Contains((byte)kind); - - /// - /// Returns this player's for - /// as , or null if the player doesn't have it (or the pool has no - /// asset for it). Callers extract whatever field they need — see the "generic accessor" - /// note above for why this isn't a per-effect method. - /// - public T GetEffectDefinition(BuilderEffectKind kind) where T : BuilderEffectDefinition - => PlayerHasEffect(kind) ? BuilderEffectPool.Instance?.Get(kind) as T : null; - - // ----- Server mutation ----------------------------------------------- - - /// - /// Server-only: grants the given effect (a draft pick). No-op if already granted. - /// Returns true if it was actually granted. - /// - public bool ServerGrantEffect(BuilderEffectKind kind) - { - if (!IsServer) return false; - - byte value = (byte)kind; - if (grantedKinds.Contains(value)) return false; - - grantedKinds.Add(value); - return true; - } - } -} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs.meta deleted file mode 100644 index 6da307b..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 72dac94cde24af07ea0b5c77b228be34 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs deleted file mode 100644 index fb91dda..0000000 --- a/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs -using UnityEngine; -using TD.Core; -using TD.Gameplay.BuilderEffects; - -namespace TD.Gameplay.Draft -{ - /// - /// Draft choice #2 — "gain a builder effect". Grants the player a passive effect that - /// applies to every tower they own, adding it to their . - /// - /// - /// Unlike , this carries the - /// directly rather than an asset reference — there's no id to resolve, the enum value is the - /// stable identifier and - /// already key off of. - /// - [CreateAssetMenu(fileName = "BuilderEffectOption", menuName = "TD/Draft/Builder Effect Option")] - public class BuilderEffectDraftOption : DraftOption - { - [Header("Payload")] - [Tooltip("The builder effect this option grants.")] - public BuilderEffectKind Kind; - - public override bool IsValidFor(ulong clientId) - { - var upgrades = BuilderUpgradeManager.GetForClient(clientId); - return upgrades != null && !upgrades.PlayerHasEffect(Kind); - } - - public override bool ServerApply(ulong clientId) - { - var upgrades = BuilderUpgradeManager.GetForClient(clientId); - return upgrades != null && upgrades.ServerGrantEffect(Kind); - } - } -} diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs.meta b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs.meta deleted file mode 100644 index b0d473b..0000000 --- a/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 4eaef3264612070c48fbc6a987c89858 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/WaveManager.cs b/Assets/_Project/Scripts/Gameplay/WaveManager.cs index d1d889b..5c8f7dd 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveManager.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveManager.cs @@ -3,7 +3,6 @@ using System.Collections; using Unity.Netcode; using UnityEngine; using TD.Core; -using TD.Gameplay.BuilderEffects; using TD.Gameplay.Draft; using TD.Levels; using TD.UI; @@ -525,31 +524,22 @@ namespace TD.Gameplay var goldEntry = goldConfig?.GetWaveEntry(currentWaveIndex + 1); if (goldEntry != null) killReward = goldEntry.GoldPerEnemy; - // Award kill gold to the tower owner that landed the killing blow. The builder's - // "gold per kill" effect (if granted) is queried live here rather than cached on - // the killing tower — see BuilderUpgradeManager's "query, don't snapshot" note. + // Award kill gold to the tower owner that landed the killing blow. PlayerSlot killerSlot = health.LastHitOwner; - int totalReward = killReward; if (killerSlot != PlayerSlot.None && killReward > 0) { var pms = PlayerMatchState.GetForSlot(killerSlot); if (pms != null) - { - var gpk = BuilderUpgradeManager.GetForClient(pms.OwnerClientId) - ?.GetEffectDefinition(BuilderEffectKind.GoldPerKill); - totalReward = killReward + (gpk?.BonusGoldPerKill ?? 0); - PlayerGoldManager.GetForClient(pms.OwnerClientId) - ?.AwardGold(totalReward); - } + ?.AwardGold(killReward); } // Show a "+N" gold popup above the corpse on every peer. Capture the // position here on the server — by the time the RPC fires on clients // the death sequence will be moving the corpse, but the spawn point // is good enough and we want the popup to anchor where the kill happened. - if (totalReward > 0) - ShowGoldRewardClientRpc(health.transform.position, totalReward); + if (killReward > 0) + ShowGoldRewardClientRpc(health.transform.position, killReward); UnsubscribeEnemy(health); DecrementAndCheckComplete();