コード例 #1
0
        private IEnumerable <SpeechNode> WhatDoYouThink()
        {
            Diplomacy.Politics p            = World.ComponentManager.Diplomacy.GetPolitics(Faction, PlayerFation);
            Relationship       r            = p.GetCurrentRelationship();
            string             relationship = "So far, our relationship has been " + r;

            if (p.RecentEvents.Count > 0)
            {
                relationship += ", because ";
                List <string> events = p.RecentEvents.Select(e => e.Description).ToList();
                relationship += TextGenerator.GetListString(events);
            }

            relationship += ".";
            yield return(new SpeechNode()
            {
                Text = relationship,
                Actions = new List <SpeechNode.SpeechAction>()
                {
                    new SpeechNode.SpeechAction()
                    {
                        Text = "Interesting",
                        Action = () => SpeechNode.Echo(DialougeTree)
                    }
                }
            });
        }
コード例 #2
0
        public void UpdateTradeEnvoys()
        {
            foreach (TradeEnvoy envoy in TradeEnvoys)
            {
                Diplomacy.Politics politics = PlayState.Diplomacy.GetPolitics(this, envoy.OtherFaction);
                if (politics.GetCurrentRelationship() == Relationship.Hateful)
                {
                    RecallEnvoy(envoy);
                }
                else
                {
                    if (!envoy.Creatures.Any(creature => envoy.OtherFaction.AttackDesignations.Contains(creature.Physics)))
                    {
                        continue;
                    }

                    if (!politics.HasEvent("You attacked our trade delegates"))
                    {
                        politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                        {
                            Change      = -1.0f,
                            Description = "You attacked our trade delegates",
                            Duration    = new TimeSpan(1, 0, 0, 0),
                            Time        = PlayState.Time.CurrentDate
                        });
                    }
                    else
                    {
                        politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                        {
                            Change      = -2.0f,
                            Description = "You attacked our trade delegates more than once",
                            Duration    = new TimeSpan(1, 0, 0, 0),
                            Time        = PlayState.Time.CurrentDate
                        });
                    }
                }

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

            TradeEnvoys.RemoveAll(t => t.ShouldRemove);
        }
コード例 #3
0
        public void UpdateWarParties()
        {
            foreach (WarParty party in WarParties)
            {
                Diplomacy.Politics politics = PlayState.Diplomacy.GetPolitics(this, party.OtherFaction);
                if (politics.GetCurrentRelationship() != Relationship.Hateful)
                {
                    RecallWarParty(party);
                }

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

            WarParties.RemoveAll(w => w.ShouldRemove);
        }
コード例 #4
0
ファイル: Diplomacy.cs プロジェクト: jeason1997/dwarfcorp
        public void UpdateWarParties(Faction faction)
        {
            foreach (var party in faction.WarParties)
            {
                if (party.DeathTimer.Update(faction.World.Time.CurrentDate))
                {
                    party.Creatures.ForEach((creature) => creature.Die());
                }

                foreach (var creature in party.Creatures)
                {
                    if (MathFunctions.RandEvent(0.001f))
                    {
                        creature.AssignTask(new ActWrapperTask(new GetMoneyAct(creature, (decimal)MathFunctions.Rand(0, 64.0f), party.OtherFaction))
                        {
                            Priority = Task.PriorityType.Medium
                        });
                    }
                }

                Diplomacy.Politics politics = faction.World.Diplomacy.GetPolitics(faction, party.OtherFaction);

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

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

                    // Killed entire war party. Wonderful!
                    World.GoalManager.OnGameEvent(new Goals.Events.WarPartyDefeated
                    {
                        PlayerFaction = party.OtherFaction,
                        OtherFaction  = party.OwnerFaction
                    });
                }
            }

            faction.WarParties.RemoveAll(w => w.ShouldRemove);
        }
