class Game_Map def find_path(source, x, y, depth = 0) return if [source.x, source.y] == [x, y] open = {} # [x, y] @ [parent_x, parent_y] closed = [] closed << [source.x, source.y] loop do for x_pos in (closed.last[0] - 1)..(closed.last[0] + 1) for y_pos in (closed.last[1] - 1)..(closed.last[1] + 1) next unless $game_map.passable?(x_pos, y_pos) next if closed.last[0] == x_pos and closed.last[1] == y_pos next if open.keys.include?([x_pos, y_pos]) open[[x_pos, y_pos]] = [closed.last[0], closed.last[1]] end end value = {} for open_coords in open value[open_coords[0]] = (find_h(open_coords[0], x, y) + find_g(open_coords[0], open_coords[1])) end value.sort {|a,b| a[1]<=>b[1]} closed << value.shift[0] break if (closed.last == [x, y]) end end def find_h(coords, end_x, end_y) start_x = coords[0] start_y = coords[1] return (end_x - start_x).abs + (end_y - start_y).abs end def find_g(tile_coords, parent_coords) if (tile_coords[0] == parent_coords[0] or tile_coords[1] == parent_coords[1]) return 10 else return 14 end end end