Evaluation questions

Announcements, support questions, and discussion for Love/Hate.
Post Reply
Furiant
Posts: 2
Joined: Thu Dec 28, 2017 10:20 am

Evaluation questions

Post by Furiant »

First, I want to say that I'm impressed with the detail that went into this product. I had intended to develop my own emotion/relationship system. I only found yours by accident on the Asset Store and was relieved to think I might not have to do all that work :)

Anyway, I have a few questions.
  1. The idea of every character having its own faction. I think I get the point here, but it seems like it would add up to a lot of factions... I plan to have about a hundred distinct NPCs, in addition to a party of semi-player-controlled characters. Am I understanding this right, that each character should own a separate faction that is in turn a child of other ones? And then party members also belong to a Party faction?
  2. Dominance: I'm a little muddy on this mechanic. For instance, in the manual it reads "...witnessing
    aggressive deeds against friends will make characters feel submissive." Maybe I'm reading it wrong, but if someone walked up and slapped my wife, I don't think I'd feel submissive; in fact I'd likely feel very aggressive... but the term "dominant" is confusing here. Can you elaborate on the exact nature of dominance as it applies to character behavior?
  3. Cooldowns/timers: The game I'm developing will have both real-time and turn-based modes. How should I handle timing in turn-based scenarios? My first thought was to use an artificial clock which stops in turn-based mode, and I manually advance it a certain amount after each turn. Does that sound like an approach that the product would handle well? I saw the bit on "custom time", but it was a bit unclear to me.
  4. Deed Impact/Aggression: I'm wondering why these are "baked in" for each deed. Why not have them as parameters of ReportDeed? Let's say I have a "Heal" deed. A character healing another for 1 health point would have the same effect as healing them from the brink of death. In order to represent the contextual impact of those situations, I'd need to create 2 version of Heal: "Trivial" and "Life-Saving"? Stealing a grape from a rich merchant vs. stealing a homeless orphan's blanket... they're both stealing but one is far worse. Or someone pulling off a crazy daring heist of a grape -- low impact, high aggression. I'd have expected: ReportDeed(key, impact, aggression) for handling such variations.
  5. My intent with "traits" was mostly to have them inform how characters react to dialogue. For one, the responses available to the character would be determined by their Trait loadout (a character who was meek would have different response options from one who was assertive). Also, characters have different emotional reactions to things other characters say (someone highly moral would feel negatively about an NPC asking them to steal). I saw your example about checking Affinity, but wanted to make sure that more advanced checks were possible in the DialogueSystem which I'm also evaluating.
Sorry if some of this is answered in the API reference; honestly I haven't pored over every line.

Thanks in advance.
User avatar
Tony Li
Posts: 20625
Joined: Thu Jul 18, 2013 1:27 pm

Re: Evaluation questions

Post by Tony Li »

