[sugar] Ideas about SimCity gui, turtle graphics, and cellular automata
Don Hopkins
dhopkins
Wed Mar 14 02:50:39 EDT 2007
SimCity in Python will be totally programmable in Python, so what should
we program it to do? And how can we refactor it into general purpose,
reusable components?
Here is an outline (at the end of this message) of some ideas I've had
about simplifying the SimCity user interface and making it more fun and
educational. It should be easy and fun for little kids to use, work well
in book mode with the game controller, support the mouse but not require
it, and enable collaboration over the network with other players.
Instead of (or in addition to) using the mouse to paint with a palette
of editing tools like Photoshop, the interface could be based on agents
like logo turtles that represent the user on the map, which carry around
SimCity editing tools that they can draw with. When you throw in a
visual programming language, it leads the way to a Robot-Odyssey-esque
version of SimCity!
This is one reason I want to have a nice plug-in visual programming
language!
Just for fun, and for the enjoyment of cellular automata freaks and von
Neumann fans, here is a nerd toy I wrote in OpenLaszlo (a von Neumann 29
State CA editor and simulator), with a cellular automata grid editing
tool that you can move around over the grid and edit the map like an
agent or logo turtle, using the keyboard or mouse. It's a half-baked
experimental user interface, so I'm not claiming that it isn't bizarre
or doesn't suck, but it does demonstrate some ideas that might be
applied to the SimCity user interface.
John von Neumann's 29 state Cellular Automata Implemented in OpenLaszlo
http://www.donhopkins.com/drupal/?q=node/41
Full window demo in Flash player:
http://www.donhopkins.com/lzxnet/my-apps/vonNeumann/vonNeumann.lzx?lzt=swf
Source code:
http://www.donhopkins.com/lzxnet/my-apps/vonNeumann/vonNeumann.lzx?lzt=source
The arrow keys move the tool, space clears the cell under the tool, the
letter diamonds "wasz"/"rdfc" make an unexcited ordinary/special
directional arrow cell in the corresponding direction, and "WASD"/"RDFC"
make excited versions of those arrow cells, other letters and numbers
are for miscellaneous states, and so on. The "." key advances the
current cell to the next logical state, so you can toggle the excited
state of any arrow cell in a standard way without changing its
direction, or cycle confluent cells through their four states. Clicking
the mouse on the tool pops of a pie menu with submenus of all possible
states organized by category (some of which arrange naturally into pie
menus, because they are directionally oriented). Clicking the mouse
anywhere else moves the tool to that cell. The goal is to be able to
quickly key in a cellular automata configuration, as well as randomly
accessing and editing it (even while it's running).
[I'm not going to attempt to explain how the CA itself works (just press
"Run" and enjoy the blinking lights), but it's based on one of my
favorite classics: John von Neumann's 29 state CA rule, which he
specifically designed (on paper!) to program self-reproducing machines.
The source code has some good references and obtuse comments! Sadly, the
Flash player is way too slow to run enough cells to actually house a
complete self-reproducing machine (and its offspring, and their
offspring...) in their full glory and splendor. Fortunately I do have an
efficient C++ implementation of that rule (and others), as a Python
extension! Once we have a good tile display/editing engine in Python, it
will be fun to hook that code up to drive it, and efficiently run huge
self-reproducing cellular automata!]
For hard core cellular automata freaks: Hit "Next" a few times till you
get to "Autoinitializing Exclusive Or", then hit "Load" then "Run", to
see a cool self modifying cellular automata bootstrap! A special signal
of 5 excited states in a row goes through first, which initializes the
circuit, ignites all the pilot lights and synchronizes all its internal
clocks at just the right time and phase, and then cuts off the ignition
circuit (blows the explosive bolts so to speak, with construction
commands) so the circuit is only initialized once, and subsequent
signals flow through the normal part of the circuit. In this case, the
circuit performs an exclusive-or (which is easier said than done in this
rule, requiring synchronized clocks), two of which are needed to cross
two signals without interfering. The point of all this, is that machines
in this CA rule can only construct other machines in the powered-off
state (or they might get electrocuted ;-), so there has to be a way to
turn a machine on and start all its clocks ticking by
"autoinitialization" -- self modifying CA code! The self-reproduction
process has two phases: first build a copy of yourself in the
powered-down ready-to-initialize state, by scanning back and forth with
the builder arm like an ink jet printer, programmed from a huge spiral
of memory (the machine's dna). Then once you're done, dock your
construction arm into the new machine's naval at the base of it's memory
loop (like an umbillical cord for data), then switch into playback mode
and loop all your memory back through, injecting a copy of it into the
duplicate's memory loop. Then send a start signal to initialize the copy
and start it reproducing itself. This stuff was described (and
illustrated ;-) in a paper by William R. Buckley and Amar Mukherjee. The
examples in this demo show different ways to effect a signal crossings
(with different advantages and disadvantages). Some (like the real time
crossing) are not "constructible", and some have interference problems
(like the coded channel crossing), and some are enormous (like two
autoinitializing exclusive or's). Of course people have come up with
much more efficient rules since then (and that is a fun game too), but
John von Neumann's 29 state rule is classic coke, the real thing.
-Don
Redesigning the SimCity user interface for the OLPC
Don Hopkins
Visual Programming
Simplify the SimCity interface and make it easier for kids to
use it with the game controller, in a way that will support
multi player interaction.
Collapse the separate concepts of game editing tool (bulldozer,
road, residential zone, etc) and agent (sprites like the
monster, tornado, helicopter, train, etc).
Agents with specialized tool represent different roles that kids
can play. A bunch of kids can join together and play different
roles at the same time in the same city. Instead of having a
bunch of editing tools to switch between, you have a bunch of
different agents you can drive around the map, like using a
monster to crush things instead of a bulldozer, or riding around
in a helicopter to scroll around and observe the map. Make a
meta-game like pokemon trading cards or magic the gathering,
about acquiring and deploying and using agents on the map. Give
agents different budgets and constraints.
Use an agent to represent a user in the world, and control an
editing tool. You see other users in the map driving around
their editing tool agents.
Each editing tool can be associated with a particular agent,
with a keyboard/game controller based user interface for moving
around, as well as a mouse based interface for picking it up and
dragging it around.
The road tool becomes a road building vehicle, that you can
easily move up/down/left/right/diagonally with the game
controller directional input. Requires much less coordination to
draw straight roads than with a mouse.
The bulldozer tool becomes an actual bulldozer that you can
drive around the map, crushing things in your wake.
This makes the game easily usable by little kids in book mode.
Also support small children using SimCity like a drawing tool or
etch-a-sketch, simply doodling with the editing tools for the
visceral pleasure of it, and setting fires and other disasters
to watch it burn and mutate.
Logo Turtles (as a generalization of the monster, tornado,
helicopter, etc)
Implement programmable logo turtles as agents that can move
around on the map, sense it, and edit it.
Like Robot Odyssey agents, so you can go "inside" an agent,
and travel around with it, operate its controls, read its
sensors, and automate its behavior by wiring up visual programs
with logic and math and nested "ic chip" components.
Plug in graphics to represent the agent: use classic logo
turtle and SimCity sprites, but also allow kids to plug in
their own.
SimCity sprites have 8 rotations.
SVG or Cairo drawings can be rotated continuously.
Re-implement the classic SimCity agents like the monster,
tornado, helicopter, train, etc in terms of logo turtles, that
kids can drive around, learn to use, open up and modify (by
turning internal tuning knobs, or even rewiring).
Let kids reprogram the agents to do all kinds of other stuff.
Mobile robots, that you can double click to open up into
Robot-Odyssey-esque visual program editors.
Agents have local cellular-automata-like sensors to read
information about the current and surrounding tiles.
KidSim / Cocoa / StageCraft Creator let kids define visual
cellular automata rules by example, based on tile patterns and
rules. Show it a pattern that you want to match by selecting
an instance of that pattern in the world, then abstract it
with wildcards if necessary, then demonstrate the result you
want it to change the cell to in the next generation.
Sense high level information about zones and overlays, so the
agents can base their behavior on any aspect of the world
model.
Support an extensible model by allowing users to add more
layers.
Add layers with arbitrary names and data types at
different resolutions:
byte, int, float, n-dimensional vector, color, boolean
mask, musical note, dict, parametric field (i.e. perlin
noise or other mathematical function) at each cell, etc.
Edit the world.
All SimCity editing tools (including colored pens that draw
on overlays) should be available to the agent.
Enable users to plug in their own editing tools, that they
can use themselves with the mouse, keyboard or game
controller, or program agents to use to edit the map under
program control.
Robot Odyssey
Build your own universal programmable editing tool.
Roll your own von Neuman Universal Constructor.
Smart robots you program to perform special purpose editing tasks.
The "Painter" picture editing program had a way of recording
and playing back high level editing commands, relative to the
current cursor position.
Remixing. Journaling. Programming by demonstration or example.
You could use a tape recorder to record a bunch of SimCity
editing commands that you act out (or you can just select them
from the journal), then you can play those tapes back with
relative coordinates, so they apply relative to where the
agent currently is on the map. You can copy and paste and cut
and splice any editing commands into tapes that you can use to
program the robot to play back in arbitrary sequences.
Program an urban sprawl development-bot to lay out entire
residential subdivisions, complete with zones, roads, parks and
wires. Then program a luddite roomba-bot that sucks them all
up and plants trees in their place.
This becomes really fun when we let players plug in their own
programmed zones for the robot to lay out, and layers of data
to control the robot's behavior, out of which they can program
their own cellular automata rules and games (like KidSim /
Cocoa / StageCraft Creator).
More information about the Sugar-devel
mailing list