Example #1
0
 public void WriteLine(Person player, string text)
 {
     throw new NotImplementedException ();
     /*if (player.Id == Settings.PlayerId) {
         Console.WriteText (text);
     }*/
 }
        public void CommitVitalsChanges(Person person)
        {
            // TODO: Merge this with the commit function from BaseActivity. Both commit vitals changes
            if (Settings.IsVerbose) {
                Console.WriteDebugLine ("    Committing vitals changes");
            }

            foreach (var vital in VitalsChange.Keys) {
                var changeValue = VitalsChange [vital];
                var previousValue = person.Vitals [vital];
                var newValue = previousValue + changeValue;

                newValue = PercentageValidator.Validate (newValue);

                if (Settings.IsVerbose) {
                    Console.WriteDebugLine ("      " + vital);
                    Console.WriteDebugLine ("        Previous: " + previousValue);
                    Console.WriteDebugLine ("        Change: " + changeValue);
                    Console.WriteDebugLine ("        New value: " + newValue);
                }
                person.Vitals [vital] = newValue;
            }

            VitalsChange.Clear ();
        }
        public bool FellTreeCycle(Person person, Plant plant)
        {
            Status = "Chopping down tree " + (int)plant.PercentHarvested + "%";

            if (Settings.IsVerbose)
                Console.WriteDebugLine ("  Felling tree");

            plant.PercentHarvested += Settings.FellingRate;
            TotalWoodFelled += Settings.FellingRate; // TODO: Should this be set here or once the tree is finished?

            if (plant.PercentHarvested > 100)
                plant.PercentHarvested = 100;

            if (Settings.OutputType == ConsoleOutputType.Debug) {
                Console.WriteDebugLine ("  " + plant.PercentHarvested + "% felled");
            }

            if (plant.PercentHarvested > 100) {
                plant.PercentHarvested = 100;
            }

            if (plant.PercentHarvested == 100
                && Settings.IsVerbose) {
                Console.WriteDebugLine ("  Finished felling tree.");
            }

            return plant.PercentHarvested == 100;
        }
        public void Test_CollectWater_WaterAvailable()
        {
            Console.WriteLine ("");
            Console.WriteLine ("Preparing test");
            Console.WriteLine ("");

            var context = MockEngineContext.New (EngineSettings.DefaultVerbose);

            context.World.Logic.AddActivity (typeof(CollectWaterActivity));

            var settings = context.Settings;

            var tile = context.World.Tiles [0];

            tile.Inventory [ItemType.Water] = 100;

            var person = new Person (settings);
            person.Tile = tile;

            var needEntry = new NeedEntry (ActivityVerb.Gather, ItemType.Water, PersonVitalType.Thirst, settings.DefaultDrinkAmount, settings.DefaultItemPriorities[ItemType.Water]);

            var activity = new CollectWaterActivity (person, needEntry, settings, new ConsoleHelper(settings));

            Console.WriteLine ("");
            Console.WriteLine ("Executing test");
            Console.WriteLine ("");

            activity.Act (person);

            Console.WriteLine ("");
            Console.WriteLine ("Analysing test");
            Console.WriteLine ("");

            Assert.AreEqual(10, person.Inventory.Items[ItemType.Water]);
        }
        public override void Execute(Person person)
        {
            Status = "Eating food";

            if (Settings.IsVerbose) {
                Console.WriteDebugLine ("Eating food");
                Console.WriteDebugLine ("  Current hunger: " + person.Vitals[PersonVitalType.Hunger]);
            }

            var amount = Settings.DefaultEatAmount;

            if (amount > person.Inventory [ItemType.Food])
                amount = person.Inventory [ItemType.Food];

            if (Settings.IsVerbose)
                Console.WriteDebugLine ("  Amount: " + amount);

            ItemsConsumed[ItemType.Food] += amount;

            var hungerDecrease = amount * Settings.FoodForHungerRatio;

            if (Settings.IsVerbose)
                Console.WriteDebugLine ("  Decreased hunger by: " + hungerDecrease);

            VitalsChange.Add (PersonVitalType.Hunger, -hungerDecrease);

            TotalfoodConsumed += amount;
        }
