Game Design, Programming and running a one-man games business…

Democracy 3 and rendering crisp text in directx

Democracy 3 is a text heavy game. Text and stats, and graphs. So it’s pretty important it is all legible. I’ve spent the best part of two days monkeying around with my text rendering code, which is part of my library (all written by yours truly), trying to get better results. My aim is obviously easy readability. here is some text from the current (Democracy 2) game: (excuse the bitmap format but obviously I don’t want to add artifacts here…)

oldtext

And here is the current implementation in Democracy 3 (different color scheme too).

newtext

I think the second example is marginally better, but frankly that’s just a better color scheme and bigger text. the actual *quality* of the text is certainly nothing special. What I want, clearly is something as good as the text I see windows drawing in webpages and text documents outside of games. Unfortunately, that isn’t as easy as it sounds.

Most LCD monitors are set up to use cleartype, information on wikipedia. This is a cunning system that effectively increases the screen resolution by using colored ‘sub-pixels’, You can see the effect by taking a screen grab of this page (for example) and then zooming in really close. You will notice this text isn’t really black, or indeed one color. Some sort of cool display/monitor-driver cleverness handles this when it displays text. The trouble is, you can’t just ‘enable’ that for a game drawn the way I do things, where each character is effectively a tiny sprite. It just can’t be done.

Now there ARE some clever solutions to get amazing text, I know valve have some clever system, but this all involves implementation of a bunch of third party code and shaders. That isn’t a big deal *as such*, but it means that I have to cannibalize my extensive current GUI library and font loading and text-wrapping/aligning/processing stuff to work with all new systems. This would be a ton of work, and increase the spaghettiness of my library, something I am keen not to do.

I have tried just doubling my bitmap font size and using mip-maps to scale it down, but if anything that looks worse, so I’m trying to keep to my current system, which uses a 1:1 pixel to texel mapping with point filters engaged to get exactly what I see in my font bitmap file.I have a horrible feeling that swapping to black text on white screens is just going to look far worse than white text on black, at least from a  text-crispness POV.

There is of course, also the issue of opportunity cost. Is more time spent on this a good idea when I could spend that time elsewhere in the GUI, or for that matter, the simulation or game balance. Democracy 2 never earned me anyone bemoaning it’s crappy text, maybe the new text is good enough? Developers – What system do you use for text-rendering in games?

edit: maybe this black version looks better?

blacktext

More Democracy 3 simulation fun and games

The core mechanic of Democracy 3 is going to take a lot of careful explaining in tutorials and tooltips and help windows. Essentially, it’s pretty simple, in that you implement policies, and you can adjust the intensity of a policy using a slider. So with a policy like income tax, the slider adjust the rate of tax from low to high. A series of bars show you the effect this policy has on everything, such as voter happiness, GDP, and so on. Sounds simple so far right? This is where it gets complex because there are three additional factors, which are implementation times, effectiveness and inertia. I’ll explain each one:

Implementation times is the amount of game time it takes to introduce a new policy. For a new tax rate, it’s instant, but for a space program, it might be five years. The policy effect fades in over those five years. So for example, if you set the slider to maximum, and the effect on GDP is +10% at maximum, then one year after introducing the policy, all the effects are still only at 20% of their maximums, and the GDP boost is thus 2%. Implementation rate is also the rate at which you can adjust a policy. Again, with tax rates it’s instant, with big infrastructure projects, you might move the slider from 0.5 to 1.0, but it will gradually make it’s way there over time, and the effects will scale accordingly.

Effectiveness is a general multiplier for all of the effects of a policy, and this is based on the minister in charge of that department. He can be bad, reducing its effectiveness, or good, which boosts it. Over time, all ministers get more experienced, so their effectiveness will go up.

Inertia indicates the extent to which policy effects lag behind implementation. For example free school meals increase total population health, but it’s a very slow effect, over time as school children grow up, and maintain those healthy eating habits. So the effect may have an ‘inertia’ of ten years (Should be longer, but for gameplay reasons…). This means that even though the policy is fully implemented, it’s full effects aren’t being felt yet, and also, when the policy is cancelled, the effects may linger on afterwards, slowly declining.

