Hey,
I'm looking at using Love/Hate for the following project:
A small but dense sandbox (similar idea to Streets of Rogue scale), where NPCs belong to factions , different classes and have different personalities. The player is a hunting a target (NPC) and interacts with NPCs in the level to work out their social connections, get their favour/help, interrogate them etc. to uncover clues to the player target. I'm looking for a system that will help with:
• Procedurally generate a database of NPCs with variations of all the above traits
• NPCs have a schedule based on their traits
• NPCs are aware of events going on around them.
• NPCs are part of a social network based on their traits
For instance, NPC 1 has 3 connections to other NPCs based on their personalities (e.g. NPC number 6, 12 and 15).
NPC 1 will know details about these other NPCs, and will react to their status changing.
Now looking at the Love/Hate youtube materials, it seems it hits the mark on the first 3 points, but how well can it support on the last point? How well can it handle a web of connections rather than just broader and more binary factions? Also how well does this scale? Could I run it for 100 NPCs at once? with those NPCs interacting without the player near by? what are the limits on this?
Thanks and I'm looking forward to your answer.
Love/Hate capability for creating/managing social networks
Re: Love/Hate capability for creating/managing social networks
Hi,
>• Procedurally generate a database of NPCs with variations of all the above traits
You can procedurally generate NPCs and/or create them manually in the editor. You'll probably want each NPC to have its own faction. The NPC's faction can inherit from any number of parent factions. (Those parents can have parents, and so on.) The NPC's faction can inherit personality traits and relationship values from its parents. However, Love/Hate doesn't have a concept of classes. You could either add a class "faction" as another parent, or define classes on your own separately from factions.
>• NPCs have a schedule based on their traits
You can certainly read trait values and take action based on those values, but there's nothing built into Love/Hate to, for example, animate an NPC to wake up and walk to the bakery to bake bread based on those values.
>• NPCs are aware of events going on around them.
>• NPCs are part of a social network based on their traits
Yes. These are the two key elements of Love/Hate.
> Also how well does this scale? Could I run it for 100 NPCs at once?
100 NPCs is no problem. The "performance load" test case we use is 10,000 NPCs all interacting at the same time.
> with those NPCs interacting without the player near by? what are the limits on this?
Each event can specify that it's reported globally (i.e., to all NPCs in the scene) or within a specified radius of the actor. If it's within a specified radius of the actor, you can optionally configure NPCs to do perception checks to determine if they notice the event.
Please feel free to try the evaluation version. Love/Hate will be on sale on the Asset Store through the end of next Monday.
>• Procedurally generate a database of NPCs with variations of all the above traits
You can procedurally generate NPCs and/or create them manually in the editor. You'll probably want each NPC to have its own faction. The NPC's faction can inherit from any number of parent factions. (Those parents can have parents, and so on.) The NPC's faction can inherit personality traits and relationship values from its parents. However, Love/Hate doesn't have a concept of classes. You could either add a class "faction" as another parent, or define classes on your own separately from factions.
>• NPCs have a schedule based on their traits
You can certainly read trait values and take action based on those values, but there's nothing built into Love/Hate to, for example, animate an NPC to wake up and walk to the bakery to bake bread based on those values.
>• NPCs are aware of events going on around them.
>• NPCs are part of a social network based on their traits
Yes. These are the two key elements of Love/Hate.
> Also how well does this scale? Could I run it for 100 NPCs at once?
100 NPCs is no problem. The "performance load" test case we use is 10,000 NPCs all interacting at the same time.
> with those NPCs interacting without the player near by? what are the limits on this?
Each event can specify that it's reported globally (i.e., to all NPCs in the scene) or within a specified radius of the actor. If it's within a specified radius of the actor, you can optionally configure NPCs to do perception checks to determine if they notice the event.
Please feel free to try the evaluation version. Love/Hate will be on sale on the Asset Store through the end of next Monday.
Re: Love/Hate capability for creating/managing social networks
Thanks for the swift reply. And thanks for being clear on what the Love/Hate system can and cant do.
>• NPCs have a schedule based on their traits
On this one, I did assume I would do the coding for the scheduling, but really what I wanted to know was that Love/Hate could pass traits to my scheduling system and then my scheduling system could generate the kind of things that they would do.
A bit of a detailed question but I'm curious if you have thoughts: the suggestion you made is using Love/Hate to determine schedules by reading the NPC Trait values as an input to a NPC scheduling system. Given an NPC has multiple traits, how would it work?
As an example: if an NPC had a high Social trait, I could give them tasks to go to the bar and talk to people
If the same NPC had a high Violence trait I could make them go to a fight club.
So both activities are applicable, and I could easily code it so that one is chosen randomly, but can you think of smarter ways to do this?
I suppose I'm asking is how should we know how to process an NPC accounting for all the traits together
>• NPCs have a schedule based on their traits
On this one, I did assume I would do the coding for the scheduling, but really what I wanted to know was that Love/Hate could pass traits to my scheduling system and then my scheduling system could generate the kind of things that they would do.
A bit of a detailed question but I'm curious if you have thoughts: the suggestion you made is using Love/Hate to determine schedules by reading the NPC Trait values as an input to a NPC scheduling system. Given an NPC has multiple traits, how would it work?
As an example: if an NPC had a high Social trait, I could give them tasks to go to the bar and talk to people
If the same NPC had a high Violence trait I could make them go to a fight club.
So both activities are applicable, and I could easily code it so that one is chosen randomly, but can you think of smarter ways to do this?
I suppose I'm asking is how should we know how to process an NPC accounting for all the traits together
Re: Love/Hate capability for creating/managing social networks
Your scheduling system can read personality trait values by calling FactionDatabase.GetPersonalityTrait(). For performance, traits are identified by int IDs, so it might look something like:
(Here's the complete API Reference.)
If you want to spice up activity selection, you could treat the combination of traits as a vector. For example, say you have 3 traits: Social, Violence, and Hedonism. So an NPC's "personality" might be defined by the vector <Social, Violence, Hedonism>.
Then define a vector for each activity. Going to a bar could be <Social=100, Violence=0, Hedonism=100>, whereas going to church could be <Social=100, Violence=0, Hedonism=0>:
Then identify the activity vector that's closest to the NPC's vector. That's the NPC's "ideal" activity.
To make it more interesting, check the distances of all activities to the NPC's vector. Make a list of all activities that are, say, within 10% of the same distance as the ideal activity. Finally, do a weighted random selection of the list.
For example, if the player's vector is <Social=100, Violence=0, Hedonism=50>, then the weighted selection would be 50% for Bar and 50% for Church.
However, if the player's vector is <Social=100, Violence=0, Hedonism=75>, then the weighted selection would be 67% for Bar and only 33% for Church.
Code: Select all
int socialID = FactionManager.factionDatabase.GetPersonalityTraitID("Social");
float socialTraitValue = FactionManager.factionDatabase.GetPersonalityTrait("Adam", socialID);
If you want to spice up activity selection, you could treat the combination of traits as a vector. For example, say you have 3 traits: Social, Violence, and Hedonism. So an NPC's "personality" might be defined by the vector <Social, Violence, Hedonism>.
Then define a vector for each activity. Going to a bar could be <Social=100, Violence=0, Hedonism=100>, whereas going to church could be <Social=100, Violence=0, Hedonism=0>:
Then identify the activity vector that's closest to the NPC's vector. That's the NPC's "ideal" activity.
To make it more interesting, check the distances of all activities to the NPC's vector. Make a list of all activities that are, say, within 10% of the same distance as the ideal activity. Finally, do a weighted random selection of the list.
For example, if the player's vector is <Social=100, Violence=0, Hedonism=50>, then the weighted selection would be 50% for Bar and 50% for Church.
However, if the player's vector is <Social=100, Violence=0, Hedonism=75>, then the weighted selection would be 67% for Bar and only 33% for Church.
Re: Love/Hate capability for creating/managing social networks
Thats a great way of framing the approach. Thanks for the help, I will be making a purchase and looking forward to playing around with those systems.
Re: Love/Hate capability for creating/managing social networks
Sounds good! If you have any questions about using Love/Hate as you dig into it, just let me know.