158 lines
6.5 KiB
Markdown
158 lines
6.5 KiB
Markdown
## What this is about
|
|
|
|
<img alt="Screenshot" id="screenshot" style="float: left; padding-right: 2em;" src="img/screenshot_med.png"/>
|
|
MicroWorld is a rule driven cellular automaton. What does that mean? Well, it's
|
|
a two dimensional world made up of squares called **cells**. The world develops
|
|
in steps, and at each step, each cell is modified by applying the rules.
|
|
|
|
[Go and watch](world) it running for a few moments, then come back here.
|
|
|
|
The demonstration world is a mountain, with snow at the top and the sea at the
|
|
bottom. as you watched, you probably saw the bright green of grass on the lower
|
|
slopes of the mountain turn to the darker green of forest. You may have seen
|
|
some forest fires break out.
|
|
|
|
That's all controlled by rules. You make the rules. To start Noah's flood,
|
|
[go to the rules page](rules) now, and add this rule at the very top:
|
|
|
|
if altitude is less than 200 then state should be water
|
|
|
|
then, [go and watch the world](world) again. What happens? You should see water
|
|
spread across everywhere except the very top of the mountain. But after the
|
|
flood, the waters should drain away again. Go back to [rules](rules) and add
|
|
this rule at the very top:
|
|
|
|
if altitude is more than 9 and state is water then state should be grassland
|
|
|
|
Now the world alternates between *new* and *grassland*. That's no good! Go back to
|
|
[rules](rules) and delete the rule that you first added - the one that says
|
|
|
|
if altitude is less than 200 then state should be water
|
|
|
|
And see! The world starts growing again.
|
|
|
|
## What you can do next
|
|
|
|
### Change some rules
|
|
|
|
Change some of the other rules and see what happens. Very likely, one of the
|
|
first things that will happen is that you will get a message like this:
|
|
|
|
I did not understand 'if state is grassland then 1 chance in 10 state will be heath'
|
|
|
|
That means that you changed a rule in a way that the engine could no longer
|
|
understand it. To find out what the engine will understand, have a look at the
|
|
[documentation](docs#grammar).
|
|
|
|
### Invent some rules of your own!
|
|
|
|
What happens when people come into the world? Where would they make their first
|
|
camp? Would they want to be near the water, so they could fish? Would they want
|
|
be near fertile grassland, to graze their sheep and cattle?
|
|
|
|
__Write a rule which adds some camps to the world__
|
|
|
|
What happens to the land around a camp? Do the people burn down forest to make
|
|
new grassland? Do they convert the grassland into meadow, or into crop?
|
|
|
|
Does growing crops reduce the soil fertility? What makes people decide that their
|
|
camp is a good enough place to build a proper house?
|
|
|
|
__Write some rules which describe this__
|
|
|
|
How many squares of meadow or crop does it take to feed each house full of people?
|
|
What happens when there are too many houses and not enough fields? Can houses
|
|
catch fire? What happens to a house which is next to a fire?
|
|
|
|
How many houses do you need for a market place? Where would people build a
|
|
harbour?
|
|
|
|
### Change the rules completely
|
|
|
|
I've provided rules which use the MicroWorld cellular automaton to make a simple
|
|
model of the changes to land in Europe after the ice age. But you don't have to
|
|
use it like that, at all.
|
|
|
|
[Conway's Game of Life](http://en.wikipedia.org/wiki/Conway's_Game_of_Life) is one
|
|
of the famous uses of a cellular automaton. The rules for the Game of Life are
|
|
very simple. To set up your game of life you'll need some initialisation rules,
|
|
one for every cell you want to start live (we'll use _black_ for live, and
|
|
_white_ for dead):
|
|
|
|
if x is equal to 4 and y is equal to 4 and state is new then state should be black
|
|
|
|
Add as many of these as you need for your starting pattern. Then add a rule, after
|
|
all those:
|
|
|
|
if state is new then state should be white
|
|
|
|
I'll leave you to work out what the rules of life are for yourself, from the
|
|
Wiki page I linked to.
|
|
|
|
**CHEAT** _You'll find other rule sets you can explore if you go to the_
|
|
_[Parameters](params) page_.
|
|
|
|
### Change the engine
|
|
|
|
If you want to modify the engine itself, you will need
|
|
[Leiningen](https://github.com/technomancy/leiningen) 2.0 or above installed on
|
|
your own computer, and you'll need to download the source, and unpack it.
|
|
|
|
You will find that there are three packages:
|
|
|
|
+ __mw-engine__ deals with creating worlds, and transforming them;
|
|
+ __mw-parser__ deals with turning the rule language into something the engine can work on;
|
|
+ __mw-ui__ is the web site which provides you with a user interface.
|
|
|
|
For each of these packages, you need to run, in the root directory of the package,
|
|
the following command:
|
|
|
|
lein install
|
|
|
|
Once you've done that, you'll have everything built. To start a web server for
|
|
the application, run the following command in the _mw-ui_ directory:
|
|
|
|
lein ring server
|
|
|
|
Now you have it working, you can start changing things.
|
|
|
|
#### Add states
|
|
|
|
Adding new states is easy:
|
|
just add new tiles in _mw-ui/resources/public/img/tiles_. The tiles should be
|
|
png (Portable Network Graphics) files, and should be 32 pixels square. The name
|
|
of the tile should be the name of your new state. It's good to also edit the file
|
|
_mw-ui/resources/public/css/states.css_ to add a class for your new state.
|
|
|
|
#### Change the code
|
|
|
|
Once you've done all that, you're ready to be really ambitious. Change the code.
|
|
Implement some new feature I haven't thought of, or fix bugs I've accidentally
|
|
left in.
|
|
|
|
You'll need an editor. I recommend either [NightCode](https://nightcode.info/),
|
|
which is quite small and will run on a Raspberry Pi, or
|
|
[LightTable](http://www.lighttable.com/), which is extremely helpful but needs
|
|
a more powerful computer.
|
|
|
|
#### Worthwhile projects
|
|
|
|
If you would like to work on the engine, there's things that would be worth
|
|
improving:
|
|
|
|
1. Better arithmetic in actions
|
|
2. Better arithmetic in conditions - it would be useful to be able to say _'if generation is more than 64 - y then state should be snow'_. This would make the ice retreat in the right direction in the iceage rule set.
|
|
3. Better error messages when rules don't parse, explaining where the problem occured _(very hard)_.
|
|
4. Make this all work in ClojureScript in the browser, so there's less load on the server and one server can support more users _(quite hard)_.
|
|
5. Optimisation: MicroWorld runs quite slowly, you can't really do big maps and one server won't support many users. There must be many ways performance can be improved.
|
|
|
|
If you make changes which you think improve MicroWorld, please [mail them to me](mailto:simon@journeyman.cc).
|
|
|
|
Have fun!
|
|
|
|
## License
|
|
|
|
Copyright © 2014 [Simon Brooke](mailto:simon@journeyman.cc)
|
|
|
|
Distributed under the terms of the
|
|
[GNU General Public License v2](http://www.gnu.org/licenses/gpl-2.0.html) |