Exemplo n.º 1
0
        public void Update(WorldManager World)
        {
            var doneWaiting = UpdateTimer(World.Time.CurrentDate);

            Creatures.RemoveAll(creature => creature.IsDead);
            if (DeathTimer.Update(World.Time.CurrentDate))
            {
                Creatures.ForEach((creature) => creature.Die());
            }

            var politics = World.Overworld.GetPolitics(OwnerFaction.ParentFaction, OtherFaction.ParentFaction);

            if (politics.GetCurrentRelationship() != Relationship.Hateful)
            {
                RecallWarParty();
            }

            if (Creatures.All(creature => creature.IsDead))
            {
                ShouldRemove = true;
            }

            if (doneWaiting)
            {
                foreach (var creature in OwnerFaction.Minions)
                {
                    if (creature.Tasks.Count == 0)
                    {
                        var enemyMinion = OtherFaction.GetNearestMinion(creature.Position);
                        if (enemyMinion != null)// && !enemyMinion.Stats.IsFleeing)
                        {
                            creature.AssignTask(new KillEntityTask(enemyMinion.Physics, KillEntityTask.KillType.Auto));
                        }
                    }
                }

                if (ExpiditionState == Expedition.State.Arriving)
                {
                    World.MakeAnnouncement(String.Format("The war party from {0} is attacking!", OwnerFaction.ParentFaction.Name));
                    SoundManager.PlaySound(ContentPaths.Audio.Oscar.sfx_gui_negative_generic, 0.15f);
                    ExpiditionState = Expedition.State.Fighting;
                }
            }
        }
Exemplo n.º 2
0
 public bool IsOver() => Creatures.All(c => c.IsGoblin || c.IsDead) || Creatures.All(c => c.IsElf || c.IsDead);
Exemplo n.º 3
0
        public void Update(WorldManager World)
        {
            if (ExpiditionState == Expedition.State.Trading)
            {
                if (UpdateWaitTimer(World.Time.CurrentDate))
                {
                    World.MakeAnnouncement(String.Format("The envoy from {0} is leaving.", OwnerFaction.ParentFaction.Name));
                    RecallEnvoy();
                }
            }

            Creatures.RemoveAll(creature => creature.IsDead);
            if (DeathTimer.Update(World.Time.CurrentDate))
            {
                Creatures.ForEach((creature) => creature.GetRoot().Die());
            }

            var politics = World.Overworld.GetPolitics(OwnerFaction.ParentFaction, OtherFaction.ParentFaction);

            if (politics.GetCurrentRelationship() == Relationship.Hateful)
            {
                World.MakeAnnouncement(String.Format("The envoy from {0} left: we are at war with them.", OwnerFaction.ParentFaction.Name));
                RecallEnvoy();
            }
            else
            {
                if (Creatures.Any(
                        // TODO (mklingen) why do I need this null check?
                        creature => creature.Creature != null &&
                        World.PersistentData.Designations.IsDesignation(creature.Physics, DesignationType.Attack)))
                {
                    if (!politics.HasEvent("You attacked our trade delegates"))
                    {
                        politics.AddEvent(new PoliticalEvent()
                        {
                            Change      = -1.0f,
                            Description = "You attacked our trade delegates",
                        });
                    }
                    else
                    {
                        politics.AddEvent(new PoliticalEvent()
                        {
                            Change      = -2.0f,
                            Description = "You attacked our trade delegates more than once",
                        });
                    }
                }
            }

            if (!ShouldRemove && ExpiditionState == Expedition.State.Arriving)
            {
                foreach (var creature in Creatures)
                {
                    var tradePort = World.GetNearestRoomOfType("Balloon Port", creature.Position);

                    if (tradePort == null)
                    {
                        World.MakeAnnouncement("We need a balloon trade port to trade.", null, () =>
                        {
                            return(World.GetNearestRoomOfType("Balloon Port", creature.Position) == null);
                        });
                        World.Tutorial("trade");
                        SoundManager.PlaySound(ContentPaths.Audio.Oscar.sfx_gui_negative_generic, 0.5f);
                        RecallEnvoy();
                        break;
                    }

                    if (creature.Tasks.Count == 0)
                    {
                        creature.Tasks.Add(new TradeTask(tradePort, this));
                    }

                    if (!tradePort.IsRestingOnZone(creature.Position))
                    {
                        continue;
                    }

                    if (ExpiditionState != Expedition.State.Trading || !IsTradeWidgetValid())
                    {
                        MakeTradeWidget(World);
                    }

                    StartTrading(World.Time.CurrentDate);
                    ExpiditionState = Expedition.State.Trading;
                    break;
                }
            }
            else if (ExpiditionState == Expedition.State.Leaving)
            {
                BoundingBox worldBBox = World.ChunkManager.Bounds;

                foreach (CreatureAI creature in Creatures)
                {
                    if (creature.Tasks.Count == 0)
                    {
                        creature.LeaveWorld();
                    }
                }

                foreach (var creature in Creatures)
                {
                    if (MathFunctions.Dist2D(worldBBox, creature.Position) < 2.0f)
                    {
                        creature.GetRoot().Delete();
                    }
                }
            }
            else if (!IsTradeWidgetValid())
            {
                MakeTradeWidget(World);
            }

            if (!OwnerFaction.ParentFaction.IsCorporate && Creatures.All(creature => creature.IsDead))
            {
                ShouldRemove = true;
            }
        }