The subject of this post is the result on today's pre-alpha work, but since I have a lot of new and updated features, I decided to make it a feature post. And stay tuned for an Irrlicht rant.
First I must explain the four core needs of a dwarf. While dwarves haves a lot of statistics, nothing is more important than: energy, food, alcohol and water. All these core needs are numerical values that express how much said need is satisfied, so the higher they are, the more time the dwarf can do other stuff before they must replenish these needs. Every second of in game time, these values decrease, roughly with a value equal to the unit. The good old 1! But each dwarf has his/her own rate of needs decay, generally withing the range of +/-5%. So needs decay with values between 0.95 and 1.05.
Energy tells you how much a dwarf can work. Even idling tires a dwarf slowly and eventually the dwarf will have to go to sleep. Every dwarf has his own energy decay rate. Doing physically tiring tasks will deplete energy faster. So every second, the dwarf's energy will decay by personal decay rate + task difficulty penalty (adjusted by the skill level and perks). Like all needs, reaching the value of zero does not mean game over. Zero energy simply means that the dwarf's body has spent the energy reserves it is used to and would normally stop working. But the dwarf can go into negative if needed. Zero energy is you, if you had a physically challenging job, and you just got home after a particularly hard day. A moderate amount of negative energy is still you from above, but after getting home you went to the gym and did a killer work out. A high amount of negative energy need is you, if after the work out, you had to fight an army of ninjas and came out victorious. The dwarf will certainly feel that he is in negative the next day, being sore, grumpy, having to sleep longer and still being less productive. But the system is not designed to be punishing. It is designed for the case when the immediate survival of your fortress depends on the execution of a long task. You give the order, the dwarf checks out his energy levels and says to you "I would really like to go to bed in 5 minutes. Is this task going to take me less than 5 minutes? No? Well, see you tomorrow!". And then you die. But with this system dwarves can go into negative, but almost always will just go a little bit in that direction. In case of emergency, they will work their ass off. If a dwarf still has positive energy when he starts a task, his honor will dictate that he finishes it, even if he falls over when it is done. After a full night's of sleep, a dwarf will always be at 100% energy, i.e. enough energy to idle for about 20 hours.
This is the model for energy that I will be using in 0.1, and if I do not get a better idea, for several versions from now on. It is a system for the ages!
Food need is similar but won't make it in 0.1. Just to give a few details, the food need behaves similar to energy. Once we get to negative values and the dwarf is not very busy doing something urgent, he will take a break and go eat something. Dwarves can either eat when they are hungry, or if you designate an official group meal time in your great dinning room, dwarves will wait until then, unless they are starving. Having official eating events will cause the dwarves to plan their tasks around these hours (thus being slightly less productive), will take longer eating (thus being slightly less productive), but will socialize, make friends and their morale will rise. If no food is available, once the dwarf gets desperate, will try to eat raw a plant from nature, even if it is not edible. The plant will be destroyed and the dwarf may get sick. If no plant is available, the dwarf will try to kill a pet. Or even a fellow dwarf. And different foods have different nutritious values. With high quality cooked food, a dwarf will eat twice a day and be happier, while with raw/low quality food, he will eat 3-4 times a day and have average happiness. Not eating for about 4 days will kill the dwarf. Since they are so resilient physically, they also need a lot of food. There is chance that the dwarf will wander off in search of food if starving, leaving the fortress forever.
Water need is identical to food, except that you can not designate official drinking times in the great dinning room and eating will often cause the dwarf to replenish his water and alcohol needs too, without taking extra time. As long as the dwarf took a break to eat, he might as well take a drink too. Water need has desperation actions similar to food need, but with natural water sources. I'm not sure about desperation kills and drinking of blood. A dwarf will dehydrate in about 2 days and die. Water need is planned for 0.2.
The more interesting need that is tightly related to water need is the alcohol need. After so many generation of alcohol consumption, the dwarf's need for alcohol is passed down genetically from one generation to the next. While a dwarf may seem tipsy or even drunk, especially to other races, they actually can't get drunk in the traditional sense of the word. Their clarity of though is only mildly reduced by alcohol and their hand eye coordination only improves. There is a critical point where this improvement stops, drastically reverses and the dwarf is practically completely smashed, but they have long since fallen asleep by then. On the other hand, not drinking alcohol regularly causes them to become slow, clumsy and depressed. These effects will worsen, up to a 60% acquired slowness (tasks will take 60% longer to finish), but a dwarf can't die from alcohol withdrawal as long as they don't die from thirst. Satisfying at least 75% of you water need with alcohol will keep your alcohol need at 100%.
So this is the theory. Let's get to the features!
Energy system reworked
The above described energy system has been fully implemented. The other three needs were added, but they don't decay. I had energy system and decay in place for a while: see the videos with dwarves going to bed after they dig. The old system had some caveats though. Only dwarves who did something suffered energy decay, while idle dwarves would never need to go to bed. And energy was taken in one huge chunk at the start of the task. This is fixed now: all dwarves suffer form energy decay and the decay is gradual. Every dwarf has his own personal energy decay rate (which will be passed down to offsprings).
Digging operation fully realized energy wise
When doing a difficult task, to the personal energy decay rate you add a penalty based on the difficulty of the task. This penalty is zero for all tasks except digging. The reason for this is I only bothered implementing the new system for wall digging. Other actions will follow as the pre-alpha progresses. The dwarf's mining skill now has an impact on digging. Skills range from 0 to 20, but all dwarves start out with a skill of 5, meaning they are dabbling. I'll detail the dwarven education system some other time and explain why they all start out at level 5. Skill 5 is essentially skill zero, giving zero advantages. But as skill level increases, the mining skill will reduce the penalty energy decay (only when mining). At skill level 20 the penalty will be zero. The skill level also influences the time needed to finish an operation. Digging though soil takes one hour and has only a 25% penalthy. Digging though rock takes two hours and has 100% penalty. A skill of 5 does not effect this time and a skill of 20 reduces the time by 15%, with 1% per skill level. A dwarf with skill under 5 can not dig.
Dwarf inspection panel
With all these needs and a lot of stuff going on at once, it can be hard to keep focused. So I added this small panel:
This panel will grow based on the number of dwarves you have, but never be large enough to cover the small button in the corner that opens the options panel. It lists all dwarves, with their image, nickname, and four bars. Each bar represents a different need: energy, food, alcohol and water, in this order. They are color coded. These bars will grow or shrink in real time:
And in the corner, besides each dwarf, you will get a little status string. Right now it only shows which dwarf is sleeping:
I will extend this status to show what each dwarf is doing.
You may have noticed that some panels now have textures. This is phase one of bringing the panels on par with the concept art I never got to show.
Fixed sleep scheduling bug
There was a long standing bug in the sleep scheduling algorithm. I suspected the presence of the bug for a while now. I think even in the videos you may notice a sleeping dwarf changing beds. But the bug was more severe than that. The game checks the list of idle dwarfs to determine if there is a good candidate to put to sleep and if there is, proceeds to schedule the choosing of beds, path finding, occupying and other book keeping operations. During this process, due to a very subtle and hard to find bug, the candidate dwarf was lost and replaced with the first idle dwarf.
Fixed mouse selection bug
When interacting with the map, you update the current selection with the mouse. I found a new bug here. First, I was scared that during the Irrlicht GUI elimination I broke mouse support, but actually the problem was caused by the fact that I am allocating a larger map than it is used. Bug fixed now, but the fix is not ideal. Added task to fix this properly: planned task #1.
During world creation (manual or automatic), all dwarves without nicknames will get a random one. The game usually presents you information about the dwarves using their nickname, so having an empty string instead of a nickname does not help. Nicknames will be changeable at any point in the game. Normal names are long and hard to pronounce, so having you dwarves called Mike and Joe helps a lot. Or if you are pragmatic, M1 and M2 for your miners.
Never wait for sleepersImagine the following scenario: all you dwarves go to bed at roughly the same time. You are stuck waiting for minutes until the in game hours have passed and your dwarves are awake again. Not a problem! If the current time compression is x1 and all your dwarves are sleeping, time compression will change to x180. As soon as one of them wakes up, time compression returns to x1. This way you don't miss anything and you don't have to grab a sandwich. Alternatively, I could pop up a window: "All your dwarves are sleeping. Would you like to skip tot he next event?". And clicking yes would warp you to the moment the first dwarf wakes up. Using time compression seems more natural, for now at least.
Reworked status barThe status bar now displays the number of idle dwarves. If this is more than zero, it will use the color red. I shrunk the pause button, since most people will be using the keyboard shortcut to pause (space). The button looks ugly because I am using ASCII art (|> and ||) to represent "play" and "pause". My buttons do not support icons yet.
Here is a video showing the panel and energy decay in action: