From 5dcbd3c313e0030c718a2560c26a2206e7d87140 Mon Sep 17 00:00:00 2001 From: myondev Date: Tue, 3 Mar 2026 09:16:19 -0800 Subject: [PATCH] fix upgrades --- Assets/Scenes/Game.unity | 348 ++++++++++++++++++ Assets/Scripts/Abilities/AbilityManager.cs | 84 ++--- Assets/Scripts/Abilities/AbilityUIHandler.cs | 10 +- Assets/Scripts/Abilities/AbilityUIObject.cs | 7 +- .../PlayerAbilities/PlayerAbility.cs | 35 +- .../Abilities/Upgrades/AbilityUpgrade.cs | 11 +- .../Abilities/Upgrades/AttackSpeedUpgrade.cs | 3 +- .../Upgrades/ProjectileCountUpgrade.cs | 4 +- .../Abilities/Upgrades/UpgradeBoxUI.cs | 3 +- Assets/Scripts/Entities/Enemy/Enemy.cs | 7 + Assets/Scripts/Entities/Enemy/EnemySpawner.cs | 16 +- Assets/Scripts/Entities/Entity.cs | 4 +- Assets/Scripts/Entities/Marisa.cs | 13 + Assets/Scripts/LevelSwitcher.cs | 9 + Assets/Scripts/LevelSwitcher.cs.meta | 2 + Assets/Scripts/StoredAbilityUpgradeUI.cs | 2 +- ProjectSettings/Physics2DSettings.asset | 2 +- 17 files changed, 477 insertions(+), 83 deletions(-) create mode 100644 Assets/Scripts/LevelSwitcher.cs create mode 100644 Assets/Scripts/LevelSwitcher.cs.meta diff --git a/Assets/Scenes/Game.unity b/Assets/Scenes/Game.unity index 8492177..c050729 100644 --- a/Assets/Scenes/Game.unity +++ b/Assets/Scenes/Game.unity @@ -255,6 +255,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 161505811} m_CullTransparentMesh: 1 +--- !u!1 &229603538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 229603539} + - component: {fileID: 229603541} + - component: {fileID: 229603540} + m_Layer: 5 + m_Name: PlayerHealthBarBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &229603539 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 229603538} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1008626378} + m_Father: {fileID: 1935311237} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 350, y: 220} + m_SizeDelta: {x: 660, y: 60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &229603540 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 229603538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.11320752, g: 0.11320752, b: 0.11320752, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &229603541 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 229603538} + m_CullTransparentMesh: 1 --- !u!1 &342414423 GameObject: m_ObjectHideFlags: 0 @@ -400,6 +476,42 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 342414423} m_CullTransparentMesh: 1 +--- !u!1 &351951401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 351951402} + m_Layer: 5 + m_Name: BossUI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &351951402 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351951401} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1034624966} + m_Father: {fileID: 1935311237} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &382827736 GameObject: m_ObjectHideFlags: 0 @@ -501,6 +613,10 @@ PrefabInstance: propertyPath: cam value: objectReference: {fileID: 519420031} + - target: {fileID: 5275979051295637757, guid: 8764555a5fdde3428903d7ac06f8ff7f, type: 3} + propertyPath: hpBarUI + value: + objectReference: {fileID: 1008626378} - target: {fileID: 5661264056639479186, guid: 8764555a5fdde3428903d7ac06f8ff7f, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -1737,6 +1853,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 944240573} m_CullTransparentMesh: 1 +--- !u!1 &1008626377 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1008626378} + - component: {fileID: 1008626380} + - component: {fileID: 1008626379} + m_Layer: 5 + m_Name: PlayerHealthBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1008626378 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1008626377} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 229603539} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: 0} + m_SizeDelta: {x: -10, y: -10} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1008626379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1008626377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.0047169924, b: 0.0047169924, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1008626380 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1008626377} + m_CullTransparentMesh: 1 --- !u!1001 &1014855760 PrefabInstance: m_ObjectHideFlags: 0 @@ -1950,6 +2141,82 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a75a4c92b7f4707cb82c77fef57ae2b3, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1034624965 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1034624966} + - component: {fileID: 1034624968} + - component: {fileID: 1034624967} + m_Layer: 5 + m_Name: HealthBarBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1034624966 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034624965} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1923631094} + m_Father: {fileID: 351951402} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -120} + m_SizeDelta: {x: 1200, y: 60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1034624967 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034624965} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.20754719, g: 0.20754719, b: 0.20754719, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1034624968 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034624965} + m_CullTransparentMesh: 1 --- !u!1 &1108889697 GameObject: m_ObjectHideFlags: 0 @@ -2511,6 +2778,8 @@ MonoBehaviour: player: {fileID: 394036756} upgradeToAdd: {fileID: 11400000, guid: 6fe34d7ec95c2ce1fac0727c553b5f0b, type: 2} upgradeButton: {fileID: 0} + allUpgrades: + - {fileID: 11400000, guid: 6fe34d7ec95c2ce1fac0727c553b5f0b, type: 2} --- !u!4 &1432589379 Transform: m_ObjectHideFlags: 0 @@ -3293,6 +3562,81 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a75a4c92b7f4707cb82c77fef57ae2b3, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1923631093 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1923631094} + - component: {fileID: 1923631096} + - component: {fileID: 1923631095} + m_Layer: 5 + m_Name: HealthBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1923631094 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1923631093} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1034624966} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1923631095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1923631093} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.1745283, b: 0.1745283, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1923631096 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1923631093} + m_CullTransparentMesh: 1 --- !u!1 &1935311233 GameObject: m_ObjectHideFlags: 0 @@ -3391,6 +3735,8 @@ RectTransform: - {fileID: 1493212142} - {fileID: 5007058640176408060} - {fileID: 342414424} + - {fileID: 351951402} + - {fileID: 229603539} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -3536,6 +3882,8 @@ MonoBehaviour: currentSpawnTime: 0 bossEnemy: {fileID: 2525771944862034798, guid: ca7ae32805f29008d963b8443490ef42, type: 3} bossSpawnPoint: {fileID: 382827739} + bossUI: {fileID: 351951401} + bossHealthBar: {fileID: 1923631094} enemyFolder: {fileID: 1319590957} player: {fileID: 1582287016} --- !u!4 &1972076835 diff --git a/Assets/Scripts/Abilities/AbilityManager.cs b/Assets/Scripts/Abilities/AbilityManager.cs index a2da1fd..7c0b9bb 100644 --- a/Assets/Scripts/Abilities/AbilityManager.cs +++ b/Assets/Scripts/Abilities/AbilityManager.cs @@ -21,18 +21,12 @@ public class AbilityManager : MonoBehaviour } #endregion - - public class StoredUpgrade - { - public AbilityUpgrade upgrade; - public int count; - } public MarisaAbilityHandler player; public AbilityUpgrade upgradeToAdd; public Button upgradeButton; - - [Header("Upgrades")] - public HashSet upgradesInventory = new(); + [Header("Upgrades")] + public AbilityUpgrade[] allUpgrades; + public Dictionary upgradesInventory = new(); private void Start() { // upgradeButton.onClick.AddListener((() => AddUpgrade(upgradeToAdd, player.mainAttackInstance))); @@ -41,72 +35,42 @@ public class AbilityManager : MonoBehaviour public void StoreUpgrade(AbilityUpgrade upgradeToStore) { - foreach (StoredUpgrade storedUpgrade in upgradesInventory) + if (!upgradesInventory.ContainsKey(upgradeToStore)) { - if (storedUpgrade.upgrade == upgradeToStore) - { - storedUpgrade.count++; - Debug.Log($"Added upgrade {storedUpgrade.upgrade.upgradeName}. Current count: {storedUpgrade.count}"); - AbilityUIHandler.instance.UpdateInventory(); - return; - } + upgradesInventory[upgradeToStore] = 0; } - - StoredUpgrade newUpgrade = new() - { - upgrade = upgradeToStore, - count = 1 - }; - upgradesInventory.Add(newUpgrade); - Debug.Log($"Added upgrade {newUpgrade.upgrade.upgradeName}. Current count: {newUpgrade.count}"); + upgradesInventory[upgradeToStore]++; + Debug.Log($"Added upgrade {upgradeToStore.upgradeName}. Current count: {upgradesInventory[upgradeToStore]}"); AbilityUIHandler.instance.UpdateInventory(); } + + public int GetUpgradeCount(AbilityUpgrade upgrade) + { + if (!upgradesInventory.ContainsKey(upgrade)) + { + return 0; + } + return upgradesInventory[upgrade]; + } public void AddUpgrade(AbilityUpgrade upgrade, PlayerAbility ability) { - foreach (StoredUpgrade storedUpgrade in upgradesInventory.ToArray()) + if (upgradesInventory.ContainsKey(upgrade)) { - if (storedUpgrade.upgrade == upgrade) + upgradesInventory[upgrade]--; + if (upgradesInventory[upgrade] <= 0) { - storedUpgrade.count--; - if (storedUpgrade.count <= 0) - { - upgradesInventory.Remove(storedUpgrade); - AbilityUIHandler.instance.UpdateInventory(); - } - if (!ability.attachedUpgrades.Contains(upgrade)) - { - AbilityUpgrade newUpgrade = Instantiate(upgrade, ability.transform); - ability.attachedUpgrades.Add(newUpgrade); - newUpgrade.thisPlayerAbility = ability; - newUpgrade.ApplyUpgrade(); - } - else - { - ability.attachedUpgrades.TryGetValue(upgrade, out AbilityUpgrade foundUpgrade); - if (foundUpgrade) - { - foundUpgrade.count++; - foundUpgrade.ApplyUpgrade(); - } - } + upgradesInventory.Remove(upgrade); } + ability.AddUpgrade(upgrade); + AbilityUIHandler.instance.UpdateInventory(); } } public void RemoveUpgrade(AbilityUpgrade upgrade, PlayerAbility ability) { - if (ability.attachedUpgrades.TryGetValue(upgrade, out AbilityUpgrade foundUpgrade)) + if (ability.RemoveUpgrade(upgrade)) { - if (foundUpgrade.count > 1) - { - foundUpgrade.ApplyRemoval(); - foundUpgrade.count--; - } - else - { - foundUpgrade.ApplyRemoval(); - ability.attachedUpgrades.Remove(foundUpgrade); - } + StoreUpgrade(upgrade); } } } diff --git a/Assets/Scripts/Abilities/AbilityUIHandler.cs b/Assets/Scripts/Abilities/AbilityUIHandler.cs index ecc7f81..9da92ed 100644 --- a/Assets/Scripts/Abilities/AbilityUIHandler.cs +++ b/Assets/Scripts/Abilities/AbilityUIHandler.cs @@ -45,10 +45,14 @@ public class AbilityUIHandler : MonoBehaviour { Destroy(child.gameObject); } - foreach (AbilityManager.StoredUpgrade storedUpgrade in AbilityManager.instance.upgradesInventory) + foreach (AbilityUpgrade upgrade in AbilityManager.instance.allUpgrades) { - StoredAbilityUpgradeUI newUI = Instantiate(templateStoredUpgradeUI, upgradeGrid); - newUI.SetUpgrade(storedUpgrade.upgrade, storedUpgrade.count); + int upgradeCount = AbilityManager.instance.GetUpgradeCount(upgrade); + if (upgradeCount > 0) + { + StoredAbilityUpgradeUI newUI = Instantiate(templateStoredUpgradeUI, upgradeGrid); + newUI.SetUpgrade(upgrade, upgradeCount); + } } } } diff --git a/Assets/Scripts/Abilities/AbilityUIObject.cs b/Assets/Scripts/Abilities/AbilityUIObject.cs index 21e118a..1cee698 100644 --- a/Assets/Scripts/Abilities/AbilityUIObject.cs +++ b/Assets/Scripts/Abilities/AbilityUIObject.cs @@ -34,9 +34,12 @@ public class AbilityUIObject : MonoBehaviour piercing.text = $"Piercing: {isBullet.pierceAmount}"; projectileCount.text = $"Projectiles: {isBullet.projectileCount}"; } - foreach (AbilityUpgrade upgrade in thisAbility.attachedUpgrades) + foreach (AbilityUpgrade upgrade in AbilityManager.instance.allUpgrades) { - AddUpgradeBox(upgrade); + if (thisAbility.GetUpgradeCount(upgrade) > 0) + { + AddUpgradeBox(upgrade); + } } int upgradeBoxesToAdd = Math.Abs(upgradeSlotAmount - upgradeBoxes.Count); diff --git a/Assets/Scripts/Abilities/PlayerAbilities/PlayerAbility.cs b/Assets/Scripts/Abilities/PlayerAbilities/PlayerAbility.cs index e2488e9..0df0c71 100644 --- a/Assets/Scripts/Abilities/PlayerAbilities/PlayerAbility.cs +++ b/Assets/Scripts/Abilities/PlayerAbilities/PlayerAbility.cs @@ -15,7 +15,7 @@ public class PlayerAbility : MonoBehaviour [Header("Stats")] public float power; public float projectileCount; - public HashSet attachedUpgrades = new(); + public Dictionary attachedUpgrades = new(); public void TryAbility() { @@ -37,4 +37,37 @@ public class PlayerAbility : MonoBehaviour currentCooldown -= Time.deltaTime; } } + + public void AddUpgrade(AbilityUpgrade upgrade) + { + if (!attachedUpgrades.ContainsKey(upgrade)) + { + attachedUpgrades[upgrade] = 0; + } + attachedUpgrades[upgrade]++; + upgrade.ApplyUpgrade(this); + } + + public bool RemoveUpgrade(AbilityUpgrade upgrade) + { + if (attachedUpgrades.ContainsKey(upgrade)) + { + attachedUpgrades[upgrade]--; + if (attachedUpgrades[upgrade] >= 0) + { + attachedUpgrades.Remove(upgrade); + } + upgrade.ApplyRemoval(this); + return true; + } + return false; + } + public int GetUpgradeCount(AbilityUpgrade upgrade) + { + if (!attachedUpgrades.ContainsKey(upgrade)) + { + return 0; + } + return attachedUpgrades[upgrade]; + } } diff --git a/Assets/Scripts/Abilities/Upgrades/AbilityUpgrade.cs b/Assets/Scripts/Abilities/Upgrades/AbilityUpgrade.cs index 08103df..6f289c0 100644 --- a/Assets/Scripts/Abilities/Upgrades/AbilityUpgrade.cs +++ b/Assets/Scripts/Abilities/Upgrades/AbilityUpgrade.cs @@ -5,21 +5,20 @@ public class AbilityUpgrade : ScriptableObject [Header("Identification")] public string upgradeName; public Sprite upgradeIcon; - public PlayerAbility thisPlayerAbility; [Header("Stats")] - public int count = 1; + public PlayerAbility thisPlayerAbility; - public virtual void ApplyUpgrade() + public void ApplyUpgrade(PlayerAbility abilityToUpgrade) { - UpgradeEffects(); + UpgradeEffects(abilityToUpgrade); } - protected virtual void UpgradeEffects() + protected virtual void UpgradeEffects(PlayerAbility abilityToUpgrade) { } - public virtual void ApplyRemoval() + public virtual void ApplyRemoval(PlayerAbility abilityToRemove) { } diff --git a/Assets/Scripts/Abilities/Upgrades/AttackSpeedUpgrade.cs b/Assets/Scripts/Abilities/Upgrades/AttackSpeedUpgrade.cs index 859ff2a..3ab3a5f 100644 --- a/Assets/Scripts/Abilities/Upgrades/AttackSpeedUpgrade.cs +++ b/Assets/Scripts/Abilities/Upgrades/AttackSpeedUpgrade.cs @@ -4,9 +4,8 @@ public class AttackSpeedUpgrade : AbilityUpgrade { [SerializeField] private float speedUpgradeAmount; - public override void ApplyUpgrade() + protected override void UpgradeEffects(PlayerAbility abilityToUpgrade) { - base.ApplyUpgrade(); thisPlayerAbility.cooldown *= speedUpgradeAmount; } } diff --git a/Assets/Scripts/Abilities/Upgrades/ProjectileCountUpgrade.cs b/Assets/Scripts/Abilities/Upgrades/ProjectileCountUpgrade.cs index fcfc4cc..a3ab657 100644 --- a/Assets/Scripts/Abilities/Upgrades/ProjectileCountUpgrade.cs +++ b/Assets/Scripts/Abilities/Upgrades/ProjectileCountUpgrade.cs @@ -3,8 +3,8 @@ using UnityEngine; [CreateAssetMenu(fileName = "Projectile Count Upgrade", menuName = "AbilityUpgrades/ProjectileCountUpgrade")] public class ProjectileCountUpgrade : AbilityUpgrade { - protected override void UpgradeEffects() + protected override void UpgradeEffects(PlayerAbility abilityToUpgrade) { - thisPlayerAbility.projectileCount++; //idk how this will work for the stacking. + abilityToUpgrade.projectileCount++; //idk how this will work for the stacking. } } diff --git a/Assets/Scripts/Abilities/Upgrades/UpgradeBoxUI.cs b/Assets/Scripts/Abilities/Upgrades/UpgradeBoxUI.cs index c5fe97e..4a3235a 100644 --- a/Assets/Scripts/Abilities/Upgrades/UpgradeBoxUI.cs +++ b/Assets/Scripts/Abilities/Upgrades/UpgradeBoxUI.cs @@ -17,12 +17,11 @@ public class UpgradeBoxUI : MonoBehaviour, IDropHandler return; } counterUI.gameObject.SetActive(true); - counterUI.text = $"x{thisAbilityUpgrade.count}"; + counterUI.text = $"x{thisPlayerAbility.attachedUpgrades[thisAbilityUpgrade]}"; } public void OnDrop(PointerEventData eventData) { - Debug.Log("A"); if (eventData.pointerDrag.TryGetComponent(out StoredAbilityUpgradeUI isStoredUpgrade) && (!thisAbilityUpgrade || isStoredUpgrade.storedUpgrade == thisAbilityUpgrade)) { thisAbilityUpgrade = isStoredUpgrade.storedUpgrade; diff --git a/Assets/Scripts/Entities/Enemy/Enemy.cs b/Assets/Scripts/Entities/Enemy/Enemy.cs index 0555a93..458ef4d 100644 --- a/Assets/Scripts/Entities/Enemy/Enemy.cs +++ b/Assets/Scripts/Entities/Enemy/Enemy.cs @@ -12,6 +12,7 @@ public class Enemy : Entity public EnemyAbility ability; public float currentCooldown; } + public static event Action OnDamaged; [Header("Targetting")] public Entity closestTarget; public float engagementRange; @@ -112,6 +113,12 @@ public class Enemy : Entity } } + public override void TakeDamage(float damage) + { + base.TakeDamage(damage); + OnDamaged?.Invoke(); + } + protected virtual void DropUpgrade(UpgradeDrop drop) { float random = Random.Range(0, 100); diff --git a/Assets/Scripts/Entities/Enemy/EnemySpawner.cs b/Assets/Scripts/Entities/Enemy/EnemySpawner.cs index 37608c8..069078b 100644 --- a/Assets/Scripts/Entities/Enemy/EnemySpawner.cs +++ b/Assets/Scripts/Entities/Enemy/EnemySpawner.cs @@ -29,10 +29,14 @@ public class EnemySpawner : MonoBehaviour [SerializeField] private float currentSpawnTime; [Header("Boss")] public Enemy bossEnemy; + private Enemy bossEnemyInstance; public Transform bossSpawnPoint; + [SerializeField] private GameObject bossUI; + [SerializeField] private Transform bossHealthBar; [Header("Cache")] [SerializeField] private Transform enemyFolder; [SerializeField] private Marisa player; + private void Update() { if (canSpawn) @@ -46,16 +50,24 @@ public class EnemySpawner : MonoBehaviour } } - public void SpawnEnemy(Enemy enemy, Vector3 location) + public Enemy SpawnEnemy(Enemy enemy, Vector3 location) { Enemy newEnemy = Instantiate(enemy, location, Quaternion.identity); newEnemy.transform.SetParent(enemyFolder); newEnemy.closestTarget = player; //idk if there's actually gonna be any other target lol + return newEnemy; } public void StartBoss() { - SpawnEnemy(bossEnemy, bossSpawnPoint.position); + bossEnemyInstance = SpawnEnemy(bossEnemy, bossSpawnPoint.position); + bossUI.SetActive(true); canSpawn = false; + Enemy.OnDamaged += UpdateBossHealthBar; //this kinda sucks but it technically works?? + } + + private void UpdateBossHealthBar() + { + bossHealthBar.localScale = new Vector3(Math.Clamp(bossEnemyInstance.health / bossEnemyInstance.maxHealth, 0, bossEnemyInstance.maxHealth), 1, 1); } } diff --git a/Assets/Scripts/Entities/Entity.cs b/Assets/Scripts/Entities/Entity.cs index f232a86..ddf1852 100644 --- a/Assets/Scripts/Entities/Entity.cs +++ b/Assets/Scripts/Entities/Entity.cs @@ -1,3 +1,4 @@ +using System; using UnityEngine; public class Entity : MonoBehaviour @@ -11,6 +12,7 @@ public class Entity : MonoBehaviour [Header("Stats")] public float health; public float maxHealth; + [Header("Movement")] [SerializeField] private bool isFacingRight; [SerializeField] protected Rigidbody2D rb; @@ -37,7 +39,7 @@ public class Entity : MonoBehaviour rb.linearVelocity = moveDirection * speed; } } - public void TakeDamage(float damage) + public virtual void TakeDamage(float damage) { health -= damage; if (health < 0) diff --git a/Assets/Scripts/Entities/Marisa.cs b/Assets/Scripts/Entities/Marisa.cs index 2479cd7..51aff62 100644 --- a/Assets/Scripts/Entities/Marisa.cs +++ b/Assets/Scripts/Entities/Marisa.cs @@ -9,6 +9,8 @@ public class Marisa : Entity public Vector2 mouseWorldPos; public Transform firingPointBase; public Transform firingPoint; + [Header("UI")] + [SerializeField] private Transform hpBarUI; private void Update() { mouseWorldPos = cam.ScreenToWorldPoint(Input.mousePosition); @@ -20,4 +22,15 @@ public class Marisa : Entity moveDirection = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); base.FixedUpdate(); } + + public override void TakeDamage(float damage) + { + base.TakeDamage(damage); + UpdateHealthUI(); + } + + private void UpdateHealthUI() + { + hpBarUI.localScale = new Vector3(Math.Clamp(health/maxHealth,0,maxHealth), 1,1); + } } diff --git a/Assets/Scripts/LevelSwitcher.cs b/Assets/Scripts/LevelSwitcher.cs new file mode 100644 index 0000000..5745956 --- /dev/null +++ b/Assets/Scripts/LevelSwitcher.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +public class LevelSwitcher : MonoBehaviour +{ + public void ChangeLevel() + { + + } +} diff --git a/Assets/Scripts/LevelSwitcher.cs.meta b/Assets/Scripts/LevelSwitcher.cs.meta new file mode 100644 index 0000000..0d2de1c --- /dev/null +++ b/Assets/Scripts/LevelSwitcher.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 717ca245990ccea7580364c54b200c8d \ No newline at end of file diff --git a/Assets/Scripts/StoredAbilityUpgradeUI.cs b/Assets/Scripts/StoredAbilityUpgradeUI.cs index 9dd2adb..650dd11 100644 --- a/Assets/Scripts/StoredAbilityUpgradeUI.cs +++ b/Assets/Scripts/StoredAbilityUpgradeUI.cs @@ -21,7 +21,7 @@ public class StoredAbilityUpgradeUI : MonoBehaviour, IBeginDragHandler, IDragHan public void OnBeginDrag(PointerEventData eventData) { - parentAfterDrag = transform.parent; + parentAfterDrag = icon.transform.parent; icon.raycastTarget = false; icon.transform.SetParent(transform.root); icon.transform.SetAsLastSibling(); diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset index aeda816..36f3faa 100644 --- a/ProjectSettings/Physics2DSettings.asset +++ b/ProjectSettings/Physics2DSettings.asset @@ -53,4 +53,4 @@ Physics2DSettings: m_ReuseCollisionCallbacks: 1 m_AutoSyncTransforms: 0 m_GizmoOptions: 10 - m_LayerCollisionMatrix: 010000000000000000000000400000000000000000000000c801000040000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + m_LayerCollisionMatrix: 010000000000000000000000400000000000000000000000c803000040000000400000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000