public bool Encounter(Person person)
        {
            var finalTerritory = _rootTerritory.GetLiveableTerritories().First(t => t != person.Location);

            person.AddFlag(TravelFlags.SettledFlag);
            finalTerritory.MovePerson(person);
            person.Log("I have settled permanently at {0}.", person.Location.Name);

            return true;
        }
        public bool Encounter(Person person)
        {
            var month = _random.Next(3, 8);
            person.AddFlag(RomanticFlags.EngagedFlag);
            person.Partner.AddFlag(RomanticFlags.EngagedFlag);
            person.ClearFlag(RomanticFlags.DatingFlag);
            person.Partner.ClearFlag(RomanticFlags.DatingFlag);

            person.PopulationModule.SaveChanges(person.Partner);

            return true;
        }
        public bool Encounter(Person person)
        {
            person.Gender = person.Gender == "Female"
                ? "Male"
                : "Female";
            person.FirstName = this._firstNameGenerator.Build(person).FirstName;
            person.Log(string.Format("Changed their name to {0} {1} and is now transistioning", person.FirstName,
                person.FamilyName));
            person.AddFlag(IdentityFlags.TransitioningFlag);

            return true;
        }
        public bool Encounter(Person person)
        {
            var mate = person.Partner;

            // Mate them up!
            person.Log("I married {0}.", mate.Name);
            mate.Log("I married {0}. ", person.Name);
            person.AddFlag(RomanticFlags.MarriedFlag);
            mate.AddFlag(RomanticFlags.MarriedFlag);

            if (person.HasFlag(RomanticFlags.EngagedFlag))
            {
                person.ClearFlag(RomanticFlags.EngagedFlag);
                mate.ClearFlag(RomanticFlags.EngagedFlag);
            }

            person.PopulationModule.SaveChanges(mate);

            return true;
        }
        public bool Encounter(Person person)
        {
            var potentialPartner =
                person.Location.GetPeopleWhere(p => ValidPartner(person, p))
                    .OrderBy(_ => Guid.NewGuid())
                    .FirstOrDefault();
            if (potentialPartner == null)
            {
                return false;
            }

            person.Log("I've started dating {0}!", potentialPartner.Name);
            potentialPartner.Log("I've started dating {0}!", person.Name);
            person.AddFlag(RomanticFlags.DatingFlag);
            potentialPartner.AddFlag(RomanticFlags.DatingFlag);

            person.Partner = potentialPartner;
            person.PopulationModule.SaveChanges(potentialPartner);

            return true;
        }
        public Person Build(Person father = null, Person mother = null)
        {
            var person = new Person
            {
                Sex = _random.NextDouble() > 0.5
                    ? "Female"
                    : "Male",
                Fate = new Fate(_random.Next())
            };

            person.Gender = person.Sex;
            person.BirthDate = Universe.CurrentUniverse.CurrentTime;
            person = _firstNameGenerator.Build(person);

            if (father != null
                && mother != null)
            {
                person.FamilyName = mother.FamilyName;
            }
            else
            {
                person = _lastNameGenerator.Build(person);
            }

            // Transgender?
            if (0.063474382 > _random.NextDouble())
                person.AddFlag(IdentityFlags.TransgenderFlag);

            // Generate Personality
            person.Personality = Personality.CreateRandom(_random);

            // Generate Fate
            person.Fate.CalculateLifeline();

            return person;
        }