Example #6
0
        public BaseActivity ChooseActivityBasedOnNeeds(Person person)
        {
            if (Context.Settings.IsVerbose)
                Context.Console.WriteDebugLine ("    Choosing activity based on needs");

            var entries = GetHighestPriorities (person);

            var noEntriesFound = (entries.Length == 0);

            if (noEntriesFound)
            {
                if (Context.Settings.IsVerbose)
                    Context.Console.WriteDebugLine ("    No needs found. Doing nothing.");

                //person.ClearActivity(); // TODO: Should a random activity be chosen?

                return null;
            }
            else {
                var index = RandomlySelectEntryIndex (entries.Length);

                var activity = ChooseActivityBasedOnNeed (person, entries [index]);

                return activity;
            }
        }
        public void ConvertWoodToTimber(Person actor, decimal amountOfTimber)
        {
            Status = "Milling wood into timber " + (int)TotalTimberMilled;

            if (Settings.IsVerbose)
                Console.WriteDebugLine ("  Converting wood to timber");

            var woodNeeded = CalculateAmountOfWoodNeeded(amountOfTimber);

            // TODO: Is there a cleaner way to do this?
            if (actor.Inventory.Items [ItemType.Wood] >= woodNeeded) {
                TotalTimberMilled += amountOfTimber;
                if (Settings.IsVerbose) {
                    Console.WriteDebugLine ("    Wood: " + woodNeeded);
                    Console.WriteDebugLine ("    Timber: " + amountOfTimber);
                    Console.WriteDebugLine ("    Total timber: " + TotalTimberMilled);
                }
                ItemsConsumed[ItemType.Wood] += woodNeeded;
                ItemsProduced[ItemType.Timber] += amountOfTimber;
            } else {
                if (Settings.IsVerbose) {
                    Console.WriteDebugLine ("    Not enough wood: " + woodNeeded);
                }
            }

            // TODO: Remove or reimplement
            /*if (Settings.PlayerId == Person.Id
                && Settings.OutputType == ConsoleOutputType.General) {
                PlayerLog.WriteLine (EngineHolder.Id, "The player has started milling timber.");
                PlayerLog.WriteLine (EngineHolder.Id, TotalTimberMilled + " timber");
            }*/
        }
        public void Test_Build_CompleteConstruction()
        {
            Console.WriteLine ("");
            Console.WriteLine ("Preparing test");
            Console.WriteLine ("");

            var settings = EngineSettings.DefaultVerbose;
            settings.ConstructionRate = 10;

            var person = new Person (settings);
            person.Home = new Building (BuildingType.Shelter, settings);
            person.Home.Inventory.Items [ItemType.Timber] = settings.ShelterTimberCost;
            person.Home.PercentComplete = 99;

            var needEntry = new NeedEntry (ActivityVerb.Build, ItemType.Shelter, PersonVitalType.NotSet, 1, 100);

            person.AddNeed (needEntry);

            var activity = new BuildShelterActivity (person, needEntry, settings, new ConsoleHelper(settings));
            activity.Shelter = person.Home;

            activity.Act (person);

            Assert.AreEqual (100, person.Home.PercentComplete);
            Assert.IsTrue (person.Home.IsCompleted);

            Assert.AreEqual (0, person.Needs.Count);
        }
        public void Test_EatFood_FoodAvailable()
        {
            Console.WriteLine ("");
            Console.WriteLine ("Preparing test");
            Console.WriteLine ("");

            var context = MockEngineContext.New ();

            var settings = context.Settings;

            var person = new Person (settings);
            person.Inventory [ItemType.Food] = 100;
            person.Vitals[PersonVitalType.Hunger] = 80;

            var needEntry = new NeedEntry (ActivityVerb.Eat, ItemType.Food, PersonVitalType.NotSet, settings.DefaultEatAmount, settings.DefaultItemPriorities[ItemType.Food]);

            var activity = new EatFoodActivity (person, needEntry, settings, context.Console);

            Console.WriteLine ("");
            Console.WriteLine ("Executing test");
            Console.WriteLine ("");

            activity.Act (person);

            Console.WriteLine ("");
            Console.WriteLine ("Analysing test");
            Console.WriteLine ("");

            Assert.AreEqual(75, person.Vitals[PersonVitalType.Hunger]);
        }
        public override void Execute(Person person)
        {
            Status = "Drinking water";

            if (Settings.IsVerbose) {
                Console.WriteDebugLine ("Drinking water");
                Console.WriteDebugLine ("  Current thirst: " + person.Vitals[PersonVitalType.Thirst]);
            }

            var amount = Settings.DefaultDrinkAmount;

            if (amount > person.Inventory [ItemType.Water])
                amount = person.Inventory [ItemType.Water];

            if (Settings.IsVerbose)
                Console.WriteDebugLine ("  Amount: " + amount);

            ItemsConsumed[ItemType.Water] += amount;

            var thirstDecrease = amount * Settings.WaterForThirstRatio;

            if (Settings.IsVerbose)
                Console.WriteDebugLine ("  Decreased thirst by: " + thirstDecrease);

            VitalsChange.Add (PersonVitalType.Thirst, -thirstDecrease);

            TotalWaterConsumed += amount;
        }
        public void Test_Sleep_ShelterAvailable()
        {
            Console.WriteLine ("");
            Console.WriteLine ("Preparing test");
            Console.WriteLine ("");

            var context = MockEngineContext.New ();

            context.World.Logic.AddActivity (typeof(DrinkWaterActivity));

            var settings = context.Settings;

            var person = new Person (settings);
            person.Vitals[PersonVitalType.Energy] = 0;

            person.Home = new Building (BuildingType.Shelter, settings);
            person.Home.PercentComplete = 100;

            var needEntry = new NeedEntry (ActivityVerb.Sleep, ItemType.NotSet, PersonVitalType.Energy, 100, settings.DefaultVitalPriorities[PersonVitalType.Energy]);

            var activity = new SleepActivity (person, needEntry, settings, new ConsoleHelper(settings));

            Console.WriteLine ("");
            Console.WriteLine ("Executing test");
            Console.WriteLine ("");

            activity.Act (person);

            Console.WriteLine ("");
            Console.WriteLine ("Analysing test");
            Console.WriteLine ("");

            Assert.AreEqual(settings.EnergyFromSleepRate, person.Vitals[PersonVitalType.Energy]);
        }
 public BuildShelterActivity(Person actor, NeedEntry needEntry, EngineSettings settings, ConsoleHelper console)
     : base(actor, needEntry, settings, console)
 {
     // TODO
     //WoodFelling = new FellWoodActivity ();
     //TimberMilling = new MillTimberActivity ();
 }
