public void generateEnemy(PseudoRandom tRand, int regionID, double x, double y, Action <List <Projectile> > OnFire, Action OnDamage, Action OnDeath) { double val = tRand.RandomDouble(); if (val > 0.2) { return; } else if (val > 0.05) { enemyShips.Add(new ShipBase(enemyShipGfx, Behavior.ShootConstantly, regionID / 3 + 2, 40, x, y, LineArt.PlayerShootPoints1) { OnWeaponFire = OnFire }); } else if (val > 0.005) { enemyShips.Add(new ShipBase(enemy2ShipGfx, Behavior.SpinShoot, regionID / 3 + 4, 5, x, y, LineArt.EnemyShip2_ShootPoints.Select(p => new PointF(p.X * 2f, p.Y * 2f)).ToList()) { OnWeaponFire = OnFire }); } else { enemyShips.Add(new ShipBase(new UnitGraphics(Pens.Fuchsia, LineArt.BossShip), Behavior.Boss, regionID / 3 + 150, 6, x, y, LineArt.BossBulletPoints) { facing = Math.PI / 2, collider = new DCollider(LineArt.BossColliders), OnWeaponFire = OnFire }); } }
protected void GenerateFoesForRegion(int regionID) { var tRand = new PseudoRandom((uint)core.RandomInt(1024)); var myAngleFromCenter = Geometry.FixAngle(Math.Atan2(gs.currentPlayer.posY, gs.currentPlayer.posX)); //Sector angles should be smaller for farther-out regions //This formula results in generating 100% of region 0, 67% of region 1, 50% of region 2, 40% of region 3, 6.25% of region 30... var sectorCount = regionID + 2; var sectorAngle = Math.PI * 2 / sectorCount; var regionBaseAngle = regionID * 0.1; //Needed so that all the spawn points to the east aren't lined up //Round myAngleFromCenter by sectorAngle (always a whole number of sectorAngles per circle) var sectorID = (int)((myAngleFromCenter + regionBaseAngle) / sectorAngle) % sectorCount; if (regionID == gs.regionID) { gs.sectorID = sectorID; } for (int sector = sectorID - 1; sector <= sectorID + 1; sector++) { var idx = (sector + sectorCount) % sectorCount; if (!gs.regionSpawnRecord[regionID][idx]) { gs.regionSpawnRecord[regionID][idx] = true; var ringInner = gs.ringThickness * regionID; //Distance from the innermost part of this ring to the origin var angle = idx * sectorAngle - regionBaseAngle; var spawnCount = regionID + 5; //Number of chances to spawn an enemy in this sector var subsectorAngle = sectorAngle / spawnCount; //Angles at which to potentially spawn enemies //Randomly do or don't generate random enemies at each subsectorAngle within (minArc, maxArc) for (int spawnIdx = 0; spawnIdx < spawnCount; spawnIdx++) { tRand.Next(); //Locate a random distance from the origin at this angle, but within the region var subPos = tRand.RandomDouble() * gs.ringThickness; var x = Math.Cos(angle) * (ringInner + subPos); var y = Math.Sin(angle) * (ringInner + subPos); gs.generateEnemy(tRand, regionID, x, y, onEnemyFireBasic, onEnemyDamagedBasic, onEnemyDeathBasic); angle += subsectorAngle; } } } }