Alpha 20 Arrives on Steam Latest!

Alpha 20: In Which We Put the Hearth in Hearthlings

”Happiness is a Warm Poyo”

Welcome to Stonehearth Alpha 20! This release brings a new Happiness system to Stonehearth and takes a first step into deepening the impact of hearthlings’ interaction with their world and each other. It also introduces a couple of new combat mechanisms–a rising morale buff to help noncombatants oppressed by the enemy and a new option to rescue hearthlings defeated in combat, assuming you have the resources available to devote to this.

Remember, you need to opt in to the Steam unstable (latest) branch to experience this preview release. As with all unstable releases, you’re likely to encounter bugs and glitches… but please let us know what you find!


it’s a longer post, so go to the actual blog post if you want to read the whole thing :wink:

http://www.stonehearth.net/alpha-20-arrives-on-steam-latest/

12 Likes

These changes look fantastic! I’m very excited to experience the new happiness features, and the rescue system sounds very neat.

Does this alpha contain the changes such that hearthlings prioritize better food now, or is that coming later?

1 Like

Now eat 2x a day, Question? Do they eat less each time equaling the amount they would as in once a day or consume the same as 1 day both times? Kinda making me scared for farmers (Like I’m going to have to make 2 farmers at start instead of 1)

1 Like

For Translators:

unit_frame.less:

  display: flex;
  flex-wrap: wrap-reverse; /* child divs will stack from bottom to top */
  z-index: 5;
        height: 40px;

.thoughtBubble {
position: absolute;
left: 7px;
bottom: 84px;
background-image: url(images/thought_bubbles.png);
width: 17px;
height: 23px;
z-index: 5;
} -> added