コード例 #5
0
ファイル: Diplomacy.cs プロジェクト: Solsund/dwarfcorp
        public void UpdateWarParties(Faction faction)
        {
            foreach (Faction.WarParty party in faction.WarParties)
            {
                if (party.DeathTimer.Update(PlayState.Time.CurrentDate))
                {
                    party.Creatures.ForEach((creature) => creature.Die());
                }

                Diplomacy.Politics politics = PlayState.ComponentManager.Diplomacy.GetPolitics(faction, party.OtherFaction);
                if (politics.GetCurrentRelationship() != Relationship.Hateful)
                {
                    RecallWarParty(party);
                }

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

            faction.WarParties.RemoveAll(w => w.ShouldRemove);
        }
コード例 #6
0
        public void UpdateWarParties(Faction faction)
        {
            foreach (var party in faction.WarParties)
            {
                bool doneWaiting = party.UpdateTimer(World.Time.CurrentDate);
                party.Creatures.RemoveAll(creature => creature.IsDead);
                if (party.DeathTimer.Update(World.Time.CurrentDate))
                {
                    party.Creatures.ForEach((creature) => creature.Die());
                }

                Diplomacy.Politics politics = faction.World.Diplomacy.GetPolitics(faction, party.OtherFaction);

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

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

                    // Killed entire war party. Wonderful!
                    World.GoalManager.OnGameEvent(new Goals.Triggers.WarPartyDefeated
                    {
                        PlayerFaction = party.OtherFaction,
                        OtherFaction  = party.OwnerFaction
                    });
                }

                if (!doneWaiting)
                {
                    continue;
                }
                else
                {
                    foreach (var creature in party.OwnerFaction.Minions)
                    {
                        if (creature.Tasks.Count == 0)
                        {
                            CreatureAI enemyMinion = party.OtherFaction.GetNearestMinion(creature.Position);
                            if (enemyMinion != null)
                            {
                                creature.AssignTask(new KillEntityTask(enemyMinion.Physics, KillEntityTask.KillType.Auto));
                            }
                        }
                    }

                    if (party.ExpiditionState == Expedition.State.Arriving)
                    {
                        World.MakeAnnouncement(String.Format("The war party from {0} is attacking!", party.OwnerFaction.Name));
                        SoundManager.PlaySound(ContentPaths.Audio.Oscar.sfx_gui_negative_generic, 0.15f);
                        party.ExpiditionState = Expedition.State.Fighting;
                    }
                }

                foreach (var creature in party.Creatures)
                {
                    if (MathFunctions.RandEvent(0.001f))
                    {
                        creature.AssignTask(new ActWrapperTask(new GetMoneyAct(creature, (decimal)MathFunctions.Rand(0, 64.0f), party.OtherFaction))
                        {
                            Priority = Task.PriorityType.Medium
                        });
                    }
                }
            }

            faction.WarParties.RemoveAll(w => w.ShouldRemove);
        }
コード例 #7
0
        public void UpdateTradeEnvoys(Faction faction)
        {
            foreach (TradeEnvoy envoy in faction.TradeEnvoys)
            {
                if (envoy.ExpiditionState == Expedition.State.Trading)
                {
                    if (envoy.UpdateWaitTimer(World.Time.CurrentDate))
                    {
                        World.MakeAnnouncement(String.Format("The envoy from {0} is leaving.", envoy.OwnerFaction.Name));
                        RecallEnvoy(envoy);
                    }
                }

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

                Diplomacy.Politics politics = faction.World.Diplomacy.GetPolitics(faction, envoy.OtherFaction);
                if (politics.GetCurrentRelationship() == Relationship.Hateful)
                {
                    World.MakeAnnouncement(String.Format("The envoy from {0} is leaving.", envoy.OwnerFaction.Name));
                    RecallEnvoy(envoy);
                }
                else
                {
                    if (envoy.Creatures.Any(
                            // TODO (mklingen) why do I need this null check?
                            creature => creature.Creature != null &&
                            envoy.OtherFaction.Designations.IsDesignation(creature.Physics, DesignationType.Attack)))
                    {
                        if (!politics.HasEvent("You attacked our trade delegates"))
                        {
                            politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                            {
                                Change      = -1.0f,
                                Description = "You attacked our trade delegates",
                                Duration    = new TimeSpan(1, 0, 0, 0),
                                Time        = faction.World.Time.CurrentDate
                            });
                        }
                        else
                        {
                            politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                            {
                                Change      = -2.0f,
                                Description = "You attacked our trade delegates more than once",
                                Duration    = new TimeSpan(1, 0, 0, 0),
                                Time        = faction.World.Time.CurrentDate
                            });
                        }
                    }
                }

                if (!envoy.ShouldRemove && envoy.ExpiditionState == Expedition.State.Arriving)
                {
                    foreach (CreatureAI creature in envoy.Creatures)
                    {
                        Room tradePort = envoy.OtherFaction.GetNearestRoomOfType(BalloonPort.BalloonPortName,
                                                                                 creature.Position);

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

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

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

                        if (envoy.ExpiditionState != Expedition.State.Trading ||
                            !envoy.IsTradeWidgetValid())
                        {
                            envoy.MakeTradeWidget(World);
                        }
                        envoy.ExpiditionState = Expedition.State.Trading;
                        break;
                    }
                }
                else if (envoy.ExpiditionState == Expedition.State.Leaving)
                {
                    BoundingBox worldBBox = faction.World.ChunkManager.Bounds;

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

                    foreach (CreatureAI creature in envoy.Creatures)
                    {
                        if (MathFunctions.Dist2D(worldBBox, creature.Position) < 2.0f)
                        {
                            creature.GetRoot().Delete();
                        }
                    }
                }
                else
                {
                    if (!envoy.IsTradeWidgetValid())
                    {
                        envoy.MakeTradeWidget(World);
                    }
                }
                if (envoy.Creatures.All(creature => creature.IsDead))
                {
                    envoy.ShouldRemove = true;

                    World.GoalManager.OnGameEvent(new Goals.Triggers.TradeEnvoyKilled
                    {
                        PlayerFaction = envoy.OtherFaction,
                        OtherFaction  = envoy.OwnerFaction
                    });
                }
            }

            bool hadFactions = faction.TradeEnvoys.Count > 0;

            faction.TradeEnvoys.RemoveAll(t => t == null || t.ShouldRemove);

            if (hadFactions && faction.TradeEnvoys.Count == 0)
            {
                var music = World.Time.IsDay() ? "main_theme_day" : "main_theme_night";
                SoundManager.PlayMusic(music);
            }
        }
