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); }
private void SpawnEnemy(EnemySpawnObject enemySpawn) { //Define body var enemy = new Body { BodyType = BodyType.Dynamic }; var enemyFixture = enemy.CreateCircle(enemySpawn.Radius, 1); enemy.SetRestitution(enemySpawn.InitialRestitution); enemy.SetFriction(enemySpawn.InitialFriction); enemy.Mass = enemySpawn.InitialMass; enemy.LinearDamping = enemySpawn.LinearDamping; var enemyModel = new EnemyModel(enemy); enemyModel.EnemyType = enemySpawn.EnemyType; enemyModel.Damage = enemySpawn.Damage; enemyModel.Speed = enemySpawn.Speed; enemyModel.Health = enemySpawn.InitialHealth; enemyModel.MaxHealth = enemySpawn.InitialHealth; enemy.Tag = enemyModel; _world.Add(enemy); enemy.SetTransform(enemySpawn.InitialPosition, enemySpawn.InitialAngle); enemy.OnCollision += (fixtureA, fixtureB, contact) => { if (fixtureA.Body.Tag.Equals("worldBounds") || fixtureB.Body.Tag.Equals("worldBounds")) { return(false); } if (fixtureA.Body.Tag is PlayerModel p1) { if (fixtureB.Body.Tag is EnemyModel e && !e.Dead) { p1.Hurt(enemyModel.Damage); } if (fixtureB.Body.Tag is EnemyModel e2 && e2.Dead) { return(false); } if (p1.Dead) { MarkEntityForDestruction(p1); if (fixtureB.Body.Tag is EnemyModel eB) { eB.ResetClosestPlayer(); } } } if (fixtureB.Body.Tag is PlayerModel p2) { if (fixtureA.Body.Tag is EnemyModel e && !e.Dead) { p2.Hurt(enemyModel.Damage); } if (fixtureA.Body.Tag is EnemyModel e2 && e2.Dead) { return(false); } if (p2.Dead) { MarkEntityForDestruction(p2); if (fixtureA.Body.Tag is EnemyModel eA) { eA.ResetClosestPlayer(); } } } return(true); }; _objectDictionary.TryAdd(enemyModel.ID, enemyModel); aiController.Register(enemyModel, ref _objectDictionary); enemyModel.SearchForClosestPlayer(PlayerDictionary); }