Example #13
0
        public BaseActivity ChooseActivityBasedOnNeed(Person person, NeedEntry needEntry)
        {
            if (Context.Settings.IsVerbose) {
                Context.Console.WriteDebugLine ("    Choosing activity based on need for " + needEntry.ItemType);
            }

            var possibleActivities = new List<ActivityInfo> ();

            foreach (var activityInfo in Context.World.Logic.Activities) {
                if (activityInfo.IsSuited (needEntry.ActionType, needEntry.ItemType, needEntry.VitalType)) {
                    possibleActivities.Add (activityInfo);
                }
            }

            // TODO: Add support for randomly choosing from multiple possibilities
            if (possibleActivities.Count > 1)
                throw new NotSupportedException ("Multiple activities identified. That's not yet supported.");

            if (possibleActivities.Count == 0)
                throw new Exception ("No activities found to address the need for " + needEntry.ItemType + ". Ensure the activities have been added to the environment logic.");

            if (Context.Settings.IsVerbose) {
                Context.Console.WriteDebugLine ("    Activity chosen: " + possibleActivities [0].ActivityType.Name);
            }

            var activity = GetActivity (person, possibleActivities [0].ActivityType, needEntry);

            return activity;
        }
Example #14
0
 public ItemDemand(Person person, ItemType needType, decimal amount)
 {
     throw new NotImplementedException ();
     /*Person = person;
     Supply = needType;
     Amount = amount;*/
 }
