public static CharacterRoutineTask CreateCharacterRoutineTask(CharacterRoutineTypeName routineTypeName, Character character) { CharacterRoutineTask characterRoutineTask = new CharacterRoutineTask(routineTypeName, character) .WithDuration(); return(characterRoutineTask); }
private static CharacterRoutineTypeName GetRandomRoutineType(Character character) { List <CharacterRoutineType> availableCharacterRoutineTypes = new List <CharacterRoutineType>(); // filter out available routines that are not suitable for the character's role for (int i = 0; i < RoutineManager.AvailableRoutineTypes.Count; i++) { CharacterRoutineType characterRoutineType = RoutineManager.AvailableRoutineTypes.ElementAt(i).Value; if (characterRoutineType.CharacterRoles.Count == 0 || characterRoutineType.CharacterRoles.Contains(character.Role)) { availableCharacterRoutineTypes.Add(characterRoutineType); } } // weight chances for routines based on the time of day float[] weightedIndeces = availableCharacterRoutineTypes.Select(routine => { float originalWeight = routine.ProbabilityWeight; float adjustedWeight = routine.ApplyTimeProbabilityMultiplier(originalWeight); return(adjustedWeight); }).ToArray(); //for (int p = 0; p < weightedIndeces.Length; p++) //{ // Logger.Log("adjusted weightedIndex {0} is {1}", p, weightedIndeces[p]); //} //for (int q = 0; q < availableCharacterRoutineTypes.Count; q++) //{ // Logger.Log("availableCharacterRoutineTypes name{0} is {1}", q, availableCharacterRoutineTypes[q].Name); //} int randomWeightIndex = Util.GetRandomWeightedIndex(weightedIndeces); CharacterRoutineTypeName randomCharacterRoutineType = availableCharacterRoutineTypes[randomWeightIndex].Name; return(randomCharacterRoutineType); }
public CharacterRoutineTask(CharacterRoutineTypeName routineTypeName, Character character) { CharacterRoutineTypeName = routineTypeName; Character = character; // get all possible room object types for routineTypeName List <RoomObjectName> roomObjectNames = GetRoomObjectsForTask(routineTypeName); if (roomObjectNames.Count == 0) // routines that do not require an object to interact with, such as Idle animations { Logger.Log(Logger.Interaction, "This character routine does not have an task location room object: {0}", routineTypeName); return; } // get all room objects of that possible types that are on the map List <RoomObjectGO> roomObjectsGOs = new List <RoomObjectGO>(); for (int i = 0; i < roomObjectNames.Count; i++) { roomObjectsGOs = RoomManager.RoomObjectGOs.Where( roomObjectGO => { return(roomObjectGO.RoomObject.RoomObjectName == roomObjectNames[i] && // find all room objects of correct type of task roomObjectGO.InteractingCharacter == null); // only pick room objects that are available } ).ToList(); } if (roomObjectsGOs.Count > 0) { int random = UnityEngine.Random.Range(0, roomObjectsGOs.Count); TaskLocationRoomObject = roomObjectsGOs[random]; } }
public Dictionary <int, float> TimeProbabilityMultiplier; // int, float = hour, probability multiplier private CharacterRoutineType(CharacterRoutineTypeName name) { Name = name; RoomObjects = new List <RoomObjectName>(); CharacterRoles = new List <Role>(); ProbabilityWeight = 100; TimeProbabilityMultiplier = new Dictionary <int, float>(); }
private List <RoomObjectName> GetRoomObjectsForTask(CharacterRoutineTypeName routineTypeName) { if (!RoutineManager.AvailableRoutineTypes.ContainsKey(routineTypeName)) { Logger.Error("Could not find routine {0} among the available routine tasks", routineTypeName); } CharacterRoutineType characterRoutineType = RoutineManager.AvailableRoutineTypes[routineTypeName]; return(characterRoutineType.RoomObjects); }
public static CharacterRoutineType Create(CharacterRoutineTypeName name) { CharacterRoutineType characterRoutineType = new CharacterRoutineType(name); switch (name) { case CharacterRoutineTypeName.Idle1: return(characterRoutineType.Idle()); case CharacterRoutineTypeName.MakePhoneCall: return(characterRoutineType.MakePhoneCall()); case CharacterRoutineTypeName.Sing: return(characterRoutineType.Sing()); case CharacterRoutineTypeName.Sleep: return(characterRoutineType.Sleep()); default: Logger.Error("Cannot find a creation function for character routine name {0}", name); return(null); } }