public void UpdatePrestige(Settlement.Settlement settlement)
 {
     foreach (var settler in Settlers)
     {
         settler.UpdatePrestige(settlement);
     }
 }
 public void GoThroughMessages(Settlement.Settlement settlement)
 {
     foreach (var msg in TodaysMessages.Where(msg => Filter(msg)))
     {
         msg.Display();
     }
 }
示例#3
0
        public Temperature GetIndoorTemperature(Settlement.Settlement settlement)
        {
            var raisedTempVal = settlement.TodaysWeather.Temperature.Value + Insulation(settlement);
            var warm          = Temperature.Warm.Value;

            return(Temperature.Temperatures[Math.Min(raisedTempVal, warm)]);
        }
示例#4
0
 public void Die(Settlement.Settlement settlement, CauseOfDeath causeOfDeath)
 {
     Relationships.ForEach(rel => rel.Other(this).NotifyDeath(rel));
     settlement.SettlerManager.Settlers.Remove(this);
     settlement.SettlerManager.Graveyard.Add(this);
     settlement.AddMessage(new SettlerDeathMessage(this, causeOfDeath));
 }
示例#5
0
 public void Discover(Tech tech, Settlement.Settlement settlement)
 {
     settlement.AddMessage(new TechDiscoveredMessage(tech));
     //Add all blueprints
     tech.Blueprints.ForEach(blueprint => settlement.Blueprints.Add(blueprint));
     Discovered.Add(tech);
 }
示例#6
0
        private int GetHarvest(Settlement.Settlement settlement, Resource.Resource resource, double rate, Settler.Settler worker)
        {
            var efficiency        = BuildingEfficiency(settlement, resource, worker) * WorkerEfficiency(worker);
            var guaranteedHarvest = (int)(rate * efficiency);
            var uncertainHarvest  = guaranteedHarvest - rate * efficiency;

            return(guaranteedHarvest + (new Random().NextDouble() < uncertainHarvest ? 1 : 0));
        }
示例#7
0
 public void Execute(Settlement.Settlement settlement)
 {
     PreExecute(settlement);
     CustomConsole.TitleLine();
     CustomConsole.WriteLine($"{Name.ToUpper()}:");
     CustomConsole.WriteLine($"{Description}");
     IOManager.ChooseItemFromList(Options.Where(op => op.IsAvailable(settlement)), op => op.Description).Execute(settlement);
     PostExecute(settlement);
 }
示例#8
0
        public void ExecuteTodaysEvents(Settlement.Settlement settlement)
        {
            var list = TodaysEvents(settlement);

            if (list.Count > 0)
            {
                TodaysEvents(settlement).ForEach(ev => ev?.Execute(settlement));
                settlement.StopDayPass = true;
            }
        }
示例#9
0
        //Lazy evaluation of prestige: it is only recalculated after important changes
        public void UpdatePrestige(Settlement.Settlement settlement)
        {
            var oldLevel = PrestigeLevel;

            PrestigeAmount = settlement.Culture.PrestigeSystem.CalculatePrestige(this);
            if (oldLevel != PrestigeLevel)
            {
                settlement.AddMessage(new SettlerPrestigeChangeMessage(this, oldLevel));
            }
        }
示例#10
0
 public override void Relax(Settlement.Settlement settlement)
 {
     if (HealthLevel > HealthLevel.BadlyWounded)
     {
         Heal(1); // Healing
     }
     else if (HealthLevel == HealthLevel.Dying)
     {
         Harm(1, settlement, CauseOfDeath.Starvation); // Dying
     }
 }
示例#11
0
        public List <Event> TodaysEvents(Settlement.Settlement settlement)
        {
            var today = settlement.TodaysDate.DaysSinceSettlement;

            PurgeYesterday(today);
            //Generate a new event if there isn't one
            if (!EventCalendar.ContainsKey(today))
            {
                Generate(settlement);
            }
            return(EventCalendar[today]);
        }
示例#12
0
 public void MakeProgress(Settlement.Settlement settlement)
 {
     if (CurrentResearch != null)
     {
         CurrentResearch.Progress += settlement.ResearchRate;
         if (CurrentResearch.Progress >= CurrentResearch.Cost)
         {
             Discover(CurrentResearch, settlement);
             CurrentResearch = null;
         }
     }
 }
示例#13
0
        private RandomEvent Generate(Settlement.Settlement settlement)
        {
            var today  = settlement.TodaysDate.DaysSinceSettlement;
            var rarity =
                RandomUtil.WeightedPercentGet(EventRarity.Rarities, null, eventRarity => eventRarity.PercentChance);
            var ev = !(rarity == null) ? RandomUtil.Get(RandomEventArrays[rarity].Where(ev => ev.IsAvailable(settlement)).ToList()) : null;

            //Add Today's Event to Calendar if not null
            EventCalendar.Add(today, ev != null ? new List <Event> {
                ev
            } : new List <Event>());
            return(ev);
        }
