boolean move(Game game)
	{
		// creature has not moved
		boolean moved = false;

                // move away from other creatures randomly if too close
                moved = repulsion(game);

                // if existing goal is not reachable, ditch that goal
                if (fCreature.getGoal() != null &&
                      ! Reachable.dirtyReachable(game, fCreature.getShape(), fCreature.getGoal(), fCreature.getSize(), 0.5))
                {
                   fCreature.setGoal(null, game);
                }

                // if the creature has a reachable goal move towards it
                // may also be set by faction
		if ((! moved) && fCreature.getGoal() != null)
		{
			moved = fCreature.moveToGoal(game);
		}

		// does the creature have a goal?
                // If not, set one
		if ((! moved) && fCreature.getGoal() == null)
		{
                         // where to look for new goal
			Rectangle2D bounds = game.getMap().getTileAt(fCreature.getLocation()).getArea();

			// pick random goal point within same tile
			double x = bounds.getX() + (bounds.getWidth() * fRandom.nextDouble());
			double y = bounds.getY() + (bounds.getHeight() * fRandom.nextDouble());
			Point2D goal_pt = new Point2D.Double(x, y);

			// check that this point is within a room. not occupied by another creature, etc
			if (CollisionDetection.canOccupy(game, fCreature, goal_pt))
				// all conditions passed, set a new goal
				fCreature.setGoal(goal_pt, game);
		}


		// if the creature hasn't moved towards a goal, make it move randomly
                    if (!moved){
			double theta = fRandom.nextDouble() * Math.PI * 2;
			moved = fCreature.move(theta, game);
                    }

		return moved;
	}