コード例 #8
0
ファイル: Diplomacy.cs プロジェクト: Solsund/dwarfcorp
        public void UpdateTradeEnvoys(Faction faction)
        {
            foreach (Faction.TradeEnvoy envoy in faction.TradeEnvoys)
            {
                if (envoy.DeathTimer.Update(PlayState.Time.CurrentDate))
                {
                    envoy.Creatures.ForEach((creature) => creature.GetRootComponent().Die());
                }

                Diplomacy.Politics politics = PlayState.ComponentManager.Diplomacy.GetPolitics(faction, envoy.OtherFaction);
                if (politics.GetCurrentRelationship() == Relationship.Hateful)
                {
                    RecallEnvoy(envoy);
                }
                else
                {
                    if (envoy.Creatures.Any(
                            creature => envoy.OtherFaction.AttackDesignations.Contains(creature.Physics)))
                    {
                        if (!politics.HasEvent("You attacked our trade delegates"))
                        {
                            politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                            {
                                Change      = -1.0f,
                                Description = "You attacked our trade delegates",
                                Duration    = new TimeSpan(1, 0, 0, 0),
                                Time        = PlayState.Time.CurrentDate
                            });
                        }
                        else
                        {
                            politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                            {
                                Change      = -2.0f,
                                Description = "You attacked our trade delegates more than once",
                                Duration    = new TimeSpan(1, 0, 0, 0),
                                Time        = PlayState.Time.CurrentDate
                            });
                        }
                    }
                }

                if (!envoy.ShouldRemove && envoy.ExpiditionState == Faction.Expidition.State.Arriving)
                {
                    foreach (CreatureAI creature in envoy.Creatures)
                    {
                        Room tradePort = envoy.OtherFaction.GetNearestRoomOfType(BalloonPort.BalloonPortName,
                                                                                 creature.Position);

                        if (creature.Tasks.Count == 0)
                        {
                            creature.Tasks.Add(new ActWrapperTask(new GoToZoneAct(creature, tradePort))
                            {
                                Name = "Go to trade port.", Priority = Task.PriorityType.Urgent
                            });
                        }

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

                        envoy.ExpiditionState = Faction.Expidition.State.Trading;
                        if (GameState.Game.StateManager.States.ContainsKey("DiplomacyState_" + faction.Name))
                        {
                            DiplomacyState state = GameState.Game.StateManager.States["DiplomacyState_" + faction.Name] as DiplomacyState;
                            if (state != null)
                            {
                                state.Envoy     = envoy;
                                state.Resources = envoy.TradeGoods;
                            }
                            GameState.Game.StateManager.PushState("DiplomacyState_" + faction.Name);
                        }
                        else
                        {
                            GameState.Game.StateManager.PushState(new DiplomacyState(GameState.Game,
                                                                                     GameState.Game.StateManager,
                                                                                     (PlayState)GameState.Game.StateManager.GetState <PlayState>("PlayState"), envoy)
                            {
                                Name  = "DiplomacyState_" + faction.Name,
                                Envoy = envoy
                            });
                        }
                        break;
                    }
                }
                else if (envoy.ExpiditionState == Faction.Expidition.State.Leaving)
                {
                    BoundingBox worldBBox = PlayState.ChunkManager.Bounds;

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

                    foreach (CreatureAI creature in envoy.Creatures)
                    {
                        if (MathFunctions.Dist2D(worldBBox, creature.Position) < 2.0f)
                        {
                            creature.GetRootComponent().Delete();
                            creature.IsDead = true;
                        }
                    }
                }

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

            faction.TradeEnvoys.RemoveAll(t => t.ShouldRemove);
        }