예제 #1
0
        public void RollDiceAndExecuteOneOutcome(SocietySnapshot currentCast, Random rng)
        {
            InitializeTextSummary();

            var chosen = AObjectWithProbability.PickOne(AllPossibleOutcomes, rng);

            this.outcomeTextSummary.AddRange(chosen.Execute());
            this.textSummary.AddRange(outcomeTextSummary);
        }
예제 #2
0
        //Future: implement generic groups (ie races, nationalities, economic classes) #TODO

        public SocietySnapshot Copy()
        {
            var theCopy = new SocietySnapshot();

            foreach (Character c in AllCharacters)
            {
                theCopy.AllCharacters.Add(c.Copy());
            }

            return(theCopy);
        }
예제 #3
0
        public void PopulateAllRoles_Randomly(SocietySnapshot currentCast, Random rng)
        {
            if (rng == null)
            {
                rng = new Random();
            }

            var nonParticipants = currentCast.AllCharacters.ToList();//must copy list to avoid changes to original

            foreach (Role r in this.allRoles)
            {
                r.AddParticipantsRandomly(nonParticipants, rng);
                nonParticipants = nonParticipants.Where(n => false == r.Participants.Any(p => n.Id == p.Id)).ToList();
            }
        }
예제 #4
0
        public bool TryToPopulateIncident(SocietySnapshot currentCast, Random rng)
        {
            if (MyPrerequisites.Any() == false)
            {
                PopulateAllRoles_Randomly(currentCast, rng);
                return(true);
            }
            else
            {
                PopulateAllRoles_FollowingPrereqs(currentCast, rng);
            }

            var allAreFulfilled = !prerequisites.Any(p => p.IsMetByCurrentParticipants() == false);

            return(allAreFulfilled);
        }
예제 #5
0
        public void PopulateAllRoles_FollowingPrereqs(SocietySnapshot currentCast, Random rng)
        {
            if (rng == null)
            {
                rng = new Random();
            }

            var nonParticipants = currentCast.AllCharacters.ToList();//must copy list to avoid changes to original

            //Start with whichever role is hardest to fill
            var rolesOrderedByCountOfFirstCandidates = allRoles.OrderBy(r =>
                                                                        r.FirstCandidateOptions(nonParticipants, MyPrerequisites, currentCast).Count
                                                                        + (r.MinCount == 0 ? 1 : 0));//add to count if min particpants == 0

            var roleToStartWith = rolesOrderedByCountOfFirstCandidates.First();
            var firstCandidates = roleToStartWith.FirstCandidateOptions(nonParticipants, MyPrerequisites, currentCast);

            roleToStartWith.AddOneParticipantRandomly(firstCandidates, rng);
            nonParticipants = nonParticipants.Where(n => false == roleToStartWith.Participants.Any(p => n.Id == p.Id)).ToList();

            //One cycle through roles, adding one participant to each
            foreach (Role r in this.allRoles)
            {
                if (r.RoleName == roleToStartWith.RoleName)
                {
                    continue;
                }

                if (r.MinCount == 0 && rng.Next(0, Role.DEFAULT_ROLE_MAX_COUNT) == 0)//chance to leave empty roles that are allow to have 0 participants
                {
                    continue;
                }

                var theCandidates = r.CandidatesThatPassPrereqs(nonParticipants, MyPrerequisites);
                r.AddOneParticipantRandomly(theCandidates, rng);
                nonParticipants = nonParticipants.Where(n => false == r.Participants.Any(p => n.Id == p.Id)).ToList();
            }

            //Cycle again, adding further participants
            foreach (Role r in this.allRoles)
            {
                r.AddParticipantsRandomly_RetestingAfterEach(nonParticipants, MyPrerequisites, rng);
                nonParticipants = nonParticipants.Where(n => false == r.Participants.Any(p => n.Id == p.Id)).ToList();
            }
        }
        public override bool IsCharacterViableFirstCandidateForRole(Character candidate, string nameOfRole, SocietySnapshot currentCast)
        {
            if (nameOfRole == this.roleAlpha.RoleName)
            {
                int minRoleB = roleBeta.MinCount.HasValue ? roleBeta.MinCount.Value : 0;
                if (CountRelationsThatPassBenchmark(candidate) < minRoleB)
                {
                    return(false);
                }
            }
            else if (nameOfRole == this.roleBeta.RoleName)
            {
                if (false == currentCast.AllCharacters.Any(a => HasDirectionalRelationThatPassesBenchmark(a, candidate)))
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #7
0
 public void ExecuteIncidentAndStoreAfter(IIncident oneIncident, SocietySnapshot currentCast, Random rng)
 {
     oneIncident.RollDiceAndExecuteOneOutcome(currentCast, rng);
     this.TheIncidents.Add(oneIncident);
     this.TheCastOverTime.Add(currentCast.Copy());
 }
예제 #8
0
 public Plot(SocietySnapshot givenStartingCast)
 {
     startingCast    = givenStartingCast.Copy();
     theIncidents    = new List <IIncident>();
     theCastOverTime = new List <SocietySnapshot>();
 }
예제 #9
0
        public List <Character> FirstCandidateOptions(List <Character> theCandidates, List <IPrerequisite> thePrereqs, SocietySnapshot currentCast)
        {
            var viableFirstCandidates = new List <Character>();

            viableFirstCandidates = theCandidates.Where(c => false == thePrereqs.Any(p => false == p.IsCharacterViableFirstCandidateForRole(c, this.RoleName, currentCast))).ToList();
            return(viableFirstCandidates);
        }
예제 #10
0
 public abstract bool IsCharacterViableFirstCandidateForRole(Character candidate, string nameOfRole, SocietySnapshot currentCast);
        public override bool IsCharacterViableFirstCandidateForRole(Character candidate, string nameOfRole, SocietySnapshot currentCast)
        {
            if (nameOfRole == this.role.RoleName)
            {
                int minParticipants          = role.MinCount.HasValue ? role.MinCount.Value : 0;
                int countQualifyingRelations = currentCast.AllCharacters.Count(b => HaveMutualRelationThatPassesBenchmark(candidate, b));

                if (countQualifyingRelations < minParticipants)
                {
                    return(false);
                }
            }

            return(true);
        }