Advertisement
PlinioJRM

WaveGenerator

Nov 1st, 2024
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.86 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using PlinioJRM.Entities;
  4. using UnityEngine;
  5.  
  6. namespace PlinioJRM.Systems.Waves {
  7.     public struct SpawnData {
  8.         public List<EnemyType> enemies;
  9.     }
  10.    
  11.     public class WaveGenerator {
  12.         private List<WaveGenerationRule> _rules;
  13.         private bool                     _isGroup;
  14.         private int                      _groupChance;
  15.         private EnemyType                _defaultEnemy;
  16.  
  17.         public WaveGenerator(
  18.             List<WaveGenerationRule> rules,
  19.             EnemyType defaultEnemy,
  20.             bool isGroup = false,
  21.             int groupChance = 0) {
  22.  
  23.             _rules = rules.OrderBy(R => R.chance).ToList();
  24.             _defaultEnemy = defaultEnemy;
  25.             _isGroup = isGroup;
  26.             _groupChance = groupChance;
  27.         }
  28.  
  29.         public SpawnData GenerateSpawnInfo() {
  30.             float RandomRoll() {
  31.                 int roll = Random.Range(0, 10000);
  32.                 return (float)roll / 100;
  33.             }
  34.            
  35.             SpawnData data = new () {
  36.                 enemies = new List<EnemyType>()
  37.             };
  38.  
  39.             if (!_isGroup) {
  40.                 data.enemies.Add(Roll());
  41.                 return data;
  42.             }
  43.  
  44.             float chance = _groupChance;
  45.             float chanceRoll = 100f;
  46.             while (chanceRoll <= chance) {
  47.                 data.enemies.Add(Roll());
  48.  
  49.                 chance *= 0.12f;
  50.                 chanceRoll = RandomRoll();
  51.             };
  52.            
  53.             return data;
  54.         }
  55.  
  56.         private EnemyType Roll() {
  57.             int chance = Random.Range(0, 100);
  58.             foreach (WaveGenerationRule rule in _rules) {
  59.                 if (chance <= rule.chance)
  60.                     return rule.enemyType;
  61.             }
  62.  
  63.             return _defaultEnemy;
  64.         }
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement