Example #1
0
        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
                });
            }
        }
Example #2
0
        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;
                    }
                }
            }
        }