Combined together (and this is just part of it), it’s uber-complex and subtle. It means that at any one time a single policy may be becoming more effective as it gets more implemented, and more so as it’s minister learns the ropes, whilst at the same time be drifting towards lower values as the effects of a policy change since it was introduced take effect, and at the same time as all this, the various effects it has may all have different rates of ‘inertia’ and thus be shifting in different directions :D

Fortunately I’ve learned a lot of stuff about GUI design from earlier games. I’m sure it will be fine :D

 

More about the complexities of Democracy 3 income…

Wealth is a complex thing in Democracy 3. far more so than before. I’ve been wrestling with bugs in it today which have reminded me how intricate the new income simulation is. How does it work? Well here is a rough synopsis.

Every sim voter in the world (defaults to 2,000 of them) has an ‘innate income’ which dictates basically where on a scale of 0 to 1, they sit on the big income spread. This is their best effort, in an unchanging world, to make money. If you implemented no policies, they had no characteristics, and the world was unchanging, this would be their level of income. Obviously the real world is more complex. The simulated voter is actually a fractional member of a whole bunch (maybe 5 to 8) different voter ‘groups’. For example, to keep it simple lets say the voter is 52% motorist and 33% parent. That might sound weird, but this just makes him an average car user, who maybe has teenage children, so not a ‘hardcore’ parent with multiple infants.

Now the player may have policies in place, or simulation values may exist in the world that affect income for the groups in which the voter is a member. For example, Child benefit may make parents better off, whereas Petrol tax may make motorists worse off.  Because our voter is a member of these groups, we run the equations and work out the combined effect on their final income based on these changes.

income

But it’s not that simple… because we also have policies, situations etc which affect people based on their income. For example income taxes affecting the middle classes, or luxury goods taxes affecting the wealthy. The real complexity hits where someone may be middle-income by default, but the taxes levied on them due to their middle-incomeness actually makes them poor. With me so far?

What this means is that the income calculation has to essentially do this:

Step #1: Work out the extent to which we are poor, middle income or wealthy, based on our innate-income. Using this data, calculate the effects of the policies that affect those 3 groups on our actual income

Step #2: Calculate the effects of all the other groups, such as being a farmer, motorist etc, have on our income, to come up with a final figure for our new ‘adjusted’ income.

Step #3: Given the final income figure, place us in the poor, middle income or wealthy group accordingly, which *may* differ from our membership in step #1.

Why all this grief? Because it is possible, through social engineering to take people whose basic income would be poor, and raise them 9through state benefits) to be middle income, and then reap the benefits of their membership in that social group. For example, middle-income members may get a kick out of seeing a certain cabinet minister in office who sympathizes with them as a group (they like the speeches he/she makes…). This can work, despite the effect that only government policy has put them in that situation in the first place.

It’s a difficult effect to describe, but it’s a real one.  Peoples final income differs from their earned income dramatically due to state policies, and you tend to ‘identify’ with the political view of the income group you are ‘effectively’ in. In other words, you base your views on your take-home pay, not your headline salary.

I’m definitely going to make a simple pong clone one day…

Democracy 3: Voter type income design…

Sooo.. I found myself almost sleepwalking into adding a new feature to Democracy 3. I honestly can’t remember actually making the decision to include it, it just seemed to ‘happen’. In democracy 2, the model for income of voters is fairly basic. You can implement policies which affect different levels of income (luxury goods tax hits the rich, for example), and that would affect the membership of the poor, middle income and wealthy voter groups. So far so good.

But it turns out that life is more complex than that. My example of choice is ‘agriculture subsidies’. In the current game, Agriculture subsidies make farmers happy, and they also encourage people to become farmers (so farmer voter group membership rises). This is accurate, and logical and works well. But it has no actual effect on anybodies personal income. This is clearly wrong. So in Democracy 3, I’ve changed things so that each voter group has an ‘income’ value, and policies (and events) can feed directly into them. You also get an extra tab on the graph, and list of effects to see these things happening.