Example #15
0
 public GameTile(GameEnvironment world)
 {
     World = world;
     Plants = new Plant[]{ };
     People = new Person[]{ };
     Inventory = new Inventory(this, null, world.Context.Settings);
 }
        public void Test_Act_WoodIsAvailable()
        {
            Console.WriteLine ("");
            Console.WriteLine ("Preparing test");
            Console.WriteLine ("");

            var context = MockEngineContext.New (EngineSettings.DefaultVerbose);
            context.Settings.TimberMillingRate = 50;

            var person = new Person(context.Settings);
            person.Inventory.Items[ItemType.Wood] = 100;

            var tile = context.World.Tiles[0];
            tile.AddPerson (person);

            var needEntry = new NeedEntry (ActivityVerb.Mill, ItemType.Timber, PersonVitalType.NotSet, 50, 101);

            var activity = new MillTimberActivity (person, needEntry, context.Settings, context.Console);

            Console.WriteLine ("");
            Console.WriteLine ("Executing test");
            Console.WriteLine ("");

            activity.Act (person);

            Console.WriteLine ("");
            Console.WriteLine ("Analysing test");
            Console.WriteLine ("");

            Assert.AreEqual (50, person.Inventory.Items [ItemType.Timber]);
            Assert.AreEqual (10, person.Inventory.Items [ItemType.Wood]);
        }
        public void Test_Mill_NotEnoughWood()
        {
            Console.WriteLine ("");
            Console.WriteLine ("Preparing test");
            Console.WriteLine ("");

            var context = MockEngineContext.New (EngineSettings.DefaultVerbose);

            var person = new Person (context.Settings);

            var tile = context.World.Tiles[0];
            tile.AddPerson (person);

            var needEntry = new NeedEntry (ActivityVerb.Mill, ItemType.Timber, PersonVitalType.NotSet, 50, 101);

            var activity = new MillTimberActivity (person, needEntry, context.Settings, context.Console);

            Console.WriteLine ("");
            Console.WriteLine ("Executing test");
            Console.WriteLine ("");

            activity.Act (person);

            var foundNeedEntry = person.Needs [0];

            Assert.AreEqual (ItemType.Wood, foundNeedEntry.ItemType);
            Assert.AreEqual (90, foundNeedEntry.Quantity);
            Assert.AreEqual (102, foundNeedEntry.Priority);
        }
Example #18
0
 public Person CreateAdult()
 {
     var person = new Person (Settings);
     person.Gender = GetRandomGender ();
     person.Age = GetRandomAge (18, 50);
     return person;
 }
 public void PrioritizeSecondary(Person person)
 {
     throw new NotImplementedException ();
     /*if (!person.IsActive) {
         person.Priorities [PriorityTypes.Water] = 60;
     }*/
 }
        public void Page_Load(object sender, EventArgs e)
        {
            Player = EngineHolder.Context.Player;

            if (Player == null)
                throw new Exception("Player not assigned; (EngineHolder.Context.Player == null)");
        }