示例#14
0
 public void Harm(int amount, Settlement.Settlement settlement, CauseOfDeath causeOfDeath)
 {
     if (amount < 0)
     {
         throw new ArgumentException("Harm only takes positive integers!");
     }
     Health -= amount;
     if (Health < 0)
     {
         Health = 0;
         Die(settlement, causeOfDeath);
     }
 }
示例#15
0
        public void GainXp(Settlement.Settlement settlement, Model.Settler.Skill.Skill skill, int amount)
        {
            var before = SkillLevel(skill);

            if (Experience.ContainsKey(skill))
            {
                Experience[skill] += amount;
            }
            else
            {
                Experience.Add(skill, amount);
            }
            if (before < SkillLevel(skill))
            {
                settlement.MessageManager.TodaysMessages.Add(new SkillIncreasedMessage(this, skill, SkillLevel(skill)));
            }
        }
示例#16
0
        public override bool GoEat(Settlement.Settlement settlement)
        {
            var food = settlement.Stockpile.GetHighestOfType(ResourceType.Food);

            if (food == null)
            {
                settlement.AddMessage(new SettlerStarvedMessage(this));
                return(false);
            }
            else
            {
                var meal = new Bundle(food, 1);
                settlement.Stockpile.Remove(meal);
                settlement.AddMessage(new SettlerAteMessage(this, meal));
                return(true);
            }
        }
示例#17
0
        public override void HostWork(Settler.Settler worker, Settlement.Settlement settlement)
        {
            var harvest = new Bundle();

            foreach (var(resource, rate) in BaseRates)
            {
                var amount = GetHarvest(settlement, resource, rate, worker);

                if (amount > 0)
                {
                    harvest.Contents.Add(resource, amount);
                }
            }

            //TODO Transactions
            settlement.Stockpile.Add(harvest);
            worker.GainXp(settlement, Skill, 1);
        }
示例#18
0
        public virtual void DoWork(Settlement.Settlement settlement)
        {
            //Can't work
            if (Workplace == null)
            {
                return;
            }

            var discipline = Traits[Trait.Discipline];

            if (discipline == TraitLevel.BelowAverage && RandomUtil.Chance(1, 40) ||
                discipline == TraitLevel.Low && RandomUtil.Chance(1, 20) ||
                discipline == TraitLevel.VeryLow && RandomUtil.Chance(1, 10))
            {
                //skipped work
                settlement.AddMessage(new SettlerSkippedWorkMessage(this));
            }
            else
            {
                Workplace.HostWork(this, settlement);
            }
        }
示例#19
0
 public virtual void PostExecute(Settlement.Settlement settlement)
 {
 }
示例#20
0
 public List <Tech> GetAvailableTech(Settlement.Settlement settlement)
 {
     return(Tree.Technologies.Where(tech => !Discovered.Contains(tech) && tech.IsAvailable(settlement)).ToList());
 }
示例#21
0
 public bool IsAvailable(Settlement.Settlement settlement)
 {
     return((RankRequirement == null || settlement.Rank >= RankRequirement) &&
            (TechRequirements == null || TechRequirements.TrueForAll(tech => settlement.TechManager.Discovered.Contains(tech))));
 }
示例#22
0
 public override bool IsAvailable(Settlement.Settlement settlement)
 {
     return(settlement.SettlerManager.Relationships.Any(IsPossibleRelationship) &&
            settlement.Rank >= MinRank &&
            settlement.Rank <= MaxRank);
 }
示例#23
0
 public abstract int Insulation(Settlement.Settlement settlement);
示例#24
0
 public override void PreExecute(Settlement.Settlement settlement)
 {
     FindRelationship(settlement);
 }
示例#25
0
 private void FindRelationship(Settlement.Settlement settlement)
 {
     Relationship = RandomUtil.Get(settlement.SettlerManager.Relationships.Where(IsPossibleRelationship).ToArray());
 }
示例#26
0
 public virtual bool IsAvailable(Settlement.Settlement settlement) => true;
示例#27
0
 public override int Insulation(Settlement.Settlement settlement)
 {
     return(1);
 }
 public override bool IsAvailable(Settlement.Settlement settlement)
 {
     return(_isAvailable(settlement));
 }
示例#29
0
 public virtual double BuildingEfficiency(Settlement.Settlement settlement, Resource.Resource resource,
                                          Settler.Settler worker)
 {
     return(1.0);
 }
示例#30
0
 public static int AgeInDays(IDated dated, Settlement.Settlement settlement)
 {
     return(settlement.TodaysDate.DaysSinceSettlement - dated.Birthday.DaysSinceSettlement);
 }