public boolean tick(double speed) {
		// XXX note that we use inGameStateNextFrame here, because this is an
		// indication of whether the timer should exist for the upcoming
		// frame.  However, another timer in the timer set may change the
		// state, so there's actually a race condition here.
		if (parent_state!=null
		&& !eng.inGameStateNextFrame(parent_state)) return true;
		if (parent_obj!=null && !parent_obj.isAlive()) return true;
		if (running) {
			if (frames_left <= 0) {
				frames_left=frames;
				alarm();
				if (one_shot) return true;
			} else {
				frames_left -= speed;
			}
		}
		return false;
	}