internal void RemoveSquadron(Squadron squadron) { foreach (var entry in squadron.AircraftsWithRelPositions) { RemoveAircraft(entry.Key); } Squadrons.Remove(squadron); ActiveSquadrons.Remove(squadron); }
internal void AddSquadron(Squadron squadron, CCPoint position, float CCdirection) { squadron.Leader.Position = position; squadron.Leader.RotateTo(CCdirection); // rotate all formation positions correctly around the leader and set everyone to their positions float angle = Constants.CCDegreesToMathRadians(CCdirection); foreach (var entry in squadron.AircraftsWithRelPositions) { var formationPoint = CCPoint.RotateByAngle(entry.Value, CCPoint.Zero, angle); entry.Key.Position = position + formationPoint; entry.Key.RotateTo(CCdirection); AddAircraft(entry.Key); } squadron.GenerateWayPoint(); Squadrons.Add(squadron); }
/// <summary> /// Returned Squadron can be null! /// </summary> /// <param name="zoneNum"></param> /// <returns></returns> internal Squadron GenerateSquadron(int zoneNum, Random rng) { Squadron newSquadron = null; switch (zoneNum) { case 0: { // no squadrons are present in the first zone } break; case 1: { // second zone: potatos and bats switch (rng.Next(4)) { case 0: { // create a peaceful Potato var leader = Aircraft.CreatePotato(rng: rng); leader.AI = new PeacefulFleeingAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); } break; case 1: { // create a non-peaceful Potato var leader = Aircraft.CreatePotato(true, rng: rng); leader.AI = new StandardAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); } break; case 2: { // create a bat var leader = Aircraft.CreateBat(rng: rng); leader.AI = new StandardAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); } break; case 3: { // create a 3-potato squad var leader = Aircraft.CreatePotato(true, rng); var ally1 = Aircraft.CreatePotato(rng: rng); var ally2 = Aircraft.CreatePotato(rng: rng); leader.AI = new StandardAI(); ally1.AI = new PeacefulFleeingAI(); ally2.AI = new PeacefulFleeingAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); newSquadron.AddAircraft(ally1, new CCPoint(-90f, 145f)); newSquadron.AddAircraft(ally2, new CCPoint(-90f, -145f)); } break; } } break; case 2: { // third zone: TestAircrafts and Balloons switch (rng.Next(3)) { case 0: { // create a lone TestAircraft var leader = Aircraft.CreateTestAircraft(rng: rng); leader.AI = new StandardAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); } break; case 1: { // create a Balloon var leader = Aircraft.CreateBalloon(true, rng: rng); leader.AI = new StandardAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); } break; case 2: { // create a squad of 3 TestAircrafts newSquadron = new Squadron(); Aircraft[] planes = new Aircraft[3]; for (int i = 0; i < 3; i++) { int weaponNum = rng.Next(3); planes[i] = Aircraft.CreateTestAircraft(weaponNum, rng: rng); planes[i].AI = weaponNum != 0 ? (AI)(new StandardAI()) : (AI)(new PeacefulFleeingAI()); } newSquadron.AddAircraft(planes[0], CCPoint.Zero); newSquadron.AddAircraft(planes[1], new CCPoint(-250f, 255f)); newSquadron.AddAircraft(planes[2], new CCPoint(-250f, -255f)); } break; } } break; case 3: { // fourth zone: Fighters and BigBombers switch (rng.Next(5)) { case 0: case 1: { // create a lone Fighter var leader = Aircraft.CreateFighter(rng: rng); leader.AI = new StandardAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); } break; case 2: { // create a Fighter Squad of 2 Fighters var leader = Aircraft.CreateFighter(rng: rng); leader.AI = new StandardAI(); var plane2 = Aircraft.CreateFighter(rng: rng); plane2.Team = Team.EnemyTeam; plane2.AI = new StandardAI(); newSquadron = new Squadron(); newSquadron.AddAircraft(leader, new CCPoint(0, 270f)); newSquadron.AddAircraft(plane2, new CCPoint(0, -270f)); } break; case 3: { // create a squad of a BigBomber and some Fighters newSquadron = new Squadron(); newSquadron.AddAircraft(Aircraft.CreateBigBomber(rng: rng), CCPoint.Zero); int fighterCount = rng.Next(5) == 0 ? 4 : 2; Aircraft[] fighter = new Aircraft[fighterCount]; for (int i = 0; i < fighterCount; i++) { fighter[i] = Aircraft.CreateFighter(rng: rng); fighter[i].AI = new StandardAI(); } if (fighterCount >= 2) { newSquadron.AddAircraft(fighter[0], new CCPoint(330f, 255f)); newSquadron.AddAircraft(fighter[1], new CCPoint(330f, -255f)); } if (fighterCount == 4) { newSquadron.AddAircraft(fighter[2], new CCPoint(-330f, 255f)); newSquadron.AddAircraft(fighter[3], new CCPoint(-330f, -255f)); } } break; } } break; case 4: default: // this is also the default case because this is the last zone { // fifth zone: Jets, Jets and more Jets var leader = Aircraft.CreateJet(rng); leader.Team = Team.EnemyTeam; leader.AI = leader.TotalParts.OfType <WingAngel>().Any() ? (AI)(new PeacefulFleeingAI()) : new StandardAI(); // angels should flee newSquadron = new Squadron(); newSquadron.AddAircraft(leader, CCPoint.Zero); } break; } if (newSquadron != null) { newSquadron.MinR = ZoneEndRadii[zoneNum - 1]; newSquadron.MaxR = (zoneNum < ZoneEndRadii.Length ? ZoneEndRadii[zoneNum] : float.PositiveInfinity); } return(newSquadron); }