Hi,
Furiant wrote: Thu Dec 28, 2017 11:00 amThe idea of every character having its own faction. I think I get the point here, but it seems like it would add up to a lot of factions... I plan to have about a hundred distinct NPCs, in addition to a party of semi-player-controlled characters. Am I understanding this right, that each character should own a separate faction that is in turn a child of other ones? And then party members also belong to a Party faction?
Yes. I test Love/Hate with 10,000 factions on 10,000 faction members in a scene. Performance-wise, a few hundred factions is no problem. Factions could have been called something like "character profiles," but since they can also apply to an entire class of characters (such as a horde of generic goblins), "factions" seems the best fit.
Furiant wrote: Thu Dec 28, 2017 11:00 amDominance: I'm a little muddy on this mechanic. For instance, in the manual it reads "...witnessing
aggressive deeds against friends will make characters feel submissive." Maybe I'm reading it wrong, but if someone walked up and slapped my wife, I don't think I'd feel submissive; in fact I'd likely feel very aggressive... but the term "dominant" is confusing here. Can you elaborate on the exact nature of dominance as it applies to character behavior?
If you're a 90-pound weakling, and an intimidating hulk of a biker slaps your wife, you might feel cowed (i.e., lose Dominance). But your Pleasure would still go down, and your Arousal would go up, regardless of characters' difference in Power Levels. If you don't like this behavior, you can assign a delegate function to FactionMember.EvaluateRumor to handle it differently.
Furiant wrote: Thu Dec 28, 2017 11:00 amCooldowns/timers: The game I'm developing will have both real-time and turn-based modes. How should I handle timing in turn-based scenarios? My first thought was to use an artificial clock which stops in turn-based mode, and I manually advance it a certain amount after each turn. Does that sound like an approach that the product would handle well? I saw the bit on "custom time", but it was a bit unclear to me.
You're exactly right. The static GameTime class has a GameTime.mode property that you can set to Manual. You're then responsible for manually advancing GameTime.time.
Furiant wrote: Thu Dec 28, 2017 11:00 amDeed Impact/Aggression: I'm wondering why these are "baked in" for each deed. Why not have them as parameters of ReportDeed? Let's say I have a "Heal" deed. A character healing another for 1 health point would have the same effect as healing them from the brink of death. In order to represent the contextual impact of those situations, I'd need to create 2 version of Heal: "Trivial" and "Life-Saving"? Stealing a grape from a rich merchant vs. stealing a homeless orphan's blanket... they're both stealing but one is far worse. Or someone pulling off a crazy daring heist of a grape -- low impact, high aggression. I'd have expected: ReportDeed(key, impact, aggression) for handling such variations.
It's designed this way just to keep it as simple as possible, especially for devs who don't want to do any scripting. You can always manually report a deed by calling FactionManager.CommitDeed.
Furiant wrote: Thu Dec 28, 2017 11:00 amMy intent with "traits" was mostly to have them inform how characters react to dialogue. For one, the responses available to the character would be determined by their Trait loadout (a character who was meek would have different response options from one who was assertive). Also, characters have different emotional reactions to things other characters say (someone highly moral would feel negatively about an NPC asking them to steal). I saw your example about checking Affinity, but wanted to make sure that more advanced checks were possible in the DialogueSystem which I'm also evaluating.
Yes. The Dialogue System uses Lua for conditions. (You're probably already familiar, but Lua is a very simple scripting language.) Love/Hate's Lua functions are listed on page 40 of the Love/Hate 1.8.8 manual.

For example, you could set up a conversation like this:
  • Player: "Are you ready to attack the castle?"
    • NPC: "Umm, can I stay behind?"
      Conditions: GetPersonalityTrait(Variable["Conversant"], "Assertiveness") < 0
    • NPC: "Yes!!! For honor and glory!!!"
      Conditions: GetPersonalityTrait(Variable["Conversant"], "Assertiveness") >= 0
If you have any other questions or would like more details on any of this, just let me know.
Furiant
Posts: 2
Joined: Thu Dec 28, 2017 10:20 am

Re: Evaluation questions

Post by Furiant »

Thank you for the detailed response!

Regarding
  • Deeds: Good to know that I can manually report deeds with any arguments I like. I'll probably end up using this primarily.
  • Dominance: So I was wondering if Dominance worked like that always -- if someone harms your friend, it's assumed they are more powerful than you. I think this is a bit too simplistic for me out of the box, so I'll look into overriding EvaluateRumor to create something more to my liking. Edit: I found more references in the manual, and it looks like I might be able to override that to some extent? I guess my question was about its innate meaning, other than just being another value to check against. I suppose that's for me to decide.
  • Dialogue conditions: Okay, good to know. I don't have a ton of experience with LUA but it looks C-based so I can probably hack my way through it.
I'll probably have more questions in the future, but I'll try and do more research before posting here. Have a great day!
User avatar
Tony Li
Posts: 20625
Joined: Thu Jul 18, 2013 1:27 pm

Re: Evaluation questions

Post by Tony Li »

Happy to help!

Dominance takes relative power levels into account. If the deed actor is a higher power level than the witness, the witness will feel intimidated (reduced feeling of dominance). If the actor is a lower power level, the witness will feel annoyed (increased feeling of dominance). By default all faction members have power level 1. But you can override a faction member's power level by assigning a delegate function to FactionMember.GetPowerLevel. Or, if you want to get even more nuanced, you can assign a delegate to FactionMember.GetSelfPerceivedPowerLevel, which is the power level that the witness thinks it has. (For example, cocky or self-deluded NPC could have a higher self-perceived power level than its actual power level.)

Lua is really simple. It won't get any more complex than the example above, For basic things, like checking Dialogue System variables or quest states, you can use a dropdown menu that generates the Lua for you. It's really only third party integrations (such as the Love/Hate integration) that require manually entering the Lua expressions because they aren't tied into the dropdown menu.
Post Reply