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;
    }