public void SpawnWave(ref ConcurrentQueue <SpawnObject> spawnQueue, EnemyStrength enemyStrength, WaveSize waveSize, int players, float innerRadius = 1600f / 64f, float outerRadius = 2000f / 64f, float sideLength = 4000 / 64f) { var tempSQ = spawnQueue; int waveCount; switch (waveSize) { case WaveSize.Small: waveCount = 5 * players; break; case WaveSize.Medium: waveCount = 10 * players; break; case WaveSize.Large: waveCount = 20 * players; break; case WaveSize.XtraLarge: waveCount = 40 * players; break; default: waveCount = 10 * players; break; } var rand = new Random(); var randomNumber = rand.NextDouble(); WaveTypes waveType; if (randomNumber <= .5) { waveType = WaveTypes.Corners; } else if (randomNumber <= .80) { waveType = WaveTypes.InsideOut; } else { waveType = WaveTypes.Ring; } Parallel.For(0, waveCount, (i => { SpawnOneTick(enemyStrength, ref tempSQ, waveType, innerRadius, outerRadius, sideLength); })); spawnQueue = tempSQ; }
public void SpawnOneTick(EnemyStrength enemyStrength, ref ConcurrentQueue <SpawnObject> spawnQueue, WaveTypes waveType, float innerRadius = 1600f / 64f, float outerRadius = 2000f / 64f, float sideLength = 4000f / 64f) { EnemySpawnObject enemySpawn = new EnemySpawnObject(); var rand = new Random(); var entropy = (float)rand.NextDouble(); if (waveType == WaveTypes.Ring) { //Set enemy spawn using MATH POWAH //https://stackoverflow.com/questions/9048095/create-random-number-within-an-annulus //theta = random.uniform(0,2*pi) float theta = (float)rand.NextDouble() * (float)Math.PI * 2f; //A = 2/(r_max*r_max - r_min*r_min) float A = 2 / (outerRadius * outerRadius - innerRadius * innerRadius); //r = sqrt(2*random.uniform(0,1)/A + r_min*r_min) float r = (float)Math.Sqrt( 2 * rand.NextDouble() / (double)A + (double)innerRadius * (double)outerRadius); var spawnPosition = new Vector2(r * (float)Math.Cos(theta), r * (float)Math.Sin(theta)); enemySpawn.InitialPosition = spawnPosition; } else if (waveType == WaveTypes.Corners) { var entropy2 = (float)rand.NextDouble(); if (entropy2 >= .5) { if (entropy >= .5) { enemySpawn.InitialPosition = new Vector2(sideLength / 2 + entropy, sideLength / 2 + entropy); } else { enemySpawn.InitialPosition = new Vector2(-sideLength / 2 + entropy, -sideLength / 2 + entropy); } } else { if (entropy >= .5) { enemySpawn.InitialPosition = new Vector2(-sideLength / 2 + entropy, sideLength / 2 + entropy); } else { enemySpawn.InitialPosition = new Vector2(sideLength / 2 + entropy, -sideLength / 2 + entropy); } } } else if (waveType == WaveTypes.InsideOut) { enemySpawn.InitialPosition = new Vector2(entropy, -entropy); } var enemyType = "alien_tick"; enemySpawn.Radius = .4f; enemySpawn.InitialRestitution = 0f; switch (enemyStrength) { case EnemyStrength.Easy: enemySpawn.EnemyType = enemyType; enemySpawn.Speed = 9f; enemySpawn.Damage = 2f; enemySpawn.InitialHealth = 10f; break; case EnemyStrength.EasyMedium: enemySpawn.EnemyType = enemyType; enemySpawn.Speed = 10f; enemySpawn.Damage = 5f; enemySpawn.InitialHealth = 10f; break; case EnemyStrength.Medium: enemySpawn.EnemyType = enemyType; enemySpawn.Speed = 11f; enemySpawn.Damage = 10f; enemySpawn.InitialHealth = 15f; break; case EnemyStrength.Hard: enemySpawn.EnemyType = enemyType; enemySpawn.Speed = 12f; enemySpawn.Damage = 25f; enemySpawn.InitialHealth = 25f; break; case EnemyStrength.VeryHard: enemySpawn.EnemyType = enemyType; enemySpawn.Speed = 13f; enemySpawn.Damage = 35f; enemySpawn.InitialHealth = 30f; break; } spawnQueue.Enqueue(enemySpawn); }
static public Enemy GenerateEnemy(EnemyStrength strength) { int rollType = Game.rng.Next(5); int rollStrength = Game.rng.Next(10); int rollTough = Game.rng.Next(10); int rollHp = Game.rng.Next(10); int str = (rollStrength / 5) + 1; int tgh = (rollTough / 7); int hp = (rollHp / 4) + 5; int speed = Game.rng.Next(5) + 1; switch (strength) { case EnemyStrength.WEAK: switch (rollType) { case 0: return(new Enemy("Rat", hp, str, tgh, speed, 0, EnemyStrength.WEAK)); case 1: return(new Enemy("Bat", hp, str, tgh, speed, 0, EnemyStrength.WEAK)); case 2: return(new Enemy("Slime", hp, str, tgh, speed, 0, EnemyStrength.WEAK)); case 3: return(new Enemy("Wolf", hp, str, tgh, speed, 0, EnemyStrength.WEAK)); case 4: return(new Enemy("Spider", hp, str, tgh, speed, 0, EnemyStrength.WEAK)); default: return(new Enemy("Rat", hp, str, tgh, speed, 0, EnemyStrength.WEAK)); } case EnemyStrength.MEDIUM: str += (rollStrength / 4) + 2; tgh += 1; hp += (rollHp / 4) + 7; switch (rollType) { case 0: return(new Enemy("Skeleton", hp, str, tgh, speed, 0, EnemyStrength.MEDIUM)); case 1: return(new Enemy("Zombie", hp, str, tgh, speed, 0, EnemyStrength.MEDIUM)); case 2: return(new Enemy("Ork", hp, str, tgh, speed, 0, EnemyStrength.MEDIUM)); case 3: return(new Enemy("Bear", hp, str, tgh, speed, 0, EnemyStrength.MEDIUM)); case 4: return(new Enemy("Mad Convict", hp, str, tgh, speed, 0, EnemyStrength.MEDIUM)); default: return(new Enemy("Skeleton", hp, str, tgh, speed, 0, EnemyStrength.MEDIUM)); } case EnemyStrength.STRONG: str += (rollStrength / 2) + 6; tgh += (rollTough / 3) + 1; hp += (rollHp / 2) + 15; switch (rollType) { case 0: return(new Enemy("Stone Golem", hp, str, tgh, speed, 0, EnemyStrength.STRONG)); case 1: return(new Enemy("Small Dragon", hp, str, tgh, speed, 0, EnemyStrength.STRONG)); case 2: return(new Enemy("Fire Monster", hp, str, tgh, speed, 0, EnemyStrength.STRONG)); case 3: return(new Enemy("Giant", hp, str, tgh, speed, 0, EnemyStrength.STRONG)); case 4: return(new Enemy("Queen of Spiders", hp, str, tgh, speed, 0, EnemyStrength.STRONG)); default: return(new Enemy("Stone Golem", hp, str, tgh, speed, 0, EnemyStrength.STRONG)); } default: throw new System.SystemException("enemy generator"); } }
public Enemy(String n, int h, int s, int t, int sp, int m, EnemyStrength str) : base(h, s, t, sp, m) { Name = n; StrengthType = str; }