From 15ea51e4653563641da50e78f8d4b9f91975ed9d Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Sun, 27 Apr 2025 17:15:31 +0300 Subject: [PATCH] add: on clear/fail level functionality --- Assets/Scripts/Enemies/Enemy.cs | 1 + Assets/Scripts/Game/GameController.cs | 49 ++++++++++++++++++++++++-- Assets/Scripts/Game/LevelController.cs | 3 +- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/Enemies/Enemy.cs b/Assets/Scripts/Enemies/Enemy.cs index 086182d..593f40c 100644 --- a/Assets/Scripts/Enemies/Enemy.cs +++ b/Assets/Scripts/Enemies/Enemy.cs @@ -3,6 +3,7 @@ using UnityEngine; public class Enemy : MonoBehaviour { public float hp = 100f; + public GameObject prefab; public void DealDamage(float damage) { hp -= damage; diff --git a/Assets/Scripts/Game/GameController.cs b/Assets/Scripts/Game/GameController.cs index e112906..1b1a0d1 100644 --- a/Assets/Scripts/Game/GameController.cs +++ b/Assets/Scripts/Game/GameController.cs @@ -49,12 +49,51 @@ public class GameController : MonoBehaviour return levels.Find(x => x.scene.name == sceneName); } - public void OnLevelClear(string sceneName, float timeSpent) { - + void RepairLevel(string sceneName) { + levels = levels.Select(li => { + if (li.scene.name == sceneName) { + li.hp = Math.Clamp(li.hp + 20, 0, li.maxHp); + } + return li; + }).ToList(); } - public void OnLevelFailed(string sceneName, float timeSpent) { + void DamageLevels(string sceneName, float timeSpent) { + levels = levels.Select(li => { + if (li.scene.name != sceneName && !IsLevelDestroyed(li.scene.name)) { + int damage = (int)(li.enemies.Values.Sum(x => x) * timeSpent / 10); + li.hp = Math.Clamp(li.hp - damage, 0, li.maxHp); + } + return li; + }).ToList(); + } + void SpawnEnemies(string sceneName, float timeSpent) { + int enemiesToAdd = (int)(timeSpent / 10); + levels.ForEach(li => { + if (li.scene.name == sceneName || IsLevelDestroyed(li.scene.name)) return; + for (int i = 0; i < enemiesToAdd; ++i) AddEnemyInLevel(SelectEnemyWeighted().prefab, li.scene.name); + }); + } + + void AddBullets() { + levels.ForEach(li => { + if (!IsLevelDestroyed(li.scene.name) && li.factory != BulletType.None) inventory[li.factory] += 10; + }); + } + + public void OnLevelClear(string sceneName, float timeSpent) { + RepairLevel(sceneName); + DamageLevels(sceneName, timeSpent); + SpawnEnemies(sceneName, timeSpent); + AddBullets(); + } + + public void OnLevelFailed(string sceneName, float timeSpent, List aliveEnemies) { + aliveEnemies.ForEach(enemy => AddEnemyInLevel(enemy.prefab, sceneName)); + DamageLevels(sceneName, timeSpent); + SpawnEnemies(sceneName, timeSpent * 1.5f); + AddBullets(); } EnemyInfo SelectEnemyWeighted() { @@ -98,6 +137,10 @@ public class GameController : MonoBehaviour _ => "None", }; } + + public bool IsLevelDestroyed(string sceneName) { + return GetLevel(sceneName).hp <= 0; + } } [Serializable] diff --git a/Assets/Scripts/Game/LevelController.cs b/Assets/Scripts/Game/LevelController.cs index 364031f..6e75ec6 100644 --- a/Assets/Scripts/Game/LevelController.cs +++ b/Assets/Scripts/Game/LevelController.cs @@ -24,6 +24,7 @@ public class LevelController : MonoBehaviour Vector2 circle = Random.insideUnitCircle * spawnPointInfo.radius; Vector3 spawnVector = spawnPointInfo.transform.position + new Vector3(circle.x, 0, circle.y); Enemy spawnedEnemy = Instantiate(enemy, spawnVector, spawnPointInfo.transform.rotation).GetComponent(); + spawnedEnemy.prefab = enemy; aliveEnemies.Add(spawnedEnemy); } } @@ -37,7 +38,7 @@ public class LevelController : MonoBehaviour } public void OnPlayerDie() { - GameController.i.OnLevelFailed(SceneManager.GetActiveScene().name, timeSpent); + GameController.i.OnLevelFailed(SceneManager.GetActiveScene().name, timeSpent, aliveEnemies); GameController.i.LoadDeployScene(); } }