From 5569dd2b069d4465a0c13bf376186a3798669ff8 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 28 Jul 2024 16:37:22 +0100 Subject: [PATCH] Enemy spawning update - spawning is now taken care by the actual gamescene based on the zone data, instead of network manager - each zone data now have a list of possible enemies for that specific zone --- Assets/Scenes/4-Dayard.unity | 1 + Assets/Scenes/4-RiftHuntersInn.unity | 1 + Assets/Scenes/4-Skellyard.unity | 1 + Assets/Scriptables/Data/1-Zones/Dayard.asset | 1 + .../Scriptables/Data/1-Zones/Skellyard.asset | 2 + Assets/Scripts/Game/GameConstants.cs | 134 ++++++++++++------ Assets/Scripts/Networking/GameScene.cs | 26 +++- Assets/Scripts/Networking/NetworkManager.cs | 6 +- .../Scripts/RiftSystem/ZoneData/ZoneData.cs | 3 + Assets/Starfield Skybox/Skybox.mat | 2 +- 10 files changed, 127 insertions(+), 50 deletions(-) diff --git a/Assets/Scenes/4-Dayard.unity b/Assets/Scenes/4-Dayard.unity index e0436b83..ca1e3bfd 100644 --- a/Assets/Scenes/4-Dayard.unity +++ b/Assets/Scenes/4-Dayard.unity @@ -381,6 +381,7 @@ MonoBehaviour: m_EditorClassIdentifier: zone: {fileID: 11400000, guid: c9e3493130481e84e926fcce855a1ecb, type: 2} onGameSceneLoaded: {fileID: 11400000, guid: ddf05d34e629c254f998bd0db6da0481, type: 2} + onSpawnRiftRequest: {fileID: 11400000, guid: 8e3f503514db5934d965671de2695496, type: 2} spawnPoints: - {fileID: 189844204} - {fileID: 1188928028} diff --git a/Assets/Scenes/4-RiftHuntersInn.unity b/Assets/Scenes/4-RiftHuntersInn.unity index adbc0dca..87da761c 100644 --- a/Assets/Scenes/4-RiftHuntersInn.unity +++ b/Assets/Scenes/4-RiftHuntersInn.unity @@ -493,6 +493,7 @@ MonoBehaviour: m_EditorClassIdentifier: zone: {fileID: 11400000, guid: e36ea6b9660389f45a604d7075de7d4b, type: 2} onGameSceneLoaded: {fileID: 11400000, guid: ddf05d34e629c254f998bd0db6da0481, type: 2} + onSpawnRiftRequest: {fileID: 11400000, guid: 8e3f503514db5934d965671de2695496, type: 2} spawnPoints: - {fileID: 1965174616} - {fileID: 1163712637} diff --git a/Assets/Scenes/4-Skellyard.unity b/Assets/Scenes/4-Skellyard.unity index 9778a93b..a65f46b0 100644 --- a/Assets/Scenes/4-Skellyard.unity +++ b/Assets/Scenes/4-Skellyard.unity @@ -381,6 +381,7 @@ MonoBehaviour: m_EditorClassIdentifier: zone: {fileID: 11400000, guid: 5b6467b6a4765974a8a36e80982c566e, type: 2} onGameSceneLoaded: {fileID: 11400000, guid: ddf05d34e629c254f998bd0db6da0481, type: 2} + onSpawnRiftRequest: {fileID: 11400000, guid: 8e3f503514db5934d965671de2695496, type: 2} spawnPoints: - {fileID: 189844204} - {fileID: 1188928028} diff --git a/Assets/Scriptables/Data/1-Zones/Dayard.asset b/Assets/Scriptables/Data/1-Zones/Dayard.asset index 02675194..9778b7f0 100644 --- a/Assets/Scriptables/Data/1-Zones/Dayard.asset +++ b/Assets/Scriptables/Data/1-Zones/Dayard.asset @@ -15,4 +15,5 @@ MonoBehaviour: zoneName: Dayard levelName: 4-Dayard isHostileZone: 1 + possibleEnemies: 0400000002000000 spawnPoints: [] diff --git a/Assets/Scriptables/Data/1-Zones/Skellyard.asset b/Assets/Scriptables/Data/1-Zones/Skellyard.asset index 5824b8eb..cc886e1f 100644 --- a/Assets/Scriptables/Data/1-Zones/Skellyard.asset +++ b/Assets/Scriptables/Data/1-Zones/Skellyard.asset @@ -15,3 +15,5 @@ MonoBehaviour: zoneName: Skellyard levelName: 4-Skellyard isHostileZone: 1 + possibleEnemies: 0000000001000000 + spawnPoints: [] diff --git a/Assets/Scripts/Game/GameConstants.cs b/Assets/Scripts/Game/GameConstants.cs index 6c904ed5..187cfc5a 100644 --- a/Assets/Scripts/Game/GameConstants.cs +++ b/Assets/Scripts/Game/GameConstants.cs @@ -1,3 +1,5 @@ +using static GameConstants.EnemySpawning; + public static class GameConstants { public static class PlayerPrefsKeys @@ -37,53 +39,97 @@ public static class GameConstants public static class CharacterBalancing { - public static int StatPointsPerLevel = 1; + public const int StatPointsPerLevel = 1; - public static float SoloCheatDeathHealthPercent = 0.5f; - public static float SoloCheatDeathInvulnerabilityDuration = 3f; + public const float SoloCheatDeathHealthPercent = 0.5f; + public const float SoloCheatDeathInvulnerabilityDuration = 3f; - public static float GroupBleedOutDuration = 30f; + public const float GroupBleedOutDuration = 30f; - public static float ReviveTriggerRadius = 3f; - public static float ReviveSpeed = 1f; - public static float ReviveTime = 5f; - public static float ReviveHealthPercent = 0.5f; + public const float ReviveTriggerRadius = 3f; + public const float ReviveSpeed = 1f; + public const float ReviveTime = 5f; + public const float ReviveHealthPercent = 0.5f; - public static float PercentageStatScaleForMinions = 0.8f; + public const float PercentageStatScaleForMinions = 0.8f; } public static class GameBalancing { - public static int HealthIntoExperienceMultiplier = 1; + public const int HealthIntoExperienceMultiplier = 1; + + public const int MinimumNumberOfWavesPerRift = 3; + public const int MaximumNumberOfWavesPerRift = 5; + + public const int MinimumQuantityAngrySkelly = 2; + public const int MaximumQuantityAngrySkelly = 5; + + public const int MinimumQuantitySkellyMage = 2; + public const int MaximumQuantitySkellyMage = 5; + + public const int MinimumQuantityVineGolem = 2; + public const int MaximumQuantityVineGolem = 5; + + public const int MinimumQuantityPolygonGolem = 2; + public const int MaximumQuantityPolygonGolem = 5; + + public const int MinimumQuantityLich = 2; + public const int MaximumQuantityLich = 5; - public static int MinimumNumberOfWavesPerRift = 3; - public static int MaximumNumberOfWavesPerRift = 5; + public const float RiftStartSpawningDelay = 1.5f; + public const float RiftDelayBetweenSpawns = 1f; + + public const float BossTargetLockInPhaseDuration = 6f; + + public const float BossSearchForNewTargetLockInDuration = 6f; + + public const float PermaDeathInfoTime = 2f; - public static int MinimumQuantityAngrySkelly = 2; - public static int MaximumQuantityAngrySkelly = 5; - - public static int MinimumQuantitySkellyMage = 2; - public static int MaximumQuantitySkellyMage = 5; - - public static int MinimumQuantityVineGolem = 2; - public static int MaximumQuantityVineGolem = 5; - - public static int MinimumQuantityPolygonGolem = 2; - public static int MaximumQuantityPolygonGolem = 5; - - public static int MinimumQuantityLich = 2; - public static int MaximumQuantityLich = 5; - - public static float RiftDelayBetweenSpawns = 1f; - - public static float BossTargetLockInPhaseDuration = 6f; - - public static float BossSearchForNewTargetLockInDuration = 6f; - - public static float PermaDeathInfoTime = 2f; + public static int GetMinimumQuantityByEnemyID(EnemyID id) + { + switch (id) + { + case EnemyID.AngrySkelly: + return MinimumQuantityAngrySkelly; + case EnemyID.SkellyMage: + return MinimumQuantitySkellyMage; + case EnemyID.VineGolem: + return MinimumQuantityVineGolem; + case EnemyID.PolygonGolem: + return MinimumQuantityPolygonGolem; + case EnemyID.Lich: + return MinimumQuantityLich; + case EnemyID.Count: + return 0; + default: + return 0; + } + } + public static int GetMaximumQuantityByEnemyID(EnemyID id) + { + switch (id) + { + case EnemyID.AngrySkelly: + return MaximumQuantityAngrySkelly; + case EnemyID.SkellyMage: + return MaximumQuantitySkellyMage; + case EnemyID.VineGolem: + return MaximumQuantityVineGolem; + case EnemyID.PolygonGolem: + return MaximumQuantityPolygonGolem; + case EnemyID.Lich: + return MaximumQuantityLich; + case EnemyID.Count: + return 0; + default: + return 0; + } + } } + [System.Serializable] public static class EnemySpawning { + [System.Serializable] public enum EnemyID { AngrySkelly = 0, @@ -110,30 +156,30 @@ public static class GameConstants { #region Network Event Codes - public static byte JobSelection = 112; - public static byte CancelChangeLevelVoted = 114; - public static byte ChangeLevelVoted = 115; - public static byte LoadLevelStarting = 116; + public const byte JobSelection = 112; + public const byte CancelChangeLevelVoted = 114; + public const byte ChangeLevelVoted = 115; + public const byte LoadLevelStarting = 116; #endregion } public static class NetworkPropertyKeys { - public static string AvailableJobsKey = "availableJobs"; + public const string AvailableJobsKey = "availableJobs"; } public static class Sizes { - public static int TotalEquipmentSlots = 6; - public static int TotalInventorySlots = 18; + public const int TotalEquipmentSlots = 6; + public const int TotalInventorySlots = 18; } public static class Scenes { - public static string HuntersInn = "4-RiftHuntersInn"; - public static string Skellyard = "4-Skellyard"; - public static string Dayard = "4-Dayard"; + public const string HuntersInn = "4-RiftHuntersInn"; + public const string Skellyard = "4-Skellyard"; + public const string Dayard = "4-Dayard"; public static string GetSceneNameByZoneName(string zoneName) diff --git a/Assets/Scripts/Networking/GameScene.cs b/Assets/Scripts/Networking/GameScene.cs index eacba812..0664bb79 100644 --- a/Assets/Scripts/Networking/GameScene.cs +++ b/Assets/Scripts/Networking/GameScene.cs @@ -1,3 +1,4 @@ +using Photon.Pun; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -6,8 +7,11 @@ public class GameScene : MonoBehaviour { [SerializeField] private ZoneData zone; [SerializeField] private GameEvent_ZoneData onGameSceneLoaded; + [SerializeField] private GameEvent_RiftSettings onSpawnRiftRequest; [SerializeField] private List spawnPoints = new List(); + RiftSettings riftSettings = new RiftSettings(); + private void Awake() { zone.spawnPoints = spawnPoints; @@ -17,6 +21,26 @@ public class GameScene : MonoBehaviour // Start is called before the first frame update void Start() { - + if (PhotonNetwork.LocalPlayer.IsMasterClient && zone.isHostileZone) + StartCoroutine(SpawnEnemiesWithDelay(zone)); + } + + public IEnumerator SpawnEnemiesWithDelay(ZoneData zoneData) + { + yield return new WaitForSeconds(GameConstants.GameBalancing.RiftStartSpawningDelay); + + riftSettings.zoneData = zoneData; + riftSettings.numberOfWaves = Random.Range(GameConstants.GameBalancing.MinimumNumberOfWavesPerRift, GameConstants.GameBalancing.MaximumNumberOfWavesPerRift); + riftSettings.riftIndex = Random.Range(0, 5); + riftSettings.enemyIndexes_Quantity = new Dictionary(); + riftSettings.bossIndex = (int)zone.possibleEnemies[Random.Range(0, zone.possibleEnemies.Count)]; + + for (int i = 0; i < zone.possibleEnemies.Count; i++) + { + riftSettings.enemyIndexes_Quantity.Add((int)zone.possibleEnemies[i], Random.Range(GameConstants.GameBalancing.GetMinimumQuantityByEnemyID(zone.possibleEnemies[i]), GameConstants.GameBalancing.GetMaximumQuantityByEnemyID(zone.possibleEnemies[i]))); + } + + onSpawnRiftRequest.Raise(riftSettings); + } } diff --git a/Assets/Scripts/Networking/NetworkManager.cs b/Assets/Scripts/Networking/NetworkManager.cs index ddac2f92..996881f5 100644 --- a/Assets/Scripts/Networking/NetworkManager.cs +++ b/Assets/Scripts/Networking/NetworkManager.cs @@ -100,8 +100,6 @@ public class NetworkManager : MonoBehaviourPunCallbacks, IOnEventCallback { ClearVotes(); StartCoroutine(SpawnCharacterWithDelay()); - if (PhotonNetwork.LocalPlayer.IsMasterClient && zoneData.isHostileZone) - StartCoroutine(SpawnEnemiesWithDelay(zoneData)); } public IEnumerator SpawnCharacterWithDelay() @@ -140,7 +138,7 @@ public class NetworkManager : MonoBehaviourPunCallbacks, IOnEventCallback } }*/ - + /* public IEnumerator SpawnEnemiesWithDelay(ZoneData zoneData) { yield return new WaitForSeconds(1f); @@ -160,7 +158,7 @@ public class NetworkManager : MonoBehaviourPunCallbacks, IOnEventCallback }, bossIndex = Random.Range(0, (int)GameConstants.EnemySpawning.EnemyID.Count) }); ; - } + }*/ public override void OnPlayerEnteredRoom(Player newPlayer) { diff --git a/Assets/Scripts/RiftSystem/ZoneData/ZoneData.cs b/Assets/Scripts/RiftSystem/ZoneData/ZoneData.cs index 5d1189d1..cf75d649 100644 --- a/Assets/Scripts/RiftSystem/ZoneData/ZoneData.cs +++ b/Assets/Scripts/RiftSystem/ZoneData/ZoneData.cs @@ -3,6 +3,7 @@ using Kryz.CharacterStats; using System.Collections; using System.Collections.Generic; using UnityEngine; +using static GameConstants.EnemySpawning; [System.Serializable] [CreateAssetMenu(fileName = "ZoneData", menuName = "RiftMayhem/Settings/Zones/ZoneData", order = 0)] @@ -14,6 +15,8 @@ public class ZoneData : ScriptableObject public string levelName; [Header("IsHostileZone:")] public bool isHostileZone = true; + [Header("EnemyIDs:")] + public List possibleEnemies = new List(); [Header("Runtime Data:")] public List spawnPoints = new List(); diff --git a/Assets/Starfield Skybox/Skybox.mat b/Assets/Starfield Skybox/Skybox.mat index b2b1bedf..a2634941 100644 --- a/Assets/Starfield Skybox/Skybox.mat +++ b/Assets/Starfield Skybox/Skybox.mat @@ -94,7 +94,7 @@ Material: - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 - - _Rotation: 7.045085 + - _Rotation: 0.74223155 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1