farmers

So now… Agriculture subsidies have their usual effects, but also they make farmers wealthier. The subtle effect is to push farmers out of poverty, and towards wealth. This may be more logical, and detailed and accurate, but why is it good game design? what does it add?

let’s say you have identified the poor, and farmers as two ‘core’ groups that you will base your support on. They are the bedrock of your voting block, and you will keep them happy. So far so good. One of your policies, as demanded by your poor farming supporters, is higher agriculture subsidies, and so you do their bidding. One of the side effects is now that a chunk of those poor farmers are now not so poor. They start joining the middle income or even wealthy groups, and that brings with it a host of other influences to their thinking (voters are in multiple groups, at varying strengths). Suddenly, there are more farmers thinking ‘hold on, I don’t think I appreciate this luxury goods tax, or inheritance tax. What were you thinking???’. Your policies that subsidized the poor and hit the rich (including those taxes on the rich you levied to pay for the subsidies) are now inadvertently affected the very voters you were trying to help…

it’s a subtle effect, but I think it’s real-world, and also represents an interesting trade off. I see this in British politics a lot. The left were concerned about child poverty and pensioner poverty, so to combat it, we got better provision of child benefit and winter fuel benefits for the elderly. Worthy goals, but they also push up the living standards of parents and the retired. This has side effects. Now, in a time of austerity, the government finds it extremely hard to reduce either benefit. This is the problem of so called ‘middle-class’ benefits. A policy designed to do one thing has had other effects, due to the changes on people’s income.

I think this is an effect worth modeling, and it’s fascinating to see it in game. When trying to make environmentalists happy, all my feed-in-tariffs and grants also make them better off, and suddenly I’m the champion of the wealthy and not the poor. I love trade-offs and compromises like that. They are the key to what makes Democracy interesting to play.

Designing Pressure Groups in Democracy 3

Sooo… the system for pressure groups in Democracy 2 was fairly simplistic in comparison to this. See how this sounds.

There are a host of different pressure groups in Democracy 3. Some are relatively harmless and are mostly a way of registering dissatisfaction by voters. Some of them are more aggressive, some are extremist groups that are actively dangerous to your government. The extremist groups contain the rioters, the assassins, the corporate mega tycoons, fascists and crazies who will try to blow up your presidential car and so on…

Every voter in the game has a predisposition towards militancy. Each group has a required militancy level for people to join it. if you are mild mannered, no matter how upset you are, you will not join the peoples revolutionary army, although you might join the peoples socialist party (for example).

Here is the fun part…

The extremist groups (revolutionary army) have parent groups that are used as a ‘funnel’ into their membership (and that is the only way they get members). So if you are a member of the relatively harmless peoples socialist party, you will, providing you stay angry at the government, get ‘radicalized’ over time. If this radicalization meets a certain threshold, and your innate militancy is high enough, then you become a recruit of the more extreme group. There is also a point at which your radicalization will fall enough for you to quit the extreme group. Only the extremist groups are really worrying.

hamza

I think this is much more realistic, and should give rise to some interesting phenomena, especially ‘lag’. By this, I mean that carrying out an action that really upsets a group of voters (say… a war for oil) will have long term effects because it will push people into radical groups where previously they were happy to just shout slogans. The key is that the ‘leave’ threshold is way below the join one (giving groups some internal momentum) which means that once someone joins the revolutionary army, you need to really cheer them up if you are going to reduce the long term threat and have them leave.

It also means that a large and growing ‘harmless’ pressure group, is a warning sign that you could be looking at an extremist faction developing if you do not take steps to keep that group happy. If the peoples socialist party is huge, you need to be careful what you do to upset socialists further. if it’s tiny, you can probably risk it.

Obviously it will be fun to code stuff like the effects of intelligence services on radicalization, and dilemmas etc. If we arrest a radical without trial, that should accelerate radicalization, as should war. The trouble with this game is it could balloon to be the most complex software in the universe :D