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];
        }
    }
Beispiel #4
0
    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);
    }
Beispiel #6
0
    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);
        }
    }