示例#1
0
 bool AlliesControlLab()
 {
     return(MissionUtils.AreaSecuredWithUnits(world, allies, lab.CenterLocation, LabClearRange));
 }
        public void Tick(Actor self)
        {
            if (greece.WinState != WinState.Undefined)
            {
                return;
            }

            if (world.FrameNumber == 1)
            {
                SpawnAndMoveBridgeUnits(info.FirstStartUnits);
            }

            else if (world.FrameNumber == 25 * 3)
            {
                SpawnAndMoveBridgeUnits(info.SecondStartUnits);
            }

            else if (world.FrameNumber == 25 * 8)
            {
                SpawnAndMoveBridgeUnits(info.ThirdStartUnits);
            }

            MissionUtils.CapOre(ussr);

            if (!hospitalEvacuated && !hospital.IsDead() && MissionUtils.AreaSecuredWithUnits(world, greece, hospital.CenterLocation, 5))
            {
                EvacuateCivilians();
                hospitalEvacuated = true;
            }

            if (baseTransferredTick == -1)
            {
                var actorsInBase = world.FindUnits(alliedBaseTopLeft.CenterLocation, alliedBaseBottomRight.CenterLocation).Where(a => a != a.Owner.PlayerActor);
                if (actorsInBase.Any(a => a.Owner == greece))
                {
                    SetupAlliedBase(actorsInBase);
                    baseTransferredTick = world.FrameNumber;
                    objectives[FindOutpostID].Status = ObjectiveStatus.Completed;
                    OnObjectivesUpdated(true);
                }
            }
            else if (superTankDomeInfiltratedTick == -1)
            {
                if (world.FrameNumber == baseTransferredTick + 25 * 100)
                {
                    foreach (var tank in superTanks.Where(t => !t.IsDead() && t.IsInWorld))
                    {
                        tank.QueueActivity(false, new Move.Move(hospitalSuperTankPoint.Location, 2));
                    }
                }

                else if (world.FrameNumber == baseTransferredTick + 25 * 180)
                {
                    foreach (var tank in superTanks.Where(t => !t.IsDead() && t.IsInWorld))
                    {
                        tank.QueueActivity(false, new Move.Move(alliedBaseBottomRight.Location, 2));
                    }
                }

                else if (world.FrameNumber == baseTransferredTick + 25 * 280)
                {
                    foreach (var tank in superTanks.Where(t => !t.IsDead() && t.IsInWorld))
                    {
                        tank.QueueActivity(false, new Move.Move(demitriTriggerAreaCenter.Location, 2));
                    }
                }

                else if (world.FrameNumber == baseTransferredTick + 25 * 480)
                {
                    foreach (var tank in superTanks.Where(t => !t.IsDead() && t.IsInWorld))
                    {
                        tank.QueueActivity(false, new Move.Move(demitriLZ.Location, 4));
                    }
                }
            }
            else
            {
                if (world.FrameNumber % 25 == 0)
                {
                    foreach (var tank in superTanks.Where(t => !t.IsDead() && t.IsInWorld && t.IsIdle))
                    {
                        MissionUtils.AttackNearestLandActor(false, tank, ussr);
                    }
                }
                if (world.FrameNumber == superTankDomeInfiltratedTick + 25 * 180)
                {
                    foreach (var actor in world.Actors.Where(a => !a.IsDead() && (a.Owner == ussr || a.Owner == badGuy)))
                    {
                        actor.Kill(actor);
                    }
                }
                if (world.FrameNumber == superTankDomeInfiltratedTick + 25 * 181)
                {
                    foreach (var tank in superTanks.Where(t => !t.IsDead()))
                    {
                        tank.Kill(tank);
                    }
                    superTanksDestroyed = true;
                }
            }
            if (objectives[EvacuateDemitriID].Status != ObjectiveStatus.Completed)
            {
                if (demitri == null)
                {
                    if (demitriChurch.IsDead())
                    {
                        objectives[EvacuateDemitriID].Status = ObjectiveStatus.Failed;
                        OnObjectivesUpdated(true);
                        MissionFailed("Dr. Demitri was killed.");
                    }

                    else if (MissionUtils.AreaSecuredWithUnits(world, greece, demitriTriggerAreaCenter.CenterLocation, 3))
                    {
                        demitri = world.CreateActor("demitri", greece, demitriChurchSpawnPoint.Location, null);
                        demitri.QueueActivity(new Move.Move(demitriTriggerAreaCenter.Location, 0));
                        demitriLZFlare = world.CreateActor("flare", greece, demitriLZ.Location, null);
                        Sound.Play("flaren1.aud");
                        var chinookEntry = new CPos(demitriLZ.Location.X, 0);
                        demitriChinook = MissionUtils.ExtractUnitWithChinook(world, greece, demitri, chinookEntry, demitriLZ.Location, chinookEntry);
                    }
                }
                else if (demitri.IsDead())
                {
                    objectives[EvacuateDemitriID].Status = ObjectiveStatus.Failed;
                    OnObjectivesUpdated(true);
                    MissionFailed("Dr. Demitri was killed.");
                }
                else if (demitriChinook != null && !demitriChinook.IsDead() && !world.Map.IsInMap(demitriChinook.Location) && demitriChinook.Trait <Cargo>().Passengers.Contains(demitri))
                {
                    demitriLZFlare.Destroy();
                    SpawnAndMoveAlliedBaseUnits(info.FirstBaseUnits);
                    objectives[EvacuateDemitriID].Status = ObjectiveStatus.Completed;
                    OnObjectivesUpdated(true);
                }
            }
            if (!world.Actors.Any(a => a.Owner == greece && a.IsInWorld && !a.IsDead() &&
                                  ((a.HasTrait <Building>() && !a.HasTrait <Wall>()) || a.HasTrait <BaseBuilding>() || a.HasTrait <Mobile>())))
            {
                MissionFailed("The remaining Allied forces in the area have been wiped out.");
            }
            if (superTankDomeInfiltratedTick == -1 && superTankDome.IsDead())
            {
                objectives[InfiltrateRadarDomeID].Status = ObjectiveStatus.Failed;
                OnObjectivesUpdated(true);
                MissionFailed("The Soviet radar dome was destroyed.");
            }
            if (superTanksDestroyed && objectives[EvacuateDemitriID].Status == ObjectiveStatus.Completed)
            {
                MissionAccomplished("Dr. Demitri has been extracted and the super tanks have been dealt with.");
            }
        }
示例#3
0
 bool AlliesControlLab()
 {
     return(MissionUtils.AreaSecuredWithUnits(world, allies, lab.CenterPosition, WRange.FromCells(LabClearRange)));
 }