a multiplayer game of parenting and civilization building
You are not logged in.
Except for the berry munching, you just arrived at standard societal gender roles by first principles. See the Age and Gender tab for the Iraq war data here:
http://online.wsj.com/public/resources/ … raq07.html
Suppose you have two tribes. One sends its men to war and keeps its women safe at home. The other sends its women to war and keeps its men safe at home. Suppose there's no strength difference between men and women (there actually isn't very much of a strength difference, on average, in reality, given the same training, and especially if weapons are involved). Which tribe wins, in the long run?
Replace the two tribes with two sinking, arctic ships. On one ship, the men get on the lifeboats first. On the other, the women get on the lifeboats first.
http://www.anesi.com/titanic.htm
Such old-fashioned nonsense, this chivalry stuff...
Anyway, one thing that's always puzzled me is the preference for male over female babies in many cultures. Shouldn't the same subconscious logic that leads you to put women on the lifeboat have you hoping for daughters over sons?
Yeah, I'm thinking about something like that. Oldest in family line, or something. So in a multi-Eve situation, both get the hints.
Also, I'm really worried about the way this system encourages matricide or fratricide or gran-matricide or uncle-cide or apple-cider.
So, I've got to figure out how "keeping your elders alive to learn from them" is encouraged, as opposed to "bumping them off so you become king."
Though maybe the generation war is interesting....
Anyway, making it "the oldest person on the server" changes things, because if your village has that elder, you want to keep them alive. The next oldest person could be in the other village. You monopolize the knowledge as long as you keep your elder alive.
Eves could always get the knowledge automatically, regardless of who's oldest on the server.
Another idea to discourage elder-cide:
When an elder dies, their "possible time left," if they're under 60, is set as a "cooling off" period before anyone else gets the knowledge. So you have to wait until the last elder's 60th birthday, whether they are alive or dead, until a new person becomes the elder.
Thus, if you kill them or neglect them so they die, it creates a knowledge gap, whereas if you support them until the end of their life, there's no gap, and the next elder ascends right away.
Anyway, this would work for family lines just fine, giving each village an elder, or maybe even a group of them, depending how the families shake out. Need to think about it more.
And yes, that book has been on my list for a while. You just reminded me of it. Will fetch from the library today!
Ah, you really want to sidle up to a lightning rod and touch your tongue to it, don't you Purumus?
The purpose of biological gender in the game is the same as the purpose of biological gender in the real world, minus any cross-breeding mechanics. Only women can have babies, and only women can breastfeed.
Men are "dead ends" in the matryoshka doll tree just like they are dead ends in real life.
Every woman on the planet today is at the end of a continuous chain of mothers who had at least one daughter going back 1.2 billion years. Your maternal grandma had at least one daughter, I know it. And your maternal maternal great grandma had at least one daughter.
Every man is at the end of a father chain too... but there's uncertainty at every step of the way, so it feels different.
Good analysis there.
Whoa, I just got it:
Only the oldest person on the server gets any hints at all.
That would be Eve sometimes, but also granddad or whoever other times.
So you'd really want to keep your elders alive and well. They can talk way more, and now they have something to talk about.
Yeah, I'm pretty solidly against hints for reverse engineering being in the game, for all the reasons that you mentioned.
Also, I do love that after civilization gets advanced enough (people don't even have fires anymore, because they have electric heaters or whatever), they can collectively "forget" primitive survival skills. When civilization collapses, they'll be back to figuring the basics out again, just like we would be if we needed to make thread from scratch.
Really, in the current state of the game, you ALL are in a situation where you've forgotten your primitive skills. The struggle with the bowdrill comes mostly from not knowing how a real bowdrill works. You can't smother the tiny ember. You need to pick it up with a leaf and put it on TOP of the tinder. For real.
All that said....
Unlike CM and TCD, this game is supposed to work for any size player base. 1 player, 2 player, 10,000 player, and here's hoping, 100,000 player or even 1,000,000 player.
It's also supposed to be immune to "permanently dying out." Right now, lets say the base rate of TCD acquisition is 1 new player every four days or so. Lets say there's a spike because of some coverage, and we get 3 new players on one day who start playing together. Because the game isn't so great with 3, they don't stick around for four days, so they're no longer there when the 1 average-rate new player joins. So the game can't regrow from a small seed of players.
I want this game to be able to regrow itself at any point. If you discover the game 5 years from now and try playing, even if you're alone, you should be like, "Wow, this is amazing!" and play for an entire week.
I don't know how to balance these two requirements. The game should be magical and encourage communication in the case of a large population of players, but not leave a small population of new players completely in the dark.
It's almost like the hints should be dynamic.... like, when you pick up a sharp stone, it figures out how long it's been since a hatchet has been made. If it's more than 1 hour, then it gives you a hint about sharp stones being used to make hatchets. If it's less than one hour, it expects you to learn from someone else?
Or maybe only Eve gets hints, ever?
This is only enforceable client-side, by the way, because the client has the full transition list.
I wonder about hiding the transition list on the server only, but that flies in the face of open source, PLUS the client uses the transition list to "pre-load" sprites in the background for objects that are one step away. There's no way the graphics card has room for 30K sprites, so only a fraction are kept loaded at any one time, based on what's reachable in the transition tree.
But anyway, imagine THAT version of the game, where the tech tree really is a secret.... absolutely full of surprises. Hmm....
I suppose that the tech tree could be encrypted with a key that only I and the server have. Then it could be stored in the public repo.
That still doesn't help with the dynamic loading, though...
Obviously, the client would still have the full object list. Pushing all of that stuff server side would be really messy and eat bandwidth.
Oh Josh, just WAIT until you get your intelligent little hands on my editor....
Just put images in a folder, he says? Ha!
You will forget that you ever remembered using folders, sir.
Anyway, I've taken the plunge into objects with "use count," and then I'm auto-generating dummy objects for each step of the way, and auto-generating transitions to go with them. So Bush_9, Bush_8, Bush_7, etc. are created as objects if Bush has numUses=10. And then if I have:
Hand + Bush
=
Berry + Bush
It notices the numUses on bush, looks for Bush => Bush transitions (where Bush doesn't change), and replaces them with generated transitions like this:
Hand + Bush
=
Berry + Bush_9
and
Hand + Bush_9
=
Berry + Bush_8
Also, I'll have a way to define the "last use" transition specially, so I can effectively define:
Hand + Bush_1
=
Berry + Empty Bush
And I have also implemented "useVanish" flags for sprites in an object. These sprites vanish gradually and evenly over time as the object is used up. Berries can disappear. A "high water" sprite can disappear and reveal a "low water" sprite underneath (for water in a bowl or bottle). A "new axe" sprite can disappear and reveal more and more worn axe sprites underneath.
The vanishes are spread out across the numUses, even if there aren't enough vanishes. So if there are 3 vanish sprites, and 100 uses, one will vanish at 75 uses left, another will vanish at 50 uses left, and the final one will vanish at 25 uses left.
This way, I can tweak the number of uses at-will, to balance the game, without breaking anything. The vanishing sprites will "stretch and shrink" to cover any number of uses.
(I also don't need to show 10 berries on a 10-use bush, because that's too visually crowded.)
Well, the problem with doing it "on top" is that both the client and the server need to do it exactly the same way, because the server will be sending map chunks to the client containing some of these dummy, induction-generated objects.
Let's say the max real object ID is 395.
For the berry bush, 10 dummy objects would be generated: 396, 397, ... , 405
The client needs to generate these in the same way, or else the wrong object will be displayed.
They're both doing it with the same code, and they both should always have exactly the same "real" objects, so it should aways happen exactly the same way, in the same order. It just seems very fragile to me.... maybe I'm overthinking it.
Induction!
Yeah, I have thought about this.
I implemented the berry bush stuff by literally making 10 separate transitions. It's tedious (for me) and error-prone. However, it does allow some nice things like being able to visually show the berries decreasing (berries are separate sprites from the bush, so along the way, I make them gradually go away, which wouldn't work with an induction system).
A simpler way to do it is with timers. Once you start picking the berry bush, it becomes empty after X seconds, timed so that you can eat-until-full from it 4 times before it becomes empty. Then there's only two transitions.
Same could work for the ax (it becomes dull over time whether you use it or not----and I guess that's the way I was imagining the ax to work, anyway).
The problem with this is that it lets an infinite number of people eat until full from four times it during that time.
The timing method of making food run out encourages sharing, but it doesn't create any contention over food resources, which I think misses some interesting social dynamics. That makes sharing have no meaning, discourages trade, etc. If I give you some of my hard-earned food, that should be a very meaningful gesture, as it should lessen my personal supply.
Finally, I hope that the berry bush is kindof a special case here. Most food sources will be single-use. The ones that aren't should change visually as they are used up (like a row of carrots where you pick one at a time).
Also, adding a numerical system for objects, like doing it for real, is an insanely deep change. Protocol and database would have to support that.
The category system was added "on top" of the existing stuff, where it just auto-generates all resulting non-category transitions based on category transitions at startup. So its really just a way for me to offload the combinatoric explosion onto the computer.
I suppose I could add a numerical transition system "on top" in a similar way, where at startup, the abstract induction transition generates the necessary dummy objects and all necessary concrete transitions for them.
But the lack of visual or verbal changes to the object along the way is still troubling....
I mean, unless the auto-generated stuff just displayed a number. Literally "Axe (25)", meaning there are 25 chops left. "Goosberry Bush (9)", meaning there are 9 picks left.
I'm still stuck on the lack of visual change, though...
Could some sprite layers be flagged as "emptiable", and then the auto-induction system would generate dummy objects with fewer and fewer of these emptiable sprite layers?
Okay.... well, I'm not sure I want to hand EVERYTHING to you. I still want some mystery. I still want you to ask another player how they made something. I still want a village that figures out how to make cars to be the ONLY place cars exist in the world. Maybe they sell them! Yes, of course I want some people to sell the more hard-to-make things, or maybe even keep "trade secrets."
The point of the bottom-up hints is literally to help a beginning player actually DO something, anything at all.
I expect more dedicated players to study out-of-game databases and such.
Think of it like Minecraft:
There's no crafting hints at all in that game, neither bottom-up or top-down. In fact, in that game, you cannot craft much of anything on the built-in 2x2 grid until you "bootstrap" yourself by making a crafting bench, gaining access to the full 3x3 crafting grid. So you might even try to make a hatchet in Minecraft, and simply not be able to do it until you figure out that you have to make a crafting bench first.
HOWEVER, that doesn't mean that there's nothing for a beginning player to do. You dig into the ground with your bare hands. You gather resources. You can stack them up and start building stuff. You can play Minecraft for several hours, trying to survive the night and such, just doing the "mine" part of it without ever touching the "craft" part of it. Then, when you decide to go deeper, the Wiki and the Guides and the How-To-Videos are there waiting for you. But you don't need those external resources to get started. To play and have an interesting time.
So, my game needs an entry point like this. You just bought it, you know nothing about it, but there should be several hours of pretty interesting game waiting for you. Then, if you want to go deeper, the external resources exist to help you.
Also, I think some opaqueness helps with the cultural "stickiness" of a game. All those wikis and articles and guides and how-to videos build and bolster the community around Minecraft. Friends help each other get started playing, etc.
That said, I don't think a game can be totally opagque, because then it will never get off the ground. Or should I say, I'm too chicken to make a totally opaque game.
Minecraft also had the non-opaque part (digging around and building stuff).
I do worry that a complete, game-wide bottom-up crafting hint system gives too much away, and makes it too transparent. I may implement a cut-off at some point, based on how high in the tree you've climbed. Like, hints are only given for stuff that's 5 transitions away from a natural object...
But, for the time being, I'm implementing a full bottom-up crafting hint system and seeing where it takes us.
Well, the problem with looking at a hatchet and suddenly "knowing" how to craft it is that you have to have the hatchet in the first place before you ever have a chance to study it. Who made the hatchet that you're studying? If no one has figured it out, no one can study it and thus figure it out. Thus "top down" crafting hints don't seem to help much.
I'm currently working on something like thought bubbles (probably more like notebook pages that pop up along the bottom of the screen), but "bottom up" hints. Like if you look at a branch, it will say, "Sharp Stone + Branch = Long Shaft"
And if you look at a long shaft, it will say, "Sharp stone + Long Shaft = short shaft"
And if you look at a short shaft, it will say, "Short shaft + rope = tied shaft"
If you stumble on a hatchet and look at it, it won't tell you how to make it, but instead will tell you what you can do with it.
You'll see "hatchet + branch = kindling"
Obviously, there needs to be a multi-page interface, with some way to page through the options. A hatchet can turn about 10 things into kindling. A sharp stone can be used to dig a carrot and make a hatchet and clean a branch into a shaft and so on.
But in your end of civilization example, if you see a car sitting there, it might say,
"Bucket of Gas + Empty Car = Full Car."
And if you mouse over some petrol refining machine, it might say:
"Bucket of Crude Oil + Refining Machine = Bucket of Gas"
And if you stumble onto a pump-jack oil well, it might say:
"Bucket + Pump Jack = Bucket of Crude Oil"
All these help you figure out how to use the car. But they don't help you make the car.
However, it's possible to "feel your way" up to the car from the bottom.
Okay, take two:
After talking about the food system literally for 6+ hours with different people yesterday, the current plan is this.
Call it, "Food of all forms is constantly running out, unless you do something about it."
--All food goes back to stacking.
--Berry bushes have a limited supply of berries (10?), and they take forever to regrow, like 20 minutes or something. Each berry fills you up +4.
--Same with wild carrots, wild rabbits, etc. They regenerate too slowly to be sustainable fixed-location food source, even for one person. If you want to hunt/gather, you need to keep moving to new areas.
--Each berry can be eaten, but it can also be turned into a seed and planted. Same with the carrot (some seeds can be gathered.) Same with rabbits (they can be caught and domesticated).
--New berry bushes and carrots are also really slow to grow, but some low-level tech (tilling, watering) can dramatically speed up the growing process. Feeding domestic rabbits makes them breed faster, etc. You also have the economics of scale. Planting 10 slow-growing berry bushes, all in a nice row.
--Your success at farming (and other more advanced food production, processing, storage) will naturally determine how big of a population you can sustain in your village. If you don't produce food at all, you have no village, because you have to keep moving to find new wild food. If you are producing food, and you have a baby boom, and some people help less than others, you won't be able to sustain your larger population. Successful villages will grow bigger and bigger, because more of their babies will survive, eventually leading to even more fertile-age women, and thus an even bigger share of incoming babies, while people who don't produce food as well will have shrinking populations, fewer women surviving into adulthood, and thus a smaller share of incoming babies.
One bad generation can completely destroy a functioning village, which means that civilization success is a long-term group project. Keep this plane in the air, folks, we worked hard to get it as high as we've gotten it. Separate villages are also in a kind of meta competition, guns, germs, and steel.
Anyway, I never wanted this to be an open-ended crafting game where you just freely explore the tree of content to your heart's delight. It's supposed to be hard. You're supposed to claw you way up to each accomplishment, and barely get there.
Like, I finally got a steel ax in my lifetime, but I neglected my babies along the way, so I died alone, and the ax that I made was lost in the wilderness. Next time, I'll be even better at managing this process, and there will be a future generation to pass my ax onto.
All that said, hard and tedious are two different things. Tedious, to me, is being forced to manually execute a rote, seemingly-automatable process, with no important decisions along the way.
Eating from an infinite berry bush every 24 seconds is tedious. A robot could do it way better than you can.
I don't think it's simply a matter of "eating isn't fun, but crafting is fun." Eating isn't fun if it requires no thinking. Hard eating---eating as an eventually-impossible time and resource management puzzle, is as "fun" as any other challenge. I just need to figure out how to make it so.
Working on some fix here.
The current idea is the truly infinite but non-portable berry bush.
When you click on it, even if you're holding a tool, the game assumes that you wanted to eat your fill from it, and it fills you to 100%.
You can also pick a berry from it (in addition to filling up), and carry it with you, but it only fills you 1 bar.
And all foods stack. Eating three lone berries in a row (from your backpack, for example), will fill you up to 3. Eating two carrots in a row will fill you up to 12. Adding a rabbit on top of two carrots will fill you up to 20.
The effect of this is threefold:
1) You don't have to "babysit" your character near a berry bush and constantly feed them while working.
2) You can venture a bit further afield while just eating berries at home, assuming that you make it home safely.
3) Other types of food are ONLY useful when traveling away from home. There is absolutely no point in cooking a rabbit next to a berry bush. But, if you're venturing into the swamp or desert or prairie, you'll need to bring some portable foods like rabbits or pies (or whatever else) with you. The kinds of foods you bring with you will be a matter of life and death.
So, the berry bush kinda becomes a symbol for a fixed-location gathering lifestyle. You can survive forever on it, but only here.
And at home, there's nothing to fear, and very little babysitting to do. Even if you're cold, you can go a full two minutes between feedings. If you're warm at home, you can last a full 6:40 between berry bush visits.
3) above is interesting, because it kinda feels like a big change, but I think that 3) is already true in the current game. If a berry bush is near, you'll babysit your character and keep going back for berries rather than eat rabbits, because they are so much more work. So there's already a "loophole." Might as well make the loophole big enough to drive a tank through, and eliminate the tedium of feeding every 24 seconds.
But it's always been true that there's no safe way to travel without better foods. And that's still true.
Instead of bundling up all the code and all the data for a UnixSource update each time there's a new binary release, I'm trying out a new distribution method.
The Source bundle now just comes with a tiny script that pulls from the main, public mercurial source repositories.
It automatically builds the latest version for you based on the repository tags.
Linux folks, please give it a try (follow your original download link) and let me know if you have any problems.
You have to install mercurial, of course.
What average lifespan per player are you assuming here?
Looks like you may have it set at 60?
Wow, sweet!
Ain't javascript grand? Too bad its too slow for more elaborate games...
Well, the problem with 0% as the lower threshold is that the population will remain spread, forever, no matter what, after it starts spreading. So if it dies down to only 5 players, there will be one on each of 5 servers. At that point, they should obviously be together on one server.
I'm trying to make a system that doesn't require any manual babysitting.
Well, those numbers look reasonable to me.
I do want the majority of players to have a "full server" experience, and have the "desolate server" be a more rare experience.
In your last case, where the population falls to 513, we have 72% of the player population on very full servers, 14% on an almost-half-full server, and 12% of players on desolate servers.
An even spread across all 7 servers would put 100% of players on an almost-half-full server. But trying to maintain an even spread no matter what would mean that sometimes the entire population of players experiences more and more desolation. In the case of a dip in population, we really want to consolidate somehow and bring the remaining people together onto the same server.
The reflector currently has two main parameters;
startSpreadingFraction and stopSpreadingFraction
The first is the fullness threshold on a given server where we start spreading it's players 50/50 with the next server on the list, and the second is the fullness we need to dip below to stop the 50/50 spreading (in which case, servers further down the list would get no new players).
Can you run your sim with various parameter settings and take some measurements?
Like, number of lone eves? Number of times a server gets cut off from new babies and dies off completely?
Currently, the reflector is using 50% and 10%. Maybe other settings are better.
Also, if we count the number of servers that are currently being spread to, we can spread with different splits along the way (instead of 50/50 at each step). Like with 7 servers, the first server should send 6/7 to the next server, and that server should send 5/6 to the next server and so on.... I that should put 1/7 on each.
Yes, the front server starts with a higher pop, so during a boom, it will keep a higher pop, but only for an hour max, until those people die. After that, each server will have 1/7 of the population.
We could still keep the stopSpreadingFraction, and once the 1/7 amount dips below a threshold, we start letting extra servers die off and focus new players onto the remaining servers.
But I'm not sure if that's better.... maybe there's something good about keeping the top servers more full.
We can either give most players the better experience, at the expense of some players having a less good experience, or give everyone the same mediocre experience.
The equality version obviously can't be gamed as much through custom server picking (i.e., ignoring where the reflector tells you to go), because all the servers are more equal (though the main server will still have the oldest civilization, always).
If you look at the reflector/server.php code in the source, you'll see the current algorithm, which works like this:
1. In general, always send people to the main server. This server is currently set to support up to 200 simultaneous players before new players are rejected (but that number will likely change once we actually get a crowd of people on there... maybe more than 200, maybe less).
2. The other servers (there's currently only one, but I can bring up others as-needed with a few mouse clicks) are all "secondary" servers, only to be used in the case of the main server getting full. Furthermore, they are tiered, so the third server is only used if the second server gets full, etc. As the population declines (like at night, when people are sleeping), the secondary servers will no longer be used, and everyone will be on the main server.
3. The balancing alg works like this, assuming that each server has a 200-player hard cap:
A. If the main server has less than 20 players, set its spreading flag to false.
B. If the main server has less than 100 players, and its spreading flag is false, send new players to main server.
C. If the main sever is 95% full or more, go to E.
D. If the main server has more than 100 players, or if its spreading flag is true, set its spreading flag to true, then flip a coin for each new player and send 50% to the main server, and for the other 50% go to step E.
E. Look at the next secondary server down the list.
E2. If the secondary server has less than 20 players, set its spreading flag to false.
E3. If the secondary server has less than 100 players and its spreading flag is false, send the player to it.
E4. If the secondary server is more than 95% full, return to step E for the next secondary server.
E5. If the secondary server has more than 100 players, or its spreading flag is true, set its spreading flag to true, then flip a coin and send 50% of players to it. For the other 50%, return to step E for the next secondary server.
Once the population reaches a certain threshold, we start spreading players evenly to the next secondary server, resulting in these two servers reaching even population sizes over the long run. But once the balanced populations get too low, we switch out of "spreading mode" and stop sending new players to the secondary server entirely, and it becomes a "Children of Men" scenario while the last generation of people live out their lives there.
This works similarly when the population is big enough for three servers. We keep spreading them evenly until the spread population drops below the 20 threshold, and then suddenly stop spreading them.
Actually, the spread isn't even with three or more servers. Because of the multiplying fractions, only 25% end up on the second and third servers. With 5 servers, the fractions are: 50%, 25%,12.5%, 6.25%, and 6.25%
Of course, this means that in a really heavy population boom, the main server will still reach 95% faster than the rest, and so on down the line.
Maybe it's okay... but the algorithm can be improved to make it more even, someday.
I just realized that you can currently "game" the placement alg at the 50/50 stage by suiciding over and over until you finally land on the server that you want to play on.
I can fix it by seeding the random number generator with your supplied email address. However, the correctness of that email is not currently verified. It could check that the email exists on the ticketServer, but even that's not so great, because you could try known email addresses until you land on the server of your choosing (assuming that the reflector doesn't actually log you in and block other people from using that email address). Even if we verified their account key as well, you could share your email and key with a friend so that you both land on the same server (with modified clients that send separate account details to the reflector).
Well, I guess modified clients can bypass the reflector entirely, so I shouldn't worry about them. There's also a useCustomServerAddress setting that can be used to bypass the reflector without even modding the client.
So, I guess I just need something that will work for the average player who knows nothing about this, to prevent repeat-suicide until you end up in the "old world," because if everyone is doing that, the load balancing essentially doesn't work.
So doing it by email---or even better, IP address---is probably sufficient.
Can you try the old version too?
I think you can get to the login screen before it downloads an update. Like, back to the raw v20 download that's still available.
Also, make sure you install v20 in a different spot so that whatever compatibility settings you sent won't apply.
Put your system-wide scaling back to the default, where you had it before.
So, what exactly is the difference in behavior between these two versions?
Maybe you can run them both in Windowed mode at the same time and take a screen shot?
Maybe turning "useLargestWindow" off in the settings of both would help with this. Then they will both try to open 1280x720 windows, and it will be easy to compare them in your screen shot.
For what it's worth, I'm now calling SetProcessDPIAware, if it's available. It's a Vista thing, so I thought it would be the most compatible way of doing it.
https://msdn.microsoft.com/en-us/librar … s.85).aspx
Though maybe the "unexpected behavior" in later OS's is real!
This is another test comment. Will it show up in Discord?
Will this show up?
Hopefully, the entire post body will be there.
Yeah, it doesn't seem like comments here are showing up in discord.
Well, this seems to be working for now. Hopefully the bot will stay online for a while.
If it ever goes offline permanently, I could potentially install it myself from source on my own server. For future reference:
This is just a test post. It should show up on Discord in about 10 minutes.