undead_population.json:

  },
  "zombie_giant" : {
     "male" : {
        "uri" : ["stonehearth:monsters:undead:zombie:giant_male"],
        "given_names" : [
           "Broo",
           "Jokok",
           "Craglek",
           "Lost",
           "Empt",
           "Brok",
           "Holvo",
           "Despr",
           "Desnad",
           "Ton",
           "Ren",
           "Trest",
           "Garef",
           "Lee",
           "Dih",
           "Sher",
           "Beck",
           "Ian",
           "Nameless"
        ]
     },
     "female" : {
        "uri" : ["stonehearth:monsters:undead:zombie:giant_female"],
        "given_names" : [
           "Kate",
           "Amy",
           "Idra",
           "Loss",
           "Mourn",
           "Bleck",
           "Ness",
           "Lene",
           "Elia",
           "Essa",
           "Elie",
           "Nameless"
        ]
     },
     "surnames" : [
        "the Green",
        "the Dead",
        "the FleshEater",
        "the Rotting",
        "Once-Human",
        "HeadKnocker",
        "the Giant"
     ] -> added

en-rayya.json:

        },
        "herbalists_workshop": {
           "display_name": "Herbalist's Workshop"  -> added

citizens.less:

  •   h2 {
       margin-left: 10px;
    } -> removed
    
  •      text-align: center;
       margin-left: 10px;
       text-align: left;
       text-align: left; -> added
    
  •    td:nth-child(6) {
       white-space: nowrap;
       width: 240px;
       align: left;
       text-align: left;
    } -> replaced
    
  •   td:nth-child(1) {
       width: 265px;
       text-align: left;
       vertical-align: middle;
    
       .controlFont;
       font-size: 20px;
    
       text-overflow: ellipsis;
       white-space: nowrap;
       overflow: hidden;
       .classIcon {
          vertical-align: middle;
          width: 40px;
          height: 40px;
       } -> replaced
    
  •   .nameRow {
       width: 240px;
       text-align: left;
       vertical-align: middle;
    
       controlFont;
       font-size: 20px;
    
       text-overflow: ellipsis;
       white-space: nowrap;
       overflow: hidden;
       .classIcon {
          vertical-align: middle;
          width: 40px;
          height: 40px;
       } -> added
    
  •      width: 265px; -> removed
    
  • .moodRow {
    width: 40px;
    padding-right: 10px;
    }

    .moodIcon {
    height: 40px;
    } -> added

en.json:

  •         "incapacitated": "incapacitated",
          "rescue_citizen": "rescuing [name(data.target)]",
          "recuperating": "recuperating" -> added
    
  •          "town_morale": "Town Morale", -> added
    
  •            "description": "This hearthling's overall happiness",
             "town_description": "How happy your citizens are overall." -> changed
    
  •         },
          "content": {
             "display_name": "Content",
             "town_description": "Your citizens are satisfied with the way things have been going."
          },
          "jubilant": {
             "display_name": "Jubilant",
             "town_description": "Your citizens are incredibly happy living here!"
          },
          "forlorn": {
             "display_name": "Forlorn",
             "town_description": "Your citizens have been having an incredibly hard time lately."
          },
          "merry": {
             "display_name": "Merry",
             "town_description": "Your citizens are generally happy."
          },
          "glum": {
             "display_name": "Glum",
             "town_description": "Your citizens aren't feeling great, overall." -> added
    
  •         },
          "sandy_poyo": {
             "display_name": "Sandy Poyo"
          },
          "fennec_fox": {
             "display_name": "Fennec Fox" -> added
    
  •                                    "bulletin_title": "Mountain roars his approval", ->changed
    
  •      "bed_ridden": {
          "bed_ridden_buff": { -> replaced
    
  •            "display_name": "Defensive Spirit", -> replaced
    
  •         }
       },
       "incapacitated": {
          "incapacitated_buff": {
             "display_name": "Incapacitated",
             "description": "Someone help this poor hearthling!"
          }
       },
       "recuperating": {
          "recuperating_buff": {
             "display_name": "Recuperating",
             "description": "Still incapacitated, but slowly recovering over time. An herbalist can help speed up recovery."
          }
       },
       "recently_treated": {
          "recently_treated_buff": {
             "display_name": "Recently Treated",
             "description": "This hearthling was recently attended to by a medic and will need to rest awhile before another treatment."
          }
       },
       "mood": {
          "forlorn": {
             "forlorn_mood_buff": {
                "display_name": "Forlorn",
                "description": "It's been incredibly hard going of late."
             }
          },
          "glum": {
             "glum_mood_buff": {
                "display_name": "Glum",
                "description": "Stuff hasn't been turning out as I would like. "
             }
          },
          "content": {
             "content_mood_buff": {
                "display_name": "Content",
                "description": "All things considered, I'm doing okay."
             }
          },
          "merry": {
             "merry_mood_buff": {
                "display_name": "Merry",
                "description": "Today is a good day."
             }
          },
          "jubilant": {
             "jubilant_mood_buff": {
                "display_name": "Jubilant",
                "description": "Wow, I couldn't be happier!"
             }
          }
       },
       "town_alert": {
          "town_alert_courage_buff": {
             "display_name": "Rising Courage",
             "description": "Increasing courage when defending the town as long as they are not attacked"
          },
          "town_alert_banner_buff": {
             "display_name": "Town Alert Banner Buff",
             "description": "Emits a stacking courage buff every 5 minutes" -> added
    
  •      },
       "rescue": {
          "display_name": "Rescue",
          "description": "Tells the town's people to try to rescue this hearthling" -> added
    
  •   },
    "happiness": {
       "thoughts": {
          "hunger": {
             "hungry": {
                "display_name": "Hungry",
                "tooltip": "I could really go for a good meal."
             },
             "famished": {
                "display_name": "Famished",
                "tooltip": "It's been awhile since I've eaten. I really need some food!"
             },
             "starving": {
                "display_name": "Starving",
                "tooltip": "My stomach is in knots!  If I don't find something to eat soon..."
             },
             "values": {
                "stuffed": {
                   "display_name": "Stuffed",
                   "tooltip": "My last meal was so filling I won't need to eat again for a bit."
                }
             }
          },
          "space": {
             "spacious": {
                "display_name": "Spacious Environment",
                "tooltip": "Then is a really open space. It makes me feel at ease."
             },
             "cramped": {
                "display_name": "Cramped Environment",
                "tooltip": "This area is pretty tight. I have to watch my step so as not to bump into anything."
             },
             "very_cramped": {
                "display_name": "Very Cramped Environment",
                "tooltip": "This place is suffocating! There's barely room to breathe."
             }
          },
          "health": {
             "pain_mild": {
                "display_name": "Pain (Mild)",
                "tooltip": "Ow ow ow!"
             },
             "pain_moderate": {
                "display_name": "Pain (Moderate)",
                "tooltip": "Agh, I'm in rough shape!"
             },
             "pain_scratched": {
                "display_name": "Pain (Scratched)",
                "tooltip": "I'm a little worse for wear."
             },
             "pain_severe": {
                "display_name": "Pain (Severe)",
                "tooltip": "!!!"
             }
          },
          "sleeping": {
             "slept_on_ground": {
                "display_name": "Slept on ground",
                "tooltip": "My back is killing me from having slept on the ground. When are we going to get some decent beds?"
             },
             "slept_in_shared_bed": {
                "display_name": "Slept in a shared bed",
                "tooltip": "I'm sharing my bed with someone else right now. It's not the worst, but I really wish I had my own."
             },
             "slept_in_comfy_bed": {
                "display_name": "Slept in a comfy bed",
                "tooltip": "My bed is really comfortable. I felt refreshed when I woke up!"
             }
          },
          "eating": {
             "ate_fine": {
                "display_name": "Ate a fine meal",
                "tooltip": "My recent meal was amazing! Whoever made the [str(foodname)] really put their heart into it."
             },
             "ate_tasty": {
                "display_name": "Ate a tasty meal",
                "tooltip": "The [str(foodname)] I ate was pretty tasty! I still remember the combination of flavors."
             },
             "ate_raw": {
                "display_name": "Ate a raw meal",
                "tooltip": "I recently ate a raw [str(foodname)].  I could almost taste the dirt on it.  Bleh!"
             },
             "ate_bland": {
                "display_name": "Ate a bland meal",
                "tooltip": "I remember eating a bland [str(foodname)]. It gave me the strength to keep going, but the meal was so boring."
             },
             "values": {
                "ate_cooked": {
                   "display_name": "Ate a cooked meal",
                   "tooltip": "I always enjoy the 'warm belly' feeling after a nice cooked meal."
                }
             }
          },
          "town": {
             "founding": {
                "pioneering_spirit": {
                   "display_name": "Pioneering Spirit",
                   "tooltip": "We've left our home to build a new one. We will make it better than before!"
                },
                "settling_in": {
                   "display_name": "Settling In",
                   "tooltip": "I'm starting to feel at home, but there's work yet to be done."
                }
             },
             "township": {
                "level_2": {
                   "display_name": "Township Celebration",
                   "tooltip": "We've been recognized as a fully fledged settlement!  Our work is starting to pay off."
                }
             },
             "safety": {
                "lack_of_safety": {
                   "display_name": "Lack of safety",
                   "tooltip": "Without some form of city guard, I just don't feel at ease in this wilderness."
                }
             },
             "theft": {
                "petty_theft": {
                   "display_name": "Theft",
                   "tooltip": "Someone stole something from our supplies! We need better defenses."
                }
             }
          },
          "sleepiness": {
             "values": {
                "tired": {
                   "display_name": "Tired",
                   "tooltip": "It's been awhile since I've slept."
                },
                "exhausted": {
                   "display_name": "Exhausted",
                   "tooltip": "It feels like forever since I've slept.. I can barely keep my eyes open."
                },
                "fatigued": {
                   "display_name": "Fatigued",
                   "tooltip": "I've been on my feet for too long. I really need some time to sleep."
                }
             }
          },
          "combat": {
             "values": {
                "panicked": {
                   "display_name": "Feared for their life",
                   "tooltip": "I'm not proud of how I acted when the monsters came, but it's all I could think to do."
                }
             }
          },
          "violence": {
             "values": {
                "townmember_died": {
                   "display_name": "Townmember has died",
                   "tooltip": "A fellow townmember has died. If only we had been more watchful!"
                },
                "pet_died": {
                   "display_name": "My pet died",
                   "tooltip": "My poor [str(pet)] died recently. I'll miss them quite a bit."
                }
             }
          }
       } -> added
    
  •            "display_name": "Basket of Amazing Maize", -> changed
    
  •      "unknown_food": {
          "display_name": "Edible Matter"
       }, ->added
    
  •         "display_name": "Egg", -> changed
    
  •         "display_name": "Poyo Meat", -> changed
    
  •            "display_name": "Fried Egg", -> changed
    
  •            "display_name": "Prickly Pear", -> changed
    
  •            "display_name": "Golden Gourd", -> changed
    
  •      },
       "kibble": {
          "kibble": {
             "display_name": "Kibble",
             "description": "Attracts cats"
          } -> added
    
  •         },
          "kibble_recipe": {
             "recipe_name": "Kibble Recipe",
             "description": "For attracting furry friends",
             "flavor": "There is a hole in my heart the shape of a kitten. " -> added
4 Likes

A post was merged into an existing topic: Weird graphical flickering and glitches

It should be already in. Check if your hearthlings are eating cooked food first instead of raw food.

Not really. You should be able to play like normally. It might be a little more challenging getting your first hearthling, but there should not be a huge difference as with previous Alpha. We’d like to hear everyone’s feedback on this change, for example in this thread: Can we discuss the changes in A.20 Eating twice a day?

4 Likes

Due to how the math behind the scenes works out, hearthling should eat slightly more than previously when you are feeding them low quality meals, and slightly less than previously when you are feeding them high quality meals. It should be in the .8-1.2x range, not the 2x range as you are fearing. If it’s not doing that please let us know; this change is a bit tough to judge without a lot of testing.

7 Likes

A few observations

  • My Hearthlings were going a long way for berries in the early game, seemingly ignoring raw vegetables in my store room. I don’t know if it’s due to good quality, and they’re seeking out better quality food, but it meant a lot of lost time and didn’t make sense for them to be going THAT far for better food.

  • Mood seems very hard to keep up at the moment. Fearing for their lives is punishing, as all combat in the game usually happens close enough to town where it effects lots of hearthlings. Having it reduced when they see your brave soldiers fighting or something would be good.

  • Cramped space is also a big culprit for low mood. Given the scale of the game, furniture, rooms etc a lot of rooms that feel they should be reasonably sized are in fact “cramped” as well as workshops that look cosy counting as cramped. Perhaps adjacency-to-window bonuses could be used to help with this. That way you’re not ending up with dwarf fortress style drone-cells, but also don’t have to make every low level crafters house a mcmansion. (when we get those dorfs, they could be immune to cramped/dark spaces!)

@Brackhar, I mentioned this more than once. The berries!! Efficiency!! :stuck_out_tongue:
At least for the current food model, we want something more appropiate for a food that doesn’t fill much.

How far were they going for food, @MajorFordson? Thanks for the feedback on the other thoughts, too.

1 Like

A loooooong way. Well not the other side of the map, but almost as far as where a goblin camp eventually appeared. I can get a screen if you like. Hopefully eventually there’s a radius/distance system in place, so not only are situations like this avoided but players can also de-centralise food storage so that crafters might actually eat in their own homes!

1 Like

So hearthlings will go for better food if it’s available. I think the bigger culprit here is the act of harvesting a berry bush doesn’t subsequently imply hauling said berries back to the supply. For players who have previously queued up a lot of berry harvest this means their berry baskets are likely still over by the bushes, causing part of the problem you are mentioned. That said, while they do prefer better food it should be within reason, so if you are actually seeing hearthlings walk across the entire world that’s a bug.

The fear feedback is solid. If more people give similar feedback I’d be happy to reduce it.

As for cramped, windows should actually be providing a benefit. Clutter like workbenches and such are not currently counted in the calculation. Silly question; are your windows at head height? They only provide a benefit if the hearthling can look through them.

1 Like

Here’s some screenies! With the cramped space, hard to say if it comes from their home as there’s other buildings they use, but my weaver seems constantly sad because of cramped space yet this is his home, very reasonable in my opinion with a few windows.

And here is my masons, which is a little on the small size but still very reasonable for a “medieval settler” sized home IMO, and again has some windows.

And here is the berry bushes vs my storehouse where the hearthlings ignored all of that tasty raw pumpkin!

1 Like

Hmmm.

So the weaver house is kind of on the border for what I’d expect to be cramped, at least around the bed. He’s probably feeling cramped as a result of sleeping there. Also, try putting a window above the crafting tables; everyone likes a view while they work. :smiley:

The mason house is a bit small. I’d definitely expect this to be cramped. The calculation isn’t about square footage of the house, but the size of the immediate space around them. So a long, thin house will feel cramped, even if the house is a mile lone.

As for the berry bushes, yeah, that seems like a reasonable distance to travel. I’d probably walk that far if there was a baker making tasty pies over there. That said, I don’t think you’d run into this issue if the hearthlings brought the berries back with them after they were harvested.

3 Likes

Does the “personal space” projection run in a direct line-of-sight style then? ie to get the benefit of a window they need to “radiate” their personal space directly through a window? If so, that make’s it much more fiddly and less intuitive than a simple check for a window within the personal space. After all, I’m sitting at a table with a window nearby but not directly 12,3,6 or 9 o clock from me yet I feel the benefits of having a window in the room :smiley: I’ve got a bit of a historical mentality though, and in middle ages settings like Stonehearth common people did have small, cramped homes!

I recall seeing the “personal space” cone in the dev video, and I think without tweaking it will lead to issues. Some people might like to have beds or workshops in an “alcove” in a room for example, so the hearthling would feel cramped even if he has a lovely big room behind him. Perhaps by getting the “cone” to extend in other directions when blocked other ways it might even out a bit more. So a hearthling who feels cramped from two walls of a room has their personal space cone extended in the remaining two directions, finds them all clear/more room and thus it balances out. So to speak. EVen better it might all change and go out the window if a proper “room definition” system is ever implemented where a hearthling can recognise they’re in a room and assign a value to the space and contents of said room, independent of an immediate surroundings check.

At the very least the personal space check could be more generous, so only truly dwarf-fortress-cell-bedroom type exploit rooms
are punished, functional rooms like the size I have made are neutral and spacious luxurious houses are rewarded with a buff.

I agree that my buildings are on the small side, but to me that’s part of the progress of the game. Early buildings needing to be economical and bare bones, and when you reach Tier 2 you can rebuild them a nicer workshop sort of thing. I guess that’s already somewhat modeled in with the temporary mood buff.

The game RimWorld had an interesting evolution of happiness mechanics, eventually Tynan made the system work on a number of different factors (hunger, personal space, beauty of area, joy level) to combine into the resulting overall mood. I’m guessing Stonehearth might end up with a similar system where someone could have a slighty cramped home full of GOLD PLATED FURNITURE resulting in a net positive mood. (though that’d be weird, I’d rather have a nicely sized house than a cramped gold plated bedroom…)

1 Like

Something completely unrelated to the conversation going on right now: Are you guys planning on adding a notification for when a hearthling gets stuck somewhere or when a task is ordered and they can’t complete it because there is no ladder or something?

Yeah, the current test is LoS based, but it’s 8 axis instead of 4. I agree it could cause problems and likely would benefit from a couple of heuristics, but we’re waiting for feedback before further investing.

As for the happiness mechanics, the stuff RimWorld does is really solid there. I expect that we definitely could end up in a similar space with some tweaks, just because they are good ideas.

3 Likes

Everyone is cramped, even the ones that wander in the open, lol.

I completly agree with your comment. In my point of view, hearthling should be satisfied at first with the room they have, like the carpenter with the carpenter house (which is not the case). Because it’s still a small town. But latter on, hearthling should wish for more space, more furnitures like comfy beds and so on, it could be in Tier 2 or when they are more houses in the town.

2 Likes

I saw in the code that the berries have a quality level 3, while some crops have quality 2 or 1. I would guess this is the reason they are going for the berries.

3 Likes

I kept bugging him about this. However there was in fact another related bug in the code, that Chris has just fixed.
So besides the berries issue, we might see a difference in the next build. :slight_smile:

3 Likes