bool Channel::read_tile_or_closest_ancestor(TileIndex ti, TileIndex &ret_index, Tile &ret) const { Locker lock(*this); // Lock self and hold lock until exiting this method ChannelInfo info; bool success = read_info(info); if (!success) { if (verbosity) log_f("read_tile_or_closest_ancestor: can't read info"); return false; } TileIndex root = info.nonnegative_root_tile_index; if (ti.is_ancestor_of(root)) { ret_index = root; } else { if (ti != root && !root.is_ancestor_of(ti)) { // Tile isn't under root return false; } assert(tile_exists(root)); ret_index = root; while (ret_index != ti) { TileIndex child = ti.start_time() < ret_index.left_child().end_time() ? ret_index.left_child() : ret_index.right_child(); if (!tile_exists(child)) break; ret_index = child; } } // ret_index now holds closest ancestor to ti (or ti itself if it exists) assert(read_tile(ret_index, ret)); return true; }
TileIndex Channel::find_child_overlapping_time(TileIndex ti, double t, int desired_level) const { assert(!ti.is_null()); // Start at root tile and move downwards while (ti.level > desired_level) { // Select correct child TileIndex child = t < ti.left_child().end_time() ? ti.left_child() : ti.right_child(); if (child.is_null() || !tile_exists(child)) break; ti = child; } return ti; }
bool set_tile_type(int x, int y, tiletype value) { if (tile_exists(x,y)) { terrain_tile[x][y].type=value; return true;} return false; }
bool set_tile_var(int x, int y, tile_variable value) { if (tile_exists(x,y)) { terrain_tile[x][y].var=value; return true;} return false; }
tile get_tile(int x, int y) { if (tile_exists(x,y)) { return terrain_tile[x][y]; } return terrain_tile[-1][-1]; }