Example #21
0
        public void Update(Person person)
        {
            /*var isHarmed = false;

            if (person.Vitals[PersonVital.Thirst] >= 100) {
                // TODO: Reimplement
                //Context.Log.WriteLine ("The player is dying of thirst.");
                var damage = person.Vitals[PersonVital.Thirst] / 100;
                person.Vitals[PersonVital.Health] -= damage;
                isHarmed = true;
            }

            if (person.Hunger >= 100) {
                // TODO: Reimplement
                //Context.Log.WriteLine ("The player is dying of hunger.");
                var damage = person.Hunger / 100;
                person.Health -= damage;
                isHarmed = true;
            }

            if (!isHarmed)
                person.Health += 5;

            if (person.Health < 0)
                person.Health = 0;

            if (person.Health > 100)
                person.Health = 100;

            if (person.Health == 0)
                person.IsAlive = false;*/
        }
        public void Test_GeneralFunctions()
        {
            var data = GetDataManager();

            var settings = EngineSettings.DefaultVerbose;

            var person = new Person(settings);

            data.Save (person);

            var loadedTile = data.Get<Person>(person.Id);

            Assert.IsNotNull (loadedTile);

            var loadedPeople = data.Get<Person>();

            Assert.IsNotNull (loadedPeople);
            Assert.AreEqual (1, loadedPeople.Length);

            data.Delete (person);

            loadedTile = data.Get<Person>(person.Id);

            Assert.IsNull (loadedTile);
        }
        public override void Execute(Person person)
        {
            var buildStatus = GetBuildStatus (person);

            switch (buildStatus) {
            //case BuildStatus.PendingResources: // TODO: Remove if not needed. Should be obsolete
            //	if (Settings.IsVerbose)
            //		Console.WriteDebugLine ("      The person does not have enough timber.");
            //	RegisterNeedForTimber (person);
            //	//GetTimber (person);
            //	break;
            case BuildStatus.NotYetStarted:
                StartConstruction (person);
                break;
            case BuildStatus.UnderConstruction:
                ContinueConstruction (person);
                break;
            //case BuildStatus.Completed: // TODO: Remove if not needed. Should be obsolete now
            //	if (Settings.IsVerbose) Console.WriteDebugLine("Construction is complete.");
            //	break;
            }
            /*// TODO: Move this to a better loation

            if (HasEnoughTimber (person)) {
                ExecuteBuild (person);
            } else
                RegisterNeedForTimber (person);*/
        }
Example #24
0
        public override void Execute(Person person)
        {
            var amountOfHarm = 0;

            amountOfHarm += CalculateHarmFromDehydration

            VitalsChange.Add (PersonVital.Hunger, -amountOfHarm);
        }
 public override bool IsApplicable(Person person)
 {
     var personIsEating = (person.ActivityText == typeof(EatFoodActivity).Name);
     var personIsStarving = person.Vitals [PersonVitalType.Hunger] > Settings.StarvationThreshold;
     return person.IsAlive
         && personIsStarving
         && !personIsEating;
 }
        public override void RegisterNeed(Person person, ActivityVerb actionType, ItemType itemType, PersonVitalType vitalType, decimal priority)
        {
            var quantity = 100 - person.Vitals[PersonVitalType.Energy];

            if (!NeedIsRegistered (person, actionType, itemType, vitalType, quantity)) {
                AddNeed (actionType, itemType, vitalType, quantity, priority);
            }
        }
        public void Apply(Person person)
        {
            if (IsApplicable (person)) {
                Execute (person);

                Finished (person);
            }
        }
 public override bool CanAct(Person person)
 {
     if (ResourcesNeeded (person)) {
         RegisterNeedToMillTimber (person, Settings.ShelterTimberCost);
         return false;
     } else
         return true;
 }
        public override void RegisterNeed(Person person, ActivityVerb actionType, ItemType itemType, PersonVitalType vitalType, decimal priority)
        {
            var quantity = Settings.DefaultDrinkAmount;

            if (!NeedIsRegistered (person, actionType, itemType, vitalType, quantity)) {
                AddNeed (actionType, itemType, vitalType, quantity, priority);
            }
        }
 public override bool IsApplicable(Person person)
 {
     var personIsDrinking = (person.ActivityText == typeof(DrinkWaterActivity).Name);
     var personIsDehydrated = person.Vitals [PersonVitalType.Thirst] > Settings.DehydrationThreshold;
     return person.IsAlive
         && personIsDehydrated
         && !personIsDrinking;
 }
        public override bool IsApplicable(tilesim.Engine.Entities.Person person)
        {
            var personIsPlayer = (Settings.PlayerId == person.Id);

            var personIsDead = person.Vitals [PersonVitalType.Health] <= 0;

            return(personIsPlayer &&
                   personIsDead);
        }
 public override void Execute(tilesim.Engine.Entities.Person person)
 {
     throw new PlayerDiedException(person);
 }