OK, here''s the setup... I''m trying to model the growth of a fantasy city. Essentially it starts off with a castle in the middle of nowhere, and over time peasants move to the city and build houses outside the castle. Some peasants are skilled workers who also build shops/farms/mines so on and so forth. Also, as peasants travel back and forth between buildings (generally where they work and where they live) roads "appear" along those routes.
Here''s the question... I need some thoughts on how to decide where newcomers build. I know what I want to use as criteria, but the programing/data structures seem to be eluding me. For instance, I would like to take into account factors like "Have a lot of people been building nearby lately?", "Are there a wide variety of interesting businesses nearby?", "Is the income/standard of living high in this area?".
Currently I have a set of functions that will evaluate a specific location based on these factors, and I just sample random locations on the map until one of them gets a high enough score. There must be a more "directed" approach though... Any ideas?
You could always just keep track of what/how each person is doing in the city through structures or classes. You could keep a bool to keep track of their working. After a certain amount of time of not working, the bool becomes FALSE. This way, you could create a function that searches through everyone''s BOOL. This, however, may be slow because every person in the city would need a timer. But computers these days are pretty good at handling things like this. Good luck on your game.
"Remember, I'm the monkey, and you're the cheese grater. So no fooling around." -Grand Theft Auto, London
You could divide your map into a grid. Each of the squares holds a value for how much a farmer wants to build there. Whenever a new building is built it affects the surrounding squares. For example if a school is built more people would want to settle down around it, but whenever a farm is built it decreases the surrounding area, effectively preventing over crowding.
When the farmer wants to build a home it searches the grid for the best place and then starts to build there.
If different people have different needs you could divide have more than one value at each position. The values are then summed together with weights to tailor the need for the person looking for a place to build.
Reminds me off a few game engines I was writing a while ago. My ones used real locations (if I ever use an array it is only for ease of making terrain, but preferably no array based map at all). What this means is that all of the locations are in either long or floating points. This makes the game look better, play better (use more processing unfortunately) and a hell of alot easier to program certain aspects. If you ever need to calculate the distance in the real location, just use Pythagoreus'' theorum (don''t bother to sqare root numbers unless necessary in comparisions, just leave them as square as it is a bit faster). If you are using an array, just use the x offset of the two points of the array (how many blocks between them) and multiply it my lets say 50 (if each block in the array is too represent 50 meters., then do the same for the y and again use Pythagerous.
Now that the techinical bit is over with, this is my method (simplified as I also had many other biological, mental physical and environmental effects.
This is the basic theory behind the method.
Firstly, you have your castle. You would also have your resources such as rivers, flat areas, forests, big smegging cliffs, and oceans. You may also designate where certain things go (like maybe armouries, prefaetures and guard houses.
Now lets say you have fishermen in your supply. Since they are civilians, they would probably want to be rather close to the castle, but on the other hand, they also need to be near the sea or rivers. So you would use a range on them to the targets. Most likely the location of water is best, so just a simple distance of probably <100 meters is sufficient, and in a buildable place.
Now your farmers will require a certain amount of flat land, and a supply of water. So they will need a large space, and proximity to rivers (not salt water). They can be placed close to forests, although the phsycology of a farmer is to build in the flat areas first, and near a forest only when necessary (as they can just chop down the trees). The river should preferably be passing through the farm. The buthcher the baker the candlestick maker would want to be located within a close proximity to the castle, and preferably the praefactures or guard houses, but not too close to them as it migth be a bit of a turn down to the people. They would probably also develope near existing houses and shoppes. The shoppes (the butcher the baker the candlestick maker) would then inturn develope around the houses if new ones cropped up and so on.
Woodcutters/tree fellers would develop near forests. Armourers would appear in towns, in more densely populated areas (count how many houses in an area of lets say <250m) and so on.
Houses should also be allowed to change into shoppes.
(gee, I haven''t spelt shops as shoppes for a long time)