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
This commit is contained in:
Pedro Gomes 2024-07-28 16:37:22 +01:00
parent fd0e2d7d19
commit 5569dd2b06
10 changed files with 127 additions and 50 deletions

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -15,4 +15,5 @@ MonoBehaviour:
zoneName: Dayard
levelName: 4-Dayard
isHostileZone: 1
possibleEnemies: 0400000002000000
spawnPoints: []

View File

@ -15,3 +15,5 @@ MonoBehaviour:
zoneName: Skellyard
levelName: 4-Skellyard
isHostileZone: 1
possibleEnemies: 0000000001000000
spawnPoints: []

View File

@ -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)

View File

@ -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<Transform> spawnPoints = new List<Transform>();
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<int, int>();
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);
}
}

View File

@ -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)
{

View File

@ -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<EnemyID> possibleEnemies = new List<EnemyID>();
[Header("Runtime Data:")]
public List<Transform> spawnPoints = new List<Transform>();

View File

@ -94,7 +94,7 @@ Material:
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Rotation: 7.045085
- _Rotation: 0.74223155
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1