a multiplayer game of parenting and civilization building
You are not logged in.

John Serafin was one heck of an interesting guy. He always had a funny story to tell, or a wisecrack, or a hot take, and always in that amazing Queens accent of his. He was a real character, and he knew it. He always called me a character too, and I knew that I was. How often our friendly verbal fencing matches---as he called them---ended with him shouting, "Jeez, Jason, come on!" in exuberant exasperation. He was unusually tall, but not as tall as me, and it took him years to get over the extra four inches that I had over him.
The first time he met me---me, the man who would eventually marry his only daughter---he approached me with a stern look on his face, and said in a gruff voice, "Who's this guy?" I was frozen for a second, but then he cracked a smile and started laughing. By the end of that first evening, he and I were getting along famously. He was impressed that I was driving a Ford Taurus---that's a dependable car!---instead of a rusted out piece of junk. But that conversation about my Ford Taurus was just the beginning.
Above everything else, John Serafin was a car man. He lived through some interesting times on Long Island back in the day, and he longed for a return to a more elegant era. The old money. The sprawling estates. The hired help. The glistening lights of distant garden parties shimmering across the still evening waters of Long Island Sound. The mystery and romance of it all. But most of all the cars, those glorious cars of his childhood. Cars that his impoverished family didn't even have---just blurs of chrome and metallic fleck paint zooming past him as a small boy in his rough Queens neighborhood. The cars from that era were huge, heavy, and all curves. We get excited about a V6 today, but how about a V8, a V12, or even a V16?
Did I say he was a car man? That was too vague. John Serafin was a Cadillac man. Cadillac was his make and his life-long passion. He eventually realized his dream of owning one of those glistening marvels that was so out of reach during his childhood. Here is his baby, a 1935 Cadillac Fleetwood convertible sedan:

All original parts and paint. Cracking original rubber gaskets around the doors. He claimed it was a one-of-a-kind, a V8 edition in a year when no other V8s were made. When I said these things are heavy, I meant it: a good portion of the framing is made out of solid wood. I got to ride in it. At one point, late in his life, when his legs started to fail him and he could no longer operate the clutch, he even let me drive it. This was indeed a machine from a different era---a time when a trip to the mostly-deserted tip of Long Island on the rustic parkways was a daring adventure, and a time when flat tires were the norm. That is the Long Island we read about in the great novels of the past century.
But he was more than just a car guy. He was the father of my darling wife. He was a grandfather of my three boys. He was my beloved pal and verbal fencing partner---that initially gruff guy who quickly welcomed me, this tall, strange, seemingly unemployed young man who was in love with his daughter, into his family with open arms.
John Serafin, the Long Island Cadillac man, died last night. Goodbye sir, I'm going to miss you.
With that important story told, I'll now turn my attention to the update. It comes to you a day early, because we're catching a plane tomorrow for the funeral. Needless to say, there probably won't be an update next week.
The biggest changes are to storage. Baskets no longer decay. Yes really. I finally caved on that sore point after a whole year of holding the line. Looking through the existing content, I found 67 different bowls of stuff that weren't containable but probably, logically, should be. That's a lot of stuff that used to sit on the ground, but can go in a box now. I've also added a new kind of box, a slot box, that can be used to store 10 small items (instead of four big items like the regular box). Before, the only way to store that many small items in one spot was to nest baskets in boxes, which made the items fiddly to access.
Before this update, there were over 1000 Eves every day, and it was clear that many players were abusing the /DIE feature to ban themselves from all family lines so that they could play as Eve. These "unnecessary Eves" were creating too many families, spreading babies out into too many doomed family lines, and starving the existing, long-running lines of necessary babies. Even worse, with the latest close-together changes, many of these Eves were griefing existing towns---and an Eve has very little to lose.
The effect of /DIE as a baby has been changed, in that it no longer triggers a lineage ban, but instead adds that family to your temporary skip list. Once you've skipped through all families, and there are none left to try, your skip list clears, and you go back to being born through all the same families again. In other words, you can't use /DIE to become Eve anymore. You only become Eve if another Eve is really needed (there are actually no available mothers around to have you).
This cut the number of Eves down by a factor of 10x, which will take a huge bite out of the above problems.
There has also been a problem of growing clutter over time, with everyone close together, and a lack of greener pastures for fresh starts. A new long-term map culling system has been added, where any 100x100 region that hasn't been seen by anyone for at least eight hours slowly goes back to nature, one tile at a time. The only things that survive the ravages of nature are stone walls, which remain in place, with trees regrowing up inside of the outlines of former building. This culling should help to create some greener pastures for new Eves. By the way, this only happens on servers with 15 or more simultaneous players.
Two client-side movement glitches, affecting the movement of other players, have been fixed. Hopefully, rubber-banding when trying to follow someone on a long walk is a thing of the past.

This game was never meant to feature a full-fledged combat system. The protocol was designed to allow movement and actions from hundreds of simultaneous players with as few messages as possible, ensuring logical consistency (two players can't both pick up the same object at the same time and cause the object to duplicate), but not realtime interaction guarantees. In fact, the protocol was design with extreme and variable latency in mind, because I always intended players from around the world to connect to the same server. One of my test cases involves using the tools TC and NETEM to manually insert up to 2.5 seconds of latency for all messages sent to my test server. The game still mostly works, even in those extreme network conditions.
So why is there combat in the game at all, then? Because it's necessary for society to function. How can you have rules or laws if you can't enforce them? How can you enforce anything without, well, using force? So yes, it would be easy enough for me to remove combat from the game entirely---just a few mouse clicks. But then the whole thing would fall apart, and the game would be ruled and ruined by griefers, happily ever after.
As a simple example of an endless annoyance: you set down a tool that you are busy working with, and a griefer grabs it and won't give it back. This is kindergarten stuff, but it graduates to petty or even grand theft in the adult world, and in any case, we solve these issues by adjudicated force, at the end of the day. But let's say we want no violence in our game. How do you deal with the person who took your tool and won't give it back?
A game could "solve" this problem for you---and many games have tried---via a very detailed system of hard-coded privileges and rights and transfer operations, essentially hard-wiring a legal system into the fabric of the game itself. Your tool would have an owner list, and that other player couldn't touch that tool unless you added them to the list, and they can't add other people unless you also add them to the admin list. All to just lend someone a tool. If this sounds fiddly and tedious, you're right. We might call such a design a "trust system," but is is anything but, as I will explain in a bit.
Much simpler to let an understanding develop between players---who was using the tool first, when it's acceptable to grab it yourself, and when you should ask first---and give the player the power of force-in-numbers (in other words, law) if that understanding is repeatedly violated. If you say, "Don't plant wheat here, I'm tilling these rows for milkweed," it's expected that the other person will listen. If they don't listen, you complain to them, and warn them. If they keep on with their violations, you get the backing of the town elders, and you take it to the next level. After all, they can't keep violating the community standards if they're dead. Unvarnished, it sounds barbaric. But that principle is at the beating heart of every functioning society in the real world. The less-barbaric-sounding version is imprisonment or banishment, but even those are carried out at weapon-point, for obvious reasons.
Even without the will of the majority to back you up, you can see how an understanding could develop between two isolated players over time, and how that understanding could blossom into a real sense of trust. Real trust comes from freedom and power: you could hurt me if you wanted to, but you choose not to. If you are powerless, I may not need to worry about you, but that doesn't mean that I develop a trust with you. Two free wolves develop a real trust. Two toothless dogs stuck in neighboring cages have no need for trust. That's why a hard-coded trust system, in the place of powerful and free players, actually squashes trust instead of fostering it.
And that is what One Hour One Life is about, from its very first moments onward. Two strangers trusting each other, sacrificing short-term gain for long-haul mutual benefit. Mother and baby are the basic example. There's no hard-coded guarantee that you won't betray me, but I have your back, and you have mine, and you haven't betrayed me for the past 30 minutes, so even though you're a complete stranger to me, I sense that I'm growing to know you. And just maybe---dare I say it---I'm growing to love you. Because you could kill me, but you choose not to.
All that said, for this to function, we don't need a full-fledged combat system. Violence can be a logical operation, or at least it should be, and was meant to be, in this game. If I choose to kill you, I should be able to do that without any execution skill required, and regardless of network latency and so on.
Which brings us to that infamous dancing griefer. Because the movement protocol is not a realtime one, it was possible to exploit it to make yourself nearly impossible to kill. The server essentially had no "sync points" between players in the system until the players landed at the end of their movement. Okay, the player's movement just ended, and we know where the player is standing, for real, and all clients and server agree about that. Now they can execute an action on an neighboring tile. Mid-move, due to variable latency, all bets are off about where a player actually is on each client screen. Griefers could exploit this by moving continuously.
Even if the protocol didn't work this way, a moving target is still way harder to click. And what happens if you misclick? Well, you just right clicked on the ground, which means you just dropped your weapon. Trying to finally hit a dancing griefer was an absolute click-fest of frustration. So even if the town elders have collectively agreed that this person needs to go, they had trouble carrying out their decision. And the griefer, who could sneak up on an unsuspecting person who wasn't busy dancing, would get the jump on each victim and be able to land the kill.
This update changes the semantics of the client KILL action.
It used to be an isolated action that would either succeed or fail depending on where you clicked and whether the server believed that the person was actually there and in range.
Now KILL is a state, not an action, and SHIFT-right-click puts you into that state, with essentially a death warrant for whoever was closest to your mouse when you clicked. You get a forced-ANGRY face when you're in this state, and you can still move around freely. But if you ever cross paths with your target server-side, so that the target of your request is in range of your weapon, the kill action is executed instantly.
This comes as close to a logical operation as we're ever going to get, while still preserving the effects of weapons with different ranges. If you kill-target someone with your bow who is in a locked room, and you stand by the door, the arrow will fire instantly as soon as the door is opened. If you target someone outside the gate with your sword, and then stand by the gate, you will attack them instantly the moment they walk through the choke point.
You can cancel this state by putting your weapon away momentarily, and your angry face will return to normal. The face also gives the target some warning about your intentions---and of course, it can be bluffed with the usual angry emote.
This is a pretty big change, and it will dramatically change town griefing dynamics. But there are some other big changes beyond that.
The temperature system in buildings has been improved again. Now the heat simulation map is 13x13 instead of 8x8, allowing larger buildings to function as insulated spaces. Furthermore, an enclosed building acts as a direct temperature bonus on its own, and also doubles the effectiveness of the clothing that you're wearing. So buildings do more than just hold in the heat of a fire. The best way to think about it is that they reduce some kind of inherent wind chill in cold areas of the world. But for this to work, you have to be completely indoors, which means walls on all sides and corners, along with a full floor, and along with a closed door. If the door stays open too long, the wind will blow in, making you colder slowly over time.
The way last names are passed down to babies, especially in the case of a generation gap where no name is given, has been standardized. This should fix the lost-family-name bug.
Laying tracks for rail carts is now a lot cheaper---one kit can lay six tracks instead of just one. Gates can be built across roads again, and unused property twig bundles decay away quickly, so you don't need to spend time cleaning them up. You can finally move bowls of sterile pads around---mobile medicine can be a thing now.
Next week, I'll be tackling Eve overload around existing cities, and also the balance between close towns and stripped natural resources.

With the changes put in place last week, which brought distant families together, we're essentially playing a completely different game, with dynamics that we've never had in One Hour One Life before---dynamics, perhaps, that have never been seen in any other game either. There are going to be some growing pains, and some need for balancing.
Learning another family's language is an interesting new part of the game, and it shines a spotlight on age-old philosophical questions. How do we communicate with other people about abstract ideas? It's easy enough to point to something concrete, like a berry or a hammer, and come to a mutual understanding about what words we are going to use to signify this concrete thing. But what about things that we can't point to? Last week, a woman migrated to my village, and she tried to communicate her story of destruction and survivorship. As I tried to repeat these words back to her, it was pretty clear that we weren't making headway at understanding. It wasn't until she wrote her story down on paper, in our shared written language, that I finally understood---and understood the difficulty that we had been having using spoken words for these concepts.
I wanted to enable some kind of accelerated language learning in the game, but I didn't want to undercut the experience of trying to actually learn another language, one word at a time.
In the latest version of the game, accelerated language learning can happen, but only across multiple generations. Your babies have a chance to learn whatever parts of the language that they hear during their childhoods. They pass this partial learning on to their own children, who again have a chance to learn even more of the language during their own childhoods. After you grow up, whatever partial language understanding that you've acquired solidifies, and you carry it with you for the rest of your life. The result is almost like an accent that fades gradually over multiple generations.
And children and grand children, who have had more exposure to the foreign language, can serve as translators to the adults around them.
I've always been interested in the gap of understanding and communication between individuals---that's been a thread running throughout my work---and I've even made whole games specifically about that concept in the past. But this almost seems like the best exploration of that idea yet, and just as one tiny part of a much larger game. Thanks go to forum member Spiegel for planting the seed idea in the first place---that different families could potentially have different languages.
Beyond that, the sword has been rebalanced, Eve spawns have been tweaked, and baby bones for /DIE babies now decay away very quickly.

The Eve spawning algorithm has been changed from an ever-growing spiral to a dense grid packing, based on used natural spring sites. That means that towns are much closer together than they used to be. Walk in a cardinal direction from your town well for a bit, and you're bound to encounter other settlements.
But that doesn't mean civilization will turn into one giant, sprawling mush. Just as I've brought you all together, I've also added a few other things to help you maintain some separation. You're not building that tower to heaven together quite yet.

Problem: The longer-term pacing and difficulty of food production in an established village is supposed to be controlled by the development of higher tech water sources as the lower-tech sources run out. However, given that lower tech water sources are built on dry pond sites, and the number of ponds in a given area isn't strictly limited, many villages can get by for way too long on lower tech water sources, which undercuts the the tension and dramatic arc in these villages. Any good Eve will seek out such a location before founding a village, which means that every long-term village faces the same kind of challenge stagnation. Furthermore, the medium-tech water sources never run out, making the highest tech water source unnecessary long-term.
Solution: Wells can only be dug on natural spring sites, not ponds, and these natural spring sites are distributed evenly across the map. It's now impossible to have a town center with multiple wells clustered together. And medium-tech water sources now run out eventually, making the highest-tech source necessary long-term.
You now see the age of a grave when mousing over it. A few other bugs have been fixed, too.
Finally, forum member Clown Baby has done the heavy lifting to get a cool "time machine" server up and running, which will take you all the way back to how the game was when it launched back in February 2018. No bears. No snow. No names. No death stagger. No Eve Spacing. It looks like the same game on the surface when you first log in....
Details on how to connect to this Time Machine server are posted here:

My friend once observed that as photographs age, they transcend their status as documents and move gradually into the realm of sublime art. Even the most casual, throw-away snapshots, given eighty years or so, become nothing short of jaw-dropping---windows into a forgotten world that we can barely imagine ever really existed. We also occupy a very special place in history---the place where photographs, as a relatively recent invention, only document very recent history for us. We can dream about photographic evidence of the middle ages, but we will never see it.
Now imagine people five hundred or a thousand years from now, and how they will likely be able to look at photographs that are many hundreds of years old. Even more mind-boggling, they will have access to moving images that are many hundreds of years old, where we don't even have movies of our grandparents when they were young. It seems like these kinds of multidimensional documents will serve to make distant history more real and less mysterious. That seems neat and all, but part of me likes the mystery.
And this game mostly preserves that mystery. What happened long ago? What did it look like? Who lived here? How did they dress? Now we all have a very narrow window into the past, and your photographs will be messages in bottles that wash up on the shores of the future. Damn, I'm really laying it on thick this time, aren't I? But this is profound stuff that we're dealing with here. Pictures of Grandma. Forever.
And the first in-game photos have already started showing up. Here's a good one for you:

You can see the full stream here:
http://photos.onehouronelife.mythiclair … front_page
And check the family tree browser for people who have been tagged by a little photograph icon.

First, the big news: Potato digging no longer wears out shovels. May you rejoice with baked, fried, or ketchup'd.
Beyond that, this week's update involves a game-changing experiment. What if individual or group ownership was an actual thing in the game?
As a designer, I have some pretty big dreams for this game, in terms of what kind of social dynamics will emerge from it. While I'm very happy with some of the complex interactions that have blossomed inside the game, I feel like some other possibilities have been stunted. Where's trade? Where are the stores? Where's resource contention? Where's crime? Where's trans-generational conflict? Where are the sheriffs? Where are the monarchs? Where are the guillotines?
Now, there are probably dozens of reasons why such things have not emerged in the game, but I'm starting with the most obvious one: how can you trade when everything is just laying there, ready for the taking? When there is no ownership?
And long ago, I did add atoms to the game that would supposedly enable ownership (walls, doors, locks, and keys). But they are so expensive to make, and such a burden to use in practice, that people have never been able to build functional ownership systems with these atoms. If it takes three lifetimes to successfully build a locked bakery before you can actually start trading your bread, your family is going to lose the thread before it ever gets off the ground.
I thought about overhauling the costs of building and locking, but such an overhaul would likely have loads of other side-effects. And furthermore, one of the biggest problems with "easy" building and locking is lack of consensus. In other words, if it's easy to lock people out, it's easy to lock people in. Here come the griefers, building a wall around the whole town and locking the door. Or maybe even skipping the whole "door" part entirely. In other words, property rights cannot be claimed unilaterally. And they aren't, actually, in real life. If a bunch of people have been using a swimming hole for ages, you can't suddenly walk up to it and say, "It's unclaimed, so it's mine now." Everyone would collectively object, including physically throwing you out of your own "property" if you were persistent enough. Thus, we have come full-circle and discovered the philosophical underpinnings of homesteading---homesteading is not quick, unrestricted, or easy for some very good reasons.
So it seems like we need a new atom here. Something a bit more abstract than walls and doors and locks. For example, to stake a mining claim on public land in the USA, you literally pound a wooden stake into the ground, nail the lid of a peanutbutter jar to the stake, write your claim on a piece of paper, and screw the paper into an empty jar, attached to the stake, like this:

And most importantly, if other people are working there, they're not going to let you stake your claim, or they're going to remove your claim after you leave. But the longer your claim goes uncontested by others, the more real it becomes.
This is essentially how the new fences and gates work. They go through a three-minute proposal phase, where people can see which area of land you intend to box in. After that, if no one objects, they can be erected, but they are still "shaky" for twenty more minutes. During that time, shaky fences are easy for anyone to remove. After that, they become permanent, though they fall apart in an hour if not maintained by someone. In other words, to claim property, you have to find a spot that no one objects to you claiming, and you have to take care of it long-term.
Gates are owned by whoever builds them, and new owners can be added verbally ("You own this" or "Sam Smith owns this"). Only the owners can open and close the gate. When the last owner dies, the gate is abandoned and falls apart. Thus, if you want to keep your gate working long-term, you need to assign a new living owner to it before you croak.
And fences are very cheap to propose and build (and remove!), making them orthogonal to the rest of the resource systems in the game. They are meant to abstractly represent consensual trans-generational property ownership.
But aside from blocking movement, there is no other explicit concept of ownership in the game. The land and items inside a fence are not inherently owned, which means that theft and other juicy interactions are still possible. And one owner who no longer has the support of the rest of the town for their ownership stands no chance. There's still strength in numbers. Beheading the queen will unlock the castle.

This update is mostly about one thing: New clothing, and lots of it.
But there are also a few key fixes under the hood. Your family's last name is remembered, even if your mother doesn't give you a name. So later, if you name your own child, they will get that "invisible" last name passed on to them. This will make family trees more coherent, with a last name shared by every named person in the tree. No more lost family names over time.
Even cooler is the new grave-mouse-over feature, which now works for all graves, not just graves for people who died in your lifetime. Family history is now apparent directly inside the game, when you visit the family grave yard. To make this work, the server remembers everyone who ever lived, and keeps a new database of grave positions for each of those people. To prevent this from growing indefinitely, people get "forgotten" after a week, or when the server restarts, and the grave position database is flushed at server startup. But if your family has been around for a while, you will see a lot of family history on the ground.
In other news, community member Futurebird has created a survey for players, which you can find here:
https://www.surveymonkey.com/r/3LKVW7P
Here are the results:
https://www.surveymonkey.com/results/SM-LRBDYL2FV/
There most likely won't be an update next week---I'm scheduled to be on vacation with my family.

Back from GDC with a bang. This is the largest content update in a while, with over 100 new objects to grow, catch, cook, and eat. And all this from only three new naturally-occurring objects.
What else? Spring loaded doors for your kitchen. That whole GDC basket horse cart right-click bug has been fixed for real client-side. Email-based family tree searches are no longer public (access your personal family trees from the button on the login screen or on your personal download page), so people can't spy on you anymore if they know your email. Animals no longer spawn outside their home biome along biome boundaries. Goodbye, arctic snakes and desert penguins. It was fun while it lasted.
And now for a tale of a funny lurking bug situation. Some of you may have noticed that recently, the whole shebang has been going down like clockwork at 5 am EST for about five solid minutes. Website, forums, login server, everything. I'm asleep during that time, so I didn't notice, and no one bothered to email me about it. Not sure how long this had been going on.
Turns out that 5am is the time when the various backup processes run, and one of these accesses the main MySQL database with mysql dump to back it up. That backup might be locking out other database requests, which would affect the website any everything else. But five minutes is a long time. Turns out that the review/stats server log table had ballooned to over 2 GB in size, with 220 million entries. Uh, yeah, that would take a while to extract with mysqldump. Turns out that it was filled to the brim with bad requests by other servers for non-customers. What other servers? From the IP addresses, these were Chinese servers. To the tune of 300,000 bad requests per day, and each one getting logged. The mobile developers apparently forgot to switch this stat-reporting feature off in their Chinese servers, which means that every time a Chinese player lives a life, I get hammered with a bad "log stats" request from their servers.
And yes, they are the biggest fish in this pond, but there are other bad requests getting logged from small-time servers too, most likely private servers being run by individuals.
First of all, I probably shouldn't be logging every bad request that comes in, since it's a waste of disk space, and I have no control over how many bad requests come in. So, that's fixed, and these logs have been cleared, making them tiny again. Now the backup mysqldump takes 3 seconds instead of 5 minutes, and it doesn't seem to block anything (it's supposed to set a read-only lock anyway, which should at least allow the website and such to load).
I also reached out to the mobile devs to ask them to knock it off. Their Chinese servers are being run by a third party, but I'm hopeful that this deluge of requests will end soon. Anyway, 300,000 lives a day is a lot. Apparently the game is popular in China.
But the fact that so many servers, in general, are submitting requests to me by accident is a bad sign. Yeah, I guess I made "reporting" the default behavior in the public server code on github, which means that anyone who is not paying attention when they set up a server will end up hitting me with reporting requests forever. Because these other servers don't have the secret key, the requests will be rejected, of course, but they're still a waste of time and bandwidth for everyone involved. I can imagine a nightmare scenario in the future where there are 1000s of private servers, and their collective accidental reporting traffic combined results in a DDOS attack. So, the public server code has been fixed to not report by default. Update your server code, folks.

The past few weeks have been an absolute whirlwind.
First of all, preparations for my GDC talk are complete. I'm actually giving the talk just two days from now. You can read the full description at the link below, but keep the intended audience in mind: "Anyone who isn't ready to roll over and die just yet." Hopefully, that describes you.
https://schedule.gdconf.com/session/201 … pse/864486
Also in the past few weeks: a huge, confusing debate about the boundaries of the public domain and authorship, as it concerns One Hour One Life and the unofficial mobile adaptation. There are very few precedents here, and lots of different opinions. You can get a taste of this here, in what became one of the longest and most viewed threads in OHOL forum history:
http://onehouronelife.com/forums/viewtopic.php?id=5479
You can also read the opposing point of view, in which I almost became a Sith Lord:
http://onehouronelife.com/forums/viewtopic.php?id=5534
There are two upshots of this discussion. First, the mobile developers have decided to eliminate this confusion in the future by hard-forking the game. They will be eventually operating under their own unique title, and they've already started the process of designing their own mascot character, and some of their own background textures, which you can see as sample of here:

I recently realized that the "mascot" they had been using in their mobile icon---my Original Eve character---happens to be my cartoon rendition of my own mother:

The hard fork will also involve a content fork from here on out, so my weekly updates will no longer be rolled directly into their game.
The second upshot is that I've clarified my stance on copyright, moral rights, personal rights, and trademark. In the past, I had only thought about copyright, and decided specifically that I did not want to wield it. Over the past fifteen years, I've never faced the situation of a direct competitor using my work to make a almost-identical service that would be confusing to end users. When I placed my work in the public domain, I never thought, "Hey, that means that someday, people may widely believe that someone else is the original author of my work." Furthermore, I realized that competitors have a huge unfair advantage against me, as I toil away on weekly content updates that they can roll into their product with almost no work at all. Finally, I realized that the ultimate financial nightmare---a completely free but identical OHOL PC service, maybe even operating on Steam---was a possibility, unless I clarified things. Yes, I was hoping Steam wouldn't allow such a thing, but if I'm serious about retaining no rights, that's an intellectually dishonest thing to be hoping. I've decided that trademark is the best tool to use to deal with such issues. My clarified "no_copyright" file can be seen here:
https://github.com/jasonrohrer/OneLife/ … yright.txt
To summarize: you can do whatever you want with my work, with no restrictions and no permission necessary, but don't mislead people, and don't use my non-code work to directly compete against the service that I'm operating.
Despite all of that, here I am, on the eve of GDC, with a small but amusing content update for you.
More emotions. Lots of little bug fixes. Enjoy!

All reported, reproducible issues in both the code and the content have now been fixed. It was a lot of stuff. You can see the full list here:
https://github.com/jasonrohrer/OneLifeD … its/master
There's also one surprise in there, and I will say nothing more about it.
Next week, I'm working on my GDC talk, which has been announced here:

This update has tons of fixes and improvements. The biggest one is an overhaul to the way the map is loaded. You may have noticed that, in the past, the first time you loaded a map, it was pretty slow, but in later lives, it was very fast. This would be true even if you quit the game, as long as you didn't restart your computer.
And by "pretty slow" the first time, I mean very slow, depending on the state of your disk. 60 seconds or more wasn't unheard of, which meant that you were loading through a good portion of your childhood. This has gotten worse over time, as more sprites have been added. Subsequent map loads in future lives would be as fast as 4 seconds, thanks to caching.
Reading files from hard drives the first time is slow, there's no way around that. The game was designed with a lazy, as-needed approach to sprite loading, only keeping the sprites that are absolutely needed in VRAM, and flushing any sprites that haven't been drawn for over ten seconds. The idea was that, with 10,000 objects, all those sprites are never going to fit in texture memory. Maybe not, but we're not there yet, and the total size of all the sprites in the game is currently only about 56 MB. In busier map areas, almost all of these need to be loaded, so we're pretty much using that much texture memory anyway.
It turns out that reading 56 MB from disk isn't slow, generally, but when it's in 1800 separate files, caching prefetches can't help. Bundling all of these into one huge file makes it much faster, and so does compressing them (TGA files that have a lot of transparent borders are very compressible). These all fit, together, into just a single 6 MB file. Might as well load the whole thing at startup, which is what the game client is doing now. While we're at it, might as well do the same thing with the sound effects (which aren't at all compressible, but still benefit from being in one big file together for caching reasons).
So by the time you get around to "map loading," after logging in, there's really nothing to load. This means that a progress bar isn't even needed--it's that fast (most of the "3 seconds" quoted above are spent finding the server and connecting to it).
And thinking about the future, we're definitely not going to have 10x more sprites than we do right now, and that worst case would be 560 MB, which still would fit in the VRAM of some pretty old graphics cards. It might actually be okay to always preload all sprites.
This isn't entirely free, because the compressed glob file has to be made somehow. Given that, between sprites and sounds, this represents about 25 MB currently, and given that these files will change with every update, building them server-side would dramatically balloon the download sizes of the weekly updates.
So, your client rebuilds these, one time, after every update. This can take a bit of time, maybe up to a minute, depending on your hard drive, but after that, the game will load quickly. And furthermore, this process happens before you even login, so it has no impact on your map loading experience.
Okay, what else changed? Too much to list in detail here.
Everything after v199 here:
https://github.com/jasonrohrer/OneLife/ … ngeLog.txt
Everything on February 22, 2019 here:
https://github.com/jasonrohrer/OneLifeD … its/master
All reported and reproducible code bugs on GitHub have been fixed now. I'm still in the process of working through all the content bug reports.

The problem of temperature in the game was much harder to solve than you might think. The old model was based on a thermodynamic cellular simulation, which would supposedly allow for heat from fires to be captured in rooms and flow out open doors. The model was accurate, but it was based on thermal conduction, not convection (which is much harder to simulate), and the result was hot areas right around heat sources, and cold areas everywhere else, even in enclosed buildings. In other words, buildings were pretty useless for keeping warm.
Clothing also fit into this simulation, but in a bit of a strange way (it served as extra insulation in the tile that you were standing on). Clothing would amplify any heat source in your tile, turning fires into extreme heat death traps. Finally, biomes were also part of the simulation, adding small heat sources (or sinks for cold biomes) at every cell in the simulation grid. Again, clothing, which insulated the center cell of the simulation grid (where you were standing), would also amplify biome heat. And biome heat effects would blend at biome boundaries (a thermal grid simulation is actually a form of blurring between the grid cells). This meant that there were near perfect areas at the boundaries between hot and cold biomes.
Players, being the rational folks that they are, reacted to the peculiarities of this thermal simulation by avoiding buildings, founding towns along desert boundaries, wearing minimal clothing, and generally not depending on heat sources for warmth. This was never my intention for the game, of course, but that's where things stood. I envisioned a game were buildings, clothing, and heat sources brought crucial advantages to a civilization, and all of the more advanced civilizations would depend on all three.
So, how could I fix this? A different thermal model of course, but what model? And if I wanted both hot and cold biomes (which make a lot of sense), how could I prevent exploitation of the boundaries? I really wanted there to be no "perfect" spot on the map that would make temperature regulation technology irrelevant. If such a spot existed, the smart players would find that, and settle there, always. Cold biomes should be too cold. Hot biomes should be too hot. There should be no "middle ground" in between.
First of all, many thanks to all of the players who engaged in a lengthy discussion in the forums. Also thanks go to my local designer friend Casey, who stuck with me through at least three hours of in-depth discussion about this topic (at the end of our first two-hour discussion, we had pages full of notes, diagrams, and graphs, but still no workable solution to the biome boundary problem).
Okay, now the solutions.
I should mention that what I'm calling "R value" here is different than the standard term as used in the insulation industry. My R value is a fractional heat retention value between 0 (no insulation that loses all heat) and 1 (perfect insulation). This makes it easier to reason about and program for. I suppose I should call it something else, but I don't know what to call it, so I've been calling it R.
First, for walls, I really want to simulate some kind of convection, so that heat spreads more evenly in indoor spaces. Instead of a cellular simulation, I'm now walking through the entire airspace around the player, flood-fill style, until I hit a boundary of insulating walls (or the edge of the 8x8 simulation grid). After that, I find the insulating boundaries, and compute an average R value for those boundaries. The heat sources inside that airspace (which may be the entire 8x8 grid, if there are no walls) produce heat which is spread evenly throughout the tiles of the airspace. That heat is modulated by the R-value of the boundaries of the airspace (if the average R value is 0.5, then half the heat is lost, and the rest is spread evenly in the enclosed space). Floors themselves count as part of the boundary of the space (if there's no floor in a tile, that tile counts as one of the air boundaries, thus reducing the average R value).
So what happens in this new model when you open a door? Suddenly, your airspace gets much bigger (the inside of your house plus the area outside your house), and your airspace boundary also gets bigger---and likely includes some air boundaries at the edge of the 8x8 simulation grid---so the average R value of the boundary decreases. Thus, opening a door, if a fire is running inside, will cause the house to get colder. Closing the door causes it to warm up again.
Thus, we're essentially modeling perfectly even convection throughout the entire enclosed airspace.
But shouldn't standing next to a fire also warm you up, even if there are no walls at all? Yes, but that's not due to convection. There's also a radiant component in the new model, which is based on your distance from each heat source that is in your airspace (which might included everything in the 8x8 simulation grid, if you are outside). So, getting close to a heat source, indoors or out, warms you intensely (perhaps too intensely, depending on the heat source). In other words, up close, radiant. Further away in a house, convection. The effect of radiant heat becomes negligible beyond a few tiles away.
Next, the biome effect is based only on the tile that you're currently standing on, and it's added into the heat calculation after the heat at your tile is computed based on heat sources and walls. If you're in an enclosed airspace, the biome heat contribution is modulated by the average R value of the airspace boundary, but only if the entire airspace also has floors. This means that an enclosed house with a floor can make a hot biome cooler, and a colder-than-normal biome, like the polar biome, warmer.
Next, clothes are applied in a separate part of the code, and they slow the transition from your body heat level to the environmental heat level (as computed based on walls, heat sources, and biome). If you're naked, you change temperatures pretty quickly. If you're fully clothed, you change temperatures very slowly. Thus, you can warm up in a house, near a fire, until you are just right, and then put on clothes before a journey to "hold it in" for a long time, and keep yourself close to perfect along the way.
And finally, the hard part: biome boundaries. As the new system is described so far, the old boundary-blending issue is fixed (because only your current biome tile contributes to your heat equation, without blending), but an exploit is still possible: by jumping back and forth across a boundary, between a hot and cold biome, you could warm yourself up to perfect temperature without fire, clothes, or walls.
So, I added a system for thermal shocks. This occurs whenever you go from a too-cold biome into a too-hot biome, or vice versa. Your temperature instantly jumps from the cold side of the scale to the hot side, right to the new biome's target temperature (or from hot to cold, if crossing the other way). This shock effect is also modulated by clothing. More and better clothing reduces the magnitude of this shock. Furthermore, the shock is never allowed to bring you closer to perfect on the other side of the temperature scale than you were before crossing. So if perfect is 0.5, and you were at 0.3, you will jump to at least 0.7 when you cross into a hot biome, no matter what clothes you are wearing (if you're naked, you might jump all the way up to 0.9, though, so clothing still helps).
This means that you can never improve your food consumption rate by crossing between hot and cold biomes. In the very best case, your consumption rate will remain the same, but it will usually get a bit worse (and if you're naked, it might get a lot worse).
There is also still a small body heat effect inside clothing, so in a cold biome, clothing will gradually warm you up over time. This effect is somewhat larger than it was before. The general idea is that, in cold biomes, clothing gets you 1/3 of the way to perfect, while fire and walls take you the rest of the way there. If you actually want to work in one area and remain at a perfect temperature the entire time, you're going to need all three bits of technology.
One other problem in the old system was that the desert, while hot, was not as hot as the other biomes were cold. The jungle was too close to perfect, and the mosquitoes didn't offer enough of a trade-off. So the jungle is now as hot as the other biomes were cold (moving between prairie and jungle now results in no change to your hunger rate), while desert is now as hot as the polar biome is cold. You've always been freezing to death in the snow, and you are now cooking in the desert. Think of it like hot snow.
The other biomes remain unchanged for the naked player. Thus, the game isn't really any harder now than it was before, unless you count the loss of the desert-boundary exploit as making the game harder (yes, that was easy, but the game was never supposed to be easy like that). Clothing and walls are so much more helpful now, that the game might even be easier, ignoring the old exploit.
Here's hoping that the new system leads players toward advanced civilizations full of heated buildings and clothed residents.

What made this bug so hard to find and fix was the fact that it affected so few people, relatively speaking. However, for the affected people, it affected them all the time, and pretty much ruined the game for them.
The symptom: in busy areas, apparent network lag would grow and grow, resulting in up to twenty seconds of delay between trying to do something (like pick a berry) and have the action resolve (like have the berry in your hand). On its face, this sounds like classic network lag. The first thought is that the server isn't keeping up with demand. However, other people playing in the same area were not experiencing lag. In fact, the affected player would often ask about lag, in-game, and be told by others that there was no lag for them. Also, if the server was being bogged down, the lag would be experienced everywhere in the game world, not just in busy areas, because all areas are processed in the same loop.
Maybe they were in a remote part of the real world. Maybe they were on spotty WiFi. The problem would often clear itself up instantly if they walked out of the busy areas. And certainly, the server is sending them fewer messages out there, because it filters the messages based on what is relevant to your location. In a busy city, you need to receive a lot of information, because so many people are walking around. In the wilderness, there's much less change happening. So this symptom was generally consistent with network lag.
A while back, I built a /PING and /FPS command into the game, so that people could run tests if they were experiencing lag. Sure enough, during these lag situations, ping times would balloon. Normal ping times in the US are below 100ms, and not more than 400ms anywhere in the world. But during lag, the ping would grow to five, ten, or even twenty seconds. That's really bad, and probably transcends any normal network lag.
And for these people, things have only gotten worse when we moved everyone to bigserver2. Big cities are much more common, so many of the affected people were experiencing unplayable lag almost every life. Of course, for everyone else---those who never experienced lag---bigserver2 was great.
But finally, almost miraculously, I experienced this issue myself for the first time this week. A unicorn! I was playing in a busy city, on my slow dev laptop with a weak GPU, and sure enough lag. Bad lag. Really bad lag. My in-game ping time grew to more than 14 seconds. The game was totally unplayable.
During this time, I also noticed that my FPS dropped from around 60 down to 40 or so. Frame rate and network lag aren't necessarily related, but my lag was very hard to reproduce---it would come and go seemingly at random, even in the big city, depending on where I walked---and it seemed to be correlated with this drop in FPS.
I set up a chaotic Eve-only city on bigserver2 on Friday to conduct a real stress test. 120 players all spawning in the same spot (0,0) is no joke, and I could very consistently trigger lag on my slow dev laptop.
I also found that my gaming rig would not see lag in the same area, but it is running at a solid 85 FPS (odd, I know, but it's a CRT). So, same network, different CPU and GPU, higher FPS, no lag. So yeah, with proper hardware, the client can easily handle 120 players all in the same area. It was chaos, but buttery smooth chaos.
Someone pointed out that outside-game-pings (using the command line) aren't necessarily slow during an in-game lag, and I was able to confirm this. Someone else suggested that I sniff the raw network packets and figure out exactly how quickly the server was responding to my PING with a PONG---just to rule out server-side lag. Sure enough, while my client took 14 seconds to register the PONG, the PONG arrived on the network within the normal 70 ms, even on the slow dev laptop. There was some kind of networking issue inside the client.
I spent quite a bit of time testing my underlying networking code and looking for reasons that network messages might get backed up, but found no issue in isolated network tests. I also considered some kind of kernel networking issue (my laptop is running Linux, while my gaming rig tests were on Windows7). No dice.
Meanwhile, someone else had been able to pinpoint the exact problem in the client, and they posted their fix in an old, lingering Github issue. Finally, someone drew my attention to this fix, which was rather hidden on the Github side.
JRuldolf, we all owe you one!
Turns out that this problem has been with us since an update back in October, before the Steam release, when message frames were added. A frame groups messages together that occur during the same server processing step, forcing the client to wait to react to any of these messages until all the messages in the frame arrive. This prevents, for example, a message about a map change from being processed before the matching player update is received (if a player dumps a bowl of water into a bucket, the bucket on the map changes, and so does the bowl in their hand, and there are two separate messages, but they only make sense if they occur client-side at the same time).
This frame system was great, and fixed a heap of potential inconsistencies in client behavior.
However, there was also a bug in the way that frames were processed. Each client step (each rendering frame), the client would read the next message and check if it was an end-of-frame message. If not, it would put the message in the holding queue and go on to the next rendering step.
You can see how this can cause trouble when message frames contain more and more messages (which they do in busy areas): a frame with five messages takes at least five client frames to fully receive, even if all five messages have arrived, because we only check one message per frame. Once the 6th message is checked, the end of frame message, we call the frame ready, and process all five messages together.
What we need to do, instead, is loop as long as any messages are available, checking for the end-of-frame message, but if it's not there, continuing on to the next message, until no more received messages are available. Thus, we process all received messages every client frame, regardless of how long the message frame is. This even allows us to process multiple server message frames on a single client rendering frame, if several server frames are waiting client-side.
If we don't do this, during times with high message rates and large, multi-message frames, we can see how a message backlog would build up. Assuming, of course, that more than 60 messages were arriving per second.
And if the FPS drops on top of that, you can see how it would get even worse, because we are running even fewer processing steps per second. So players with weaker GPUs were pretty much experiencing the perfect storm in busy areas. Lots more messages, and a slower client-side rendering loop that was effectively only processing one message per rendering frame.
The fix was literally two lines, putting a loop in there where it should be.
And suddenly, the client could handle the very busiest areas with absolutely no network lag. Even if I artificially reduced the frame rate to 5 FPS, the game was completely playable in busy areas (yes, it was choppy, but each action was executed instantly, with no lag). Before the fix, such a low frame rate would spell disaster in a busy area.
Now, how did such a devastating yet simple bug go unnoticed for so long? Well, as long as the frame rate is high enough, and the incoming message rate is low enough, it generally doesn't matter. We're processing at least one message every frame, and 60 messages a second is a lot, so we usually keep up, even if we don't process all available messages as soon as we have them. I didn't write the code this way on purpose---the original code, before message frames were added, intentionally processed all available messages every rendering frame. But the implementation of message frames quietly subverted this intention.
The move to bigserver2 made this very rare bug less rare, because the cities got bigger, and the message rate higher, causing slightly more people to experience the issue. Including, finally and thankfully, me.
Bug fixes take a long time, but they are worth it. More bug fixes next week. The plan is to get clothing and heating working in a more sensible way.

The early days of flight were fraught with uncertainty and peril. Instruments? Who needs instruments? We're talking VFR, folks. Pick a direction, and hope you can find a safe spot to land.
My father is a pilot of small planes. When I was growing up, he used to take me to the Wadsworth Municipal Airport on Saturdays to pal around with his pilot buddies at their hangars. Sometimes we'd take short trips, just for fun, to some other municipal airport nearby. The diner at Carrol County Airport served great pies. But forget about the pies---I got to fly! As a little kid, he'd stick me in the copilot seat and let me take the yoke from time to time.
There were a number of pilot sayings from that era that stuck with me. My father had a few of these on placards in his hangar.
"There are old pilots, and there are bold pilots, but there are no old, bold pilots."
"The air, like the sea, is very unforgiving of an error."
And one of the nearby airports had "Steve's Weather Rock," a 20-pound hunk of granite on a chain, hanging outside of its administration building, with a sign that read:
"If it's wet, it's raining."
"If it's white, it's snowing."
"If it's swinging, it's windy."
"If it's hanging straight out, it's too windy to fly."
Keep that in mind as you take to the sky.

What we had: players spread out onto three or four servers for load-balancing purposes. During peak times, this was necessary to prevent any individual server from becoming too overloaded. During off-peak times, we kept sending players to all the previously-active servers to avoid any one server dying out unfairly (see the earlier Population Stabilization update). But this meant that during off-peak times, even with plenty of people still playing, the population on each server got a little thin.
What we want: everyone playing on one server, together, all the time.
The problem: CPU overload when populations get high results in lag for players, not to mention Linode sending me warning emails (these server nodes are virtual servers co-hosted on multi-core machines---I don't want to be a bad neighbor to other users who have virtual servers on the same host machine).
It has been a long time since I examined this problem in detail, so I wasn't really sure where the issue was, or if there even was an issue anymore. I was keeping the server population caps relatively low to avoid lag at all costs while I worked on other things.
So, I needed to do some stress-testing and some profiling. Server1, with its ancient, gigantic map that has maybe only been wiped once in the past eight months, was historically the biggest offender in this department, so it made the perfect candidate for a stress test. How many people can we put on there before it chokes?
Does the database engine need another overhaul?
Well, it turns out that with the existing database engine (which was written from scratch for our purposes and heavily optimized by me many months ago), we could pretty much house all the active players on server1 with no player lag. CPU usage, however, was going above and beyond what keeps Linode happy, though. At one point, our externally-monitored CPU usage was over 120%.
How is that possible? Well, it turns out that a virtual CPU consumes additional CPU resources on its host CPU, apparently overhead from the virtualization process itself. So, while I was seeing server1 sitting happily at 60% internally, it was well over 100% as far as Linode was concerned.
By running a busy-wait test program in parallel with server1 on the same node, I was able to push my internal CPU (viewed through top) up to 100%, and that brought Linode's CPU measurement up to 140%. Yikes. This likely means that my virtual server is so resource-hungry that the virtualization process is itself consuming resources from more than one physical core. I'm not sure of the details here, but that's my best guess.
Regardless, we want to steer WAY clear of 140%.
But the lack of lag when 170 players were together on the usually-bedraggled server1 was promising.
Were there any unnecessary hot spots left in the code that could be eliminated? Maybe the database engine needs to be rewritten again. Keeping the database in RAM is one idea that might speed things up, but who knows?
This is where profiling is supposed to help.
But existing profilers do a notoriously poor job at measuring actual performance issues in I/O-bound processes. My server is likely spending a lot of time waiting for data from the disk. Asleep, essentially. Not running code, in the way that a profiler might measure, but still slow.
After testing every profiling tool under the sun, and finding nothing that worked for this purpose, I ended up writing my own. More details about that, and proof that it works, and examples of why other profilers don't work, can be found here:
https://github.com/jasonrohrer/wallClockProfiler
Profiling a toy program with a toy profiler is one thing, but profiling an extremely complex, multi-faceted server process is quite another. This made an excellent test case that helped me actually turn my toy profiler into a working, useable tool. At some point along the line, I realized that the text data that the profiler was outputting (essentially annotated stack traces) was too tedious to read through by hand, so I even wrote a conversion program that allows the resulting profile to be viewed in the Kcachegrind profile visualizer.
With all that working, here is a rough visualization of where server1 was spending its time while hosting 155 simultaneous players:

Now, before you tell me that I've lost my mind, let me reassure you that such an image isn't all that useful in practice. It's just the best way to quickly represent the complexity of the profile visually. In reality, I'm looking at sorted lists of functions and the amount of samples that hit each function. But a screen shot of that doesn't make for a very interesting picture.
Anyway, from that image, we can see what looks like a pretty "clean room." That big "empty space" in the middle is indeed empty space: time the server spent waiting on epoll for incoming client messages. We're doing that 54% of the time. The rest of the clutter around the edges of the room is actual work being done.
The biggest forehead-slapper in the profile, which can actually be seen here in this image, is the 12% of our running time spent on recomputeHeatMap. This is the bit of code that examines the environment around you to determine how cold you are (the thermal propagation simulation). This is an expensive bit of code to run, but it's only supposed to be updated for two players every server step (thus spreading the load), so what's going on here?
It turns out that the wall-clock duration of a "server step" varies depending on the rate at which messages are arriving. Big gaps between messages means the server sleeps longer before executing the next step. Short gaps mean many steps happen in a short time. The server is intentionally player-reactive in this way, actually using almost no resources at all if no on is logged in.
Checking the logs, I found that with such a huge population of players, with such a high inbound player message rate, the server step was being run something like 65 times per second. Yikes. Not only did this result in excessive calls to recomputeHeatMap (recomputing maps for something like 130 players every second, which isn't even useful), there were a bunch of other regular-interval parts of the server step that were being triggered 65 times per second as well. We don't need to check whether a player's curse score is decremented 65 times a second, for example.
After finding the parts of the server step that weren't necessarily reactive, I put them on fixed timesteps so that they would only run if enough time has passed, not every single step. Heat maps are now limited to 20 players per second, max, for example, regardless of how quickly messages are coming in.
The results are pretty dramatic. Here's the new profile picture, after these changes, with about 150 players on server 1:

And here's a 30-minute monitor graph of both old and new (sampled every 5 seconds, for 360 samples total):

Yes, that's around half the CPU used per player now. This should allow us to double the number of players that occupy a given server.
But even so, when we start getting above 60% internal CPU, external resource consumption can get up into the 90% range, which does not make Linode happy.
However, they did inform me that 2-core nodes (which are more expensive) are allowed to go up to 160% utilization, and 4-core nodes are allowed to go up to 320% utilization.
The server code is single-threaded, so it can't take advantage of more than one physical core directly, but the external resource consumption from virutalization, including disk access and so on, apparently can.
So, today I introduce a brand new server on the front line: bigserver1.onehouronelife.com
2 cores, 4x the RAM, a bigger disk, and a bigger upstream network pipe. Most of these extra resources aren't needed, but the extra core may help with external resource usage. Four times the cost, though. Is it worth it? How many players can we put on this sucker before it starts to choke?
To give you a taste of the difference between internal and external resource consumption on a virtual server, bigserver1 currently has 155 players on it. Internally, in top, it is using less than 1% of its CPU. Something around 0.3%, to be exact. Hard to believe, but true. A fresh---and tiny---map database likely helps with this, for sure.
But externally, as far as Linod is concerned? 50% CPU. Granted, I can safely go up to 160%, but still, 50% is way different than 0.3%. My external networking and disk access graphs are relatively high, though, and my guess is that some of those aspects contribute to external CPU usage. Again, my guess is that the process of virtualizing networking and disk involves extra host CPU operations that wouldn't be necessary on non-virtual hardware.
As another example, if I run a pure-CPU test process that busy loops, I see both 100% internally and externally, but that's a process that isn't touching the disk or network at all.
So, over the next few weeks, we'll see where bigserver1 can take us, in terms of a large population of players all in one cohesive world.

I will let this week's GIF speak for itself.
This is Jason Rohrer, signing off for now.

.-. .- -.. .. --- / - .-. .- -. ... -- .. ... ... .. --- -. --..-- / -.-- --- ..- / ... .- -.-- ..--.. / - .... .- - .----. ... / ... --- -- . / .--. .-. . - - -.-- / .... .. --. .... -....- - . -.-. .... / ... - ..- ..-. ..-. --..-- / .. ... -. .----. - / .. - ..--.. / - .... . / -- --- ... - / -... .- ... .. -.-. / ..-. --- .-. -- / --- ..-. / .-. .- -.. .. --- / - .-. .- -. ... -- .. ... ... .. --- -. / .. ... / .- -.-. - ..- .- .-.. .-.. -.-- / .--. .-. . - - -.-- / .-.. --- .-- / - . -.-. .... ---... / .- / ..-. . .-- / -... .. - ... / --- ..-. / -.-. --- .. .-.. --..-- / .- / ..-. . .-- / -... .. - ... / --- ..-. / ..-. --- .. .-.. --..-- / .- -. -.. / .- / -. . ... - . -.. / ...- .- - / --- ..-. / -.-. .... . -- .. -.-. .- .-.. ... / - .... .- - / .... .- ...- . / -... . . -. / -.- -. --- .-- -. / ... .. -. -.-. . / .- -. -.-. .. . -. - / - .. -- . ... / -.--. .. -. / .- .-.. -.-. .... . -- .. -.-. .- .-.. / - . .-. -- ... --..-- / .- / -... .. - / --- ..-. / .-. --- -- .- -. / ...- .. - .-. .. --- .-.. --..-- / .- -. -.. / ... --- -- . / ... .--. .. .-. .. - / --- ..-. / ...- .. - .-. .. --- .-.. -.--.- --..-- / .- -. -.. / .- .-- .- -.-- / -.-- --- ..- / --. --- .-.-.- / -.-- . ... --..-- / .. - .----. ... / -. --- .. ... -.-- / .- -. -.. / -... .-. --- .- -.. -....- -... .- -. -.. --..-- / .- .-.. -- --- ... - / .-.. .. -.- . / - .... . / .-. .- -.. .. --- / . --.- ..- .. ...- .- .-.. . -. - / --- ..-. / ..-. .. ... .... .. -. --. / .. -. / .- / .--. --- -. -.. / .-- .. - .... / .- / ... - .. -.-. -.- / --- ..-. / -.. -.-- -. .- -- .. - . --..-- / -... ..- - / .. - / --. . - ... / - .... . / .--- --- -... / -.. --- -. . --..-- / .- -. -.. / .. - / .-- .- ... / - .... . / ... - .- -. -.. .- .-. -.. / -- . - .... --- -.. / --- ..-. / - .-. .- -. ... -- .. ... ... .. --- -. / ..-. --- .-. / .- -... --- ..- - / - .... .. .-. - -.-- / ... --- .-.. .. -.. / -.-- . .- .-. ... / -.--. ..-. .- -- --- ..- ... .-.. -.-- / ..- ... . -.. / - --- / .. ... ... ..- . / - .... . / -.. .. ... - .-. . ... ... / -.-. .- .-.. .-.. ... / ..-. .-. --- -- / - .... . / ... .. -. -.- .. -. --. / - .. - .- -. .. -.-. -.--.- .-.-.- / .-- .... .- - .----. ... / ... --- -- . .-- .... .- - / .- -- .- --.. .. -. --. / .. ... / .... --- .-- / .-.. --- -. --. / .. - / - --- --- -.- / ..-. --- .-. / .--. . --- .--. .-.. . / - --- / -.. .. ... -.-. --- ...- . .-. --..-- / --. .. ...- . -. / .... --- .-- / ... .. -- .--. .-.. . / .. - / .. ... .-.-.- / .-- .... .- - .----. ... / . ...- . -. / -- --- .-. . / .- -- .- --.. .. -. --. / .. ... / .... --- .-- / -.-. .-.. --- ... . / - --- / -- .- --. .. -.-. / .. - / .. ... --..-- / --. .. ...- . -. / .... --- .-- / ... .. -- .--. .-.. . / .. - / .. ... .-.-.- / .. -. ...- .. ... .. -... .-.. . / -- . ... ... .- --. . ... / .. -. / - .... . / ... -.- -.-- --..-- / -- .- -.. . / .--. --- ... ... .. -... .-.. . / - .... .-. --- ..- --. .... / - .... . / ... .--. . -.-. .. ..-. .. -.-. / .- .-. .-. .- -. --. . -- . -. - / --- ..-. / .--. .-. .. -- .. - .. ...- . / . .-.. . -- . -. - ... / -... .- ... . -.. / --- -. / .- .-. -.-. .- -. . / -.- -. --- .-- .-.. . -.. --. . --..-- / .- -. -.. / -.. --- -.-. ..- -- . -. - . -.. / - .... .-. --- ..- --. .... / ... - .-. .- -. --. . / -.. .. .- --. .-. .- -- ... .-.-.- / .. -. / - . .-. -- ... / --- ..-. / - .... . / ... .... . . .-. / -. ..- -- -... . .-. / --- ..-. / --- -... .--- . -.-. - ... / .- -.. -.. . -.. --..-- / - .... .. ... / .. ... / --- -. . / --- ..-. / - .... . / .-.. .- .-. --. . ... - / ..- .--. -.. .- - . ... / .. -. / - .... . / .... .. ... - --- .-. -.-- / --- ..-. / - .... . / --. .- -- . / ... --- / ..-. .- .-. .-.-.- / .. / --. ..- . ... ... / - .... .- - / -- .- -.- . ... / .-. .- -.. .. --- / .--. .-. . - - -.-- / -.-. --- -- .--. .-.. .. -.-. .- - . -.. --..-- / .-. . .-.. .- - .. ...- . .-.. -.-- / ... .--. . .- -.- .. -. --. .-.-.- / .... --- .-- . ...- . .-. --..-- / .-- .... . -. / .. / - --- .-.. -.. / -- -.-- / .---- ..... / -.-- . .- .-. / --- .-.. -.. / ... --- -. / -- . --.. / .- -... --- ..- - / - .... . / -.-. --- -. - . -. - / .. -. / - .... . / ..- .--. -.. .- - . --..-- / .- -. -.. / - .... . / .-- .- -.-- / - .... .- - / .. - / .-- --- ..- .-.. -.. / .-- --- .-. -.- --..-- / .... . / ... .- .. -.. --..-- / .-..-. -.-- . - / .- -. --- - .... . .-. / -... .. --. / ..- .--. -.. .- - . / ..-. ..- .-.. .-.. / --- ..-. / ..- ... . .-.. . ... ... / - . -.-. .... -. --- .-.. --- --. -.-- -.-.-- / .... --- .-- / .- .-. . / .--. . --- .--. .-.. . / . ...- . -. / --. --- .. -. --. / - --- / -- .- -.- . / ..- ... . / --- ..-. / - .... .. ... --..-- / -... -.-- / .-.. . .- .-. -. .. -. --. / -- --- .-. ... . / -.-. --- -.. . ..--.. .-..-. / -... ..- - / --. .. ...- . -. / - .... . / -.-. --- ..- .-. ... . / --- ..-. / .... ..- -- .- -. / .... .. ... - --- .-. -.-- --..-- / .. - / ... . . -- ... / ... - .-. .- -. --. . / - --- / -- . / - --- / -.-. .- .-.. .-.. / - . .-.. . --. .-. .- .--. .... -.-- / ..- ... . .-.. . ... ... .-.-.- / .-- .... .- - / .... .- - .... / --. --- -.. / .-- .-. --- ..- --. .... - ..--.. / .--- .- ... --- -.

This week's update focuses on a bunch of bug fixes and other little improvements. I took some time off for the holidays this week, and will be back with a substantial content update next week.
The biggest change is an improvement to the way that players are automatically distributed among the available servers. The original goal was to keep as many players as possible together on the same server, and only expand to additional servers when necessary during a population boom. During a population decline, we still want as many players as possible playing together, so the remaining players should be brought together onto one server, instead of being left spread out on the overflow servers.
This system was working as intended, but had some unfortunate side-effects on village fertility. Essentially, if you were on one of the overflow servers during a population downswing, your village was doomed, because no new players would be sent there. As player population changes throughout the day, this means that various villages die out again and again. And even worse, other logic in the player distribution code tries to make sure a given player always plays on the same server, whenever possible. So, depending on the time of the day that you play, and the luck of the draw, you might get stuck always being born on an overflow server right before a population downturn---always playing in a doomed village.
Take a look at the red line (server 4) in this graph, which was generated by Thundersen:

You can see that as the population rises, server 4 is brought into the mix to handle it, and then the population reaches a noisy plateau, which soon after results in server 4 being removed from the mix, only to be brought back into the mix a few hours later, only to be removed again shortly after. Villages on server4 were dying out over and over. Pity the players who were stuck playing on server 4 that evening.
Also, that system was designed a long time ago, when Eve distribution wasn't really in place, and I imagined players mostly all playing in the same area on the map. Now that players are playing in separate villages anyway, keeping them clumped on the same server together isn't as high of a priority.
CrazyEddie suggested that we try a different method, picking an appropriate number of servers for the load, and then just letting populations rise and fall on the servers together, as long as we're still above some lower threshold. Thus, once a server is brought into the mix, it generally stays in the mix. As population falls, it falls simultaneously on all servers, but no server is singled out to be childless. This means that a village being doomed by outside circumstances will happen way less often---almost never (except in very rare cases where the overall population falls to very low levels and a server really does need to be taken out of circulation).
Keep in mind that villages are still competing for babies, due to variable mother fertility factors (warmth and diet variety). So, that's still happening on each server. If your village is dying out, perhaps another village is stealing incoming players by taking better care of their fertile mothers. There is no explicit trans-server competition, though there's a kind of meta competition, based on how many of the players that are assigned to your server are motivated to keep playing across multiple lives.
I have something special in store for next week. Not magical, but still magic. Well, I guess it's only called "not magical" because of how jaded we are. If I told you that a few coils of copper wire and a galena crystal could be used to pull invisible voices from the sky, you'd probably think I was crazy. But to the untrained eye, a schematic can easily be mistaken for a sigil.

First, a few important fixes that you all should be aware of.
There was a bug in temperature weighting on mothers. It was supposed to make ideal-temp mothers more likely to have a baby, but it was broken and not working. That has been fixed now. Furthermore, a Yum multiplier factor has been added to this weighting. If you have a large Yum multiplier (from eating a chain of unique foods), you will also be more likely to have a baby. If you're warm in addition to being on a yummy diet, you will be even more likely to have a baby.
And the way that Eve spawn locations were remembered---when Eve died of old age---was buggy. Thus, the surprise appearance of Eves near villages. This has been fixed. But even when it's working correctly, it's meant to only function on low-pop servers, and not as a way-of-life for reviving collapsed villages, so that has been fixed as well (your last-Eve-death location will only be used for your next Eve spawn if there are fewer than four fertile females on the server currently). This fix is even more important in light of this week's update, which I will describe in detail below.
In last week's update, I talked about how there will be no magic in the game. What I meant to say is that there will be no non-inherent magic.
Some things about the game are inescapably magic. Reincarnation---a reality for any commercially viable game---is the prime example of this.
But the map itself, and the servers, and how they get set up, and how they get updated, and how they get cleared, is another example. I'm doing all this stuff behind the scenes to keep things updated and working. I'm making choices. I'm adding things. I'm in control of the parameters that control when and how certain parts of the map go back to their natural state.
And the map is huge---unnaturally huge. 36,000x larger than the surface area of the earth. Walking from one edge to the other in the game would take you 34 years of real-life time. Walking around to visually see the entire map would take you 14 billion years.
It's a big map. Mind-mindbogglingly so. Yet I can change the entire thing with the push of a button, like when I add a new biome, or wipe it back to its natural state in the blink of an eye. How can something so big be changed so fast? Through procedural generation and the properties of computer file systems (where deleting data of length N is a constant time operation on N). It's not magic, really.
But when we try to square these possibilities with a simulation of the real world, the end results are nothing short of miraculous.
And what does that make me, the guy pushing the buttons behind the scenes?
There's an amazing idea lurking in this game, and credit for the idea goes to Edmund McMillen. When I visited him a few years ago, in between petting his hairless cat and having him kick my ass in a Magic draft, I told him about the game I was working on. In a game that starts back at zero as a premise, a question arises: how did we get to zero in the first place? And what if, Edmund suggested, players were in control of taking everything back to zero? What if, at the top of the tech tree, the most difficult-to-craft item was The Button?
It seems that, after all is said and done in this game, after all my updates are out, and the game stops evolving due to developer input, this just has to be the way that it will work. Otherwise the game will stagnate. Edmund was right.
But what about along the way? In the arms race of player progress in the face of my weekly updates, players always win.
So, the idea of an along-the-way apocalypse arose. What if The Button was a moving target? Some item at the top of the current tech tree that represented the current endgame?
The problem here is that players can get to the top of the tech tree ridiculously fast.
This means that the apocalyptic item can't be technological. It needs to be magic in some way.
Long ago, shortly after the game's release in early 2018, I tried something like this. A monolith in the desert that you could use to conduct a kind of absurd ritual using a bit of material that was high-level tech at the time. This experiment was an utter failure, as the first apocalypse was triggered four hours after the update, and subsequent apocalypses were triggered hourly after that until I gave up and disabled the whole system.
I left that failed experiment behind, without thinking about it any further. Players can get through the tech tree---and craft any imaginable thing---way too fast. This even planted seeds of doubt in my mind about Edmund's Button, even at the end of the update process, once the tech tree was gigantic.
Still, I really liked the shared collective event that had occurred. People who were playing that fateful day will never forget that flash of white...
In the mean time, other ideas surfaced, like the bell tower, which involved slowing down player progress toward a goal and ensuring trans-generational cooperation. A bell tower takes 18 hours to build. In order to build it, your village has to survive that long.
This takes a page from the Clock of the Long Now.
The insight this week was that these two ideas can be combined. An apocalypse, for the time being, is a magical, not technological event. So there's a ritual. What if it was a very slow ritual? What if people had plenty of opportunity---and warning---to interrupt the ritual before completion?
That was always the idea with Edmund's Button anyway---that people would be fighting to stop it along the way.
So, I give you a new and improved apocalypse. It has:
--Rare, unsustainable ingredients that you cannot procure while working completely alone.
--A map-wiping wave that is limited to one server only (no more chance of an Easy Apocalypse on a vacant server causing wipes on the populated servers).
--A map-wiping wave that you can live through and come out the other side.
--World-wide warnings as the ritual gets closer and closer to completion.
--The ritual itself is very fragile and easy to set back along the way.
--The entire ritual, if uninterrupted, takes 24 hours to complete.
And, for the time being at least, it's magic.

This update is on time for sure this week, and lemme tell you why. Tomorrow is the solstice, the shortest and darkest day of the year in the northern hemisphere. The sun will die as it passes through the constellation of the Southern Cross, remain dead for three days, and the be born again as it rises on December 25 through the constellation of Virgo, the virgin. But enough of that astrological claptrap! What's that got to do with the update?
What we do, in my family, on the solstice is take a step back in time for a day. We use no lights except for sunlight and candles. That also means no computer screens. This is actually a pretty amazing thing to do every once in a while, because everything---and everyone---looks absolutely gorgeous when you've got candles all over the place in your house.
So, no sneaking the update in after the bell tomorrow. Today or bust.
We also have salsa, on the solstice, because my oldest kid thought that sounded funny when he was little. Salsa on the solstice. Tradition!
And yes, you can now celebrate this season in various ways in One Hour One Life. But be forewarned: do NOT expect some magical Santa NPC to be running around in-game handing out presents. That will never happen in this game (as hilarious as it sounds), for a good reason. This is a game that draws as many of its aesthetics as possible from real life. It's about human technology, and human society. It is not about magic or other supernatural things. No gremlins, no dragons, no ghosts, no Santa.
The only place the game breaks with this aesthetic is via reincarnation, for sheer playability reasons (as much as I was tempted to make a game where you only live once). And the curse system follows as a necessity from that (because criminals can reincarnate just like everyone else, and keep bugging you for all of eternity---unlike in real life).
So, holiday stuff, but actual human holiday stuff.
There are also two new chat "commands" that you can use to help you in diagnosing lag. /FPS will toggle a count of the current frames per second (are you experiencing GPU slowdown in dense areas?), and /PING will ping the server and display the round-trip time in milliseconds (is your connection to the server getting flaky?).
Have a great holiday season, everyone!

Sheesh, an internal combustion engine has a lot of moving parts. I should know, because I just drew them all. There was so much detail that I had to lay out the whole thing in CAD software first, as printed a tracing guide. It's all still hand-drawn. Call it Computer Aided Human Drawing.

So I drew it, and now it's up to you to put the damn thing together.
The internal combustion engine was actually a major sticking-point in the design of the game: how do we get over the very steep hump that leads into industrialization? Like I mentioned in a previous update, the actual history here is far from clear. We went from very crude machines that were mostly made out of wood and powered by animals, water, or humans to finely crafted clockwork contraptions that could literally pump like well oiled machines. My guess is that it was a process of micro-refinements over about five hundred years.
So, I kinda just winged it here, assuming that if we had something spinning fast enough, that would be enough to bootstrap the whole thing via the magic of the lathe. And here we are, a week later, with a pretty accurate model of a four-stroke, two-cylinder diesel engine, complete with all major parts.
If you're interested in more details about how this works, this video explains the working of a single cylinder:
https://www.youtube.com/watch?v=fTAUq6G9apg
And this weirdly-narrated video explains how the camshaft ties the whole thing together in terms of timing:
https://www.youtube.com/watch?v=DZt5xU44IfQ
My gosh, humans are clever!
The major thought experiment in this game is this:
"It took us 4000 years to advance from stone-aged tech to the iPhone the first time around. If we had to start over from scratch, naked in the wilderness, with nothing but rocks and sticks, but we retained all knowledge, how long would it take the second time?"
The more closely I study this stuff, the more baffled I am about how we ever did it in the first place. How long would it take the second time? My current best guess: Forever.
As in, never.

"And then one day he was shootin' at some food, and up through the ground come a bubblin' crude. Oil that is. Black gold. Texas tea." Californy here we come!
My father was an oil man. At least he tried to be, for a while. When I was young, he invested in a local oil exploration company in Ohio. Everyone in the family got free ball caps with the drilling outfit's logo. I remember climbing up the steps on the side of a huge oil tank, where he wrenched open the porthole cover and we peered inside as the oil poured in. Was a sight! And more importantly, what a smell! With tiny me perched up there by his side, my father reached his arm down inside with an empty peanut butter jar and filled her up directly from the gushing pump stream. (What the hell was he thinking?) That jar sat---and settled---on his office desk for many years. Sludge would be a naive appraisal of what was in that jar. Brown sludge. A reminder of an investment in oil that never turned a profit.
But your investment in oil will turn a profit!
The more time you spend around crude oil, the more trouble you will have believing that people actually used to rub this noxious stuff on their bodies as a medicine.
But what about the very best stuff? Light, sweet crude, with a very low sulfur content---really top notch. If you're brave enough to take a sip, it actually tastes sweet.
So you want that oil. But oil prospecting and refining requires a lot of equipment along the way. And that's why this update is one of the largest and most complicated in the history of the game so far. Machines galore.
But when you finally see that black plume shoot toward the sky, you too will dream of striking oil before you die.

This update paves the way for the forthcoming industrial revolution. After banging my head against the actuality of human history in this area (much of which is, strangely, shrouded in uncertainty) for four straight hours on Monday, I realized that bootstrapping is hard. This is the point where the true mystery of human civilization comes to a head: how do you make a lathe without a lathe?
We've come a long way so far, and bootstrapped a whole bunch of things in this game. But these are all things that I myself know how to make from scratch, in principle. This is the kind of stuff that is made on the Primitive Technology YouTube channel. If it looks hand-made, it can probably be made by hand, right?
But how do you bootstrap metal machines? I'm starting to suspect that this is something that no one now living actually knows how to do. So it's my job to figure it out, or at least make up a reasonable approximation. I was thinking that we'd be skipping right over the age of steam---that steam was just an unnecessary side-branch on in the inevitable path toward internal combustion. But now I think it's actually about tolerances. Internal combustion requires extremely tight tolerances, and metal gaskets, because there's fire right there in the cylinder. Steam engines can be made with much lower tolerances, and leather or rubber gaskets, because the fire is kept outside the cylinder. I.e., crude steam machines can be made without the process of machining. And with steam machines, we can make the machines with which we can actually "machine" parts with tighter tolerances. Steam lathe, here we come.
And speaking of steam lathes, this video of a 1900's era steam-powered machine shop is pretty amazing. But none of those belt-driven machines contain parts that were made by a blacksmith:
https://www.youtube.com/watch?v=9WXHNBMLZZM
But there's no lathe in there yet. What can you do with this Newcomen Atmospheric Engine? Pump water! Why would you want to do that? You'll find out soon enough.
This update also dramatically improves the mouse interface when dealing with stacks of things that should also be moveable as a stack (stacks of plates, for example). Left click grabs the whole stack, and right click removes an item from the stack. In other words, the stack now behaves similar to a container when you left or right click on it.
New wild wounds (or sickness) no longer replace your current wound. You can't heal from a snake bite by contracting yellow fever or getting hog cut.

Yes, this update is a bit obvious. It's Thanksgiving tomorrow in the US. But separate from that, the turkey is a majestic animal.
The wattle! The snood! The caruncles! The beard! What other animal, of feather or fur, has facial anatomy more distinguished or beautiful than the turkey? Furthermore, it is a true native of our new world. An American original. Imagine what the early European settlers must have thought when they first laid eyes on it.
To prevent turkeys fighting over who has the longest, reddest, and most engorged snood, farmers often desnood the turkey chicks at a young age. That sounds like a barbaric practice to me. There will be no desnooding in this game, at least not yet, because turkeys cannot even be domesticated. They are wild turkeys, thank you very much, and you just can't pin a wild turkey down long enough to desnood it. Maybe someday, a future update will feature domestication, desnooding, and the all-important Presidential Pardon.
The only other content change involves yellow fever. Getting bitten multiple times will no longer auto-kill you, but will instead just extend the duration of your illness. The side-effects of the illness have also been adjusted to reduce the chances of survival without help from friends. You're sick. They need to nurse you back to health. This should help balance the Jungle a bit more.
Those of you who have been having trouble with mouse cursor alignment on ultrawide displays will now hopefully find that the problem has been fixed. On such displays, I now hide the system mouse pointer, which is off, and draw an emulated mouse pointer at the true click location. This emulated pointer can also be scaled to your heart's content from the SETTINGS screen, which also should be helpful for low-vision and high resolution users.
You can now access your personal family trees, which will open in a web browser, from a button on the main menu screen. No more typing your email or logging in via Steam to access your lineage page.