public ArrayList<Tile> iterate() {

        if (!checkOnce) {
            // invert the boolean flag
            checkOnce ^= true;
            if((abs(sx - ex) > range) || (abs(sy - ey) > range) || (abs(sz - ez) > range)){
                this.result = PathingResult.NO_PATH;
                return null;//jump out
            }
        }
        // while not at end
        Tile current = null;

        while (canContinue()) {

            // get lowest F cost square on open list
            current = this.getLowestFTile();

            // process tiles
            this.processAdjacentTiles(current);
        }

        if (this.result != PathingResult.SUCCESS) {
            return null;
        } else {
            // path found
            LinkedList<Tile> routeTrace = new LinkedList<Tile>();
            Tile parent;

            routeTrace.add(current);

            while ((parent = current.getParent()) != null) {
                routeTrace.add(parent);
                current = parent;
            }

            Collections.reverse(routeTrace);

            return new ArrayList<Tile>(routeTrace);
        }
    }