Footholdtree::Footholdtree(InPacket& recv) { int16_t leftw = 30000; int16_t rightw = -30000; int16_t botb = -30000; int16_t topb = 30000; uint16_t numbase = recv.readshort(); for (uint16_t i = 0; i < numbase; i++) { uint8_t layer = recv.readbyte(); uint16_t nummid = recv.readshort(); for (uint16_t j = 0; j < nummid; j++) { uint16_t numlast = recv.readshort(); for (uint16_t k = 0; k < numlast; k++) { Foothold foothold = Foothold(recv, layer); if (foothold.getl() < leftw) { leftw = foothold.getl(); } else if (foothold.getr() > rightw) { rightw = foothold.getr(); } if (foothold.getb() > botb) { botb = foothold.getb(); } else if (foothold.gett() < topb) { topb = foothold.gett(); } uint16_t id = foothold.getid(); footholds[id] = foothold; if (abs(foothold.getslope()) < 0.5) { int16_t start = foothold.getl(); int16_t end = foothold.getr(); for (int16_t i = start; i <= end; i++) { footholdsbyx.insert(std::make_pair(i, id)); } } } } } walls = Range<int16_t>(leftw + 25, rightw - 25); borders = Range<int16_t>(topb - 400, botb + 400); }
int32_t Footholdtree::getlwall(vector2d<int32_t> pos) const { int32_t ret = walls.x(); vector2d<int32_t> ver = vector2d<int32_t>(pos.y() - 80, pos.y() - 20); for (map<uint16_t, Foothold>::const_iterator ftit = footholds.begin(); ftit != footholds.end(); ++ftit) { Foothold fh = ftit->second; if (fh.getver().overlaps(ver) && fh.iswall()) { int32_t x = fh.getl(); if (x > ret && x <= pos.x()) { ret = x; } } } return ret; }
Footholdtree::Footholdtree(node src) { int16_t leftw = 30000; int16_t rightw = -30000; int16_t botb = -30000; int16_t topb = 30000; for (node basef : src) { uint8_t layer; try { layer = static_cast<uint8_t>(stoi(basef.name())); } catch (const std::exception&) { continue; } for (node midf : basef) { for (node lastf : midf) { Foothold foothold = Foothold(lastf, layer); if (foothold.getl() < leftw) { leftw = foothold.getl(); } else if (foothold.getr() > rightw) { rightw = foothold.getr(); } if (foothold.getb() > botb) { botb = foothold.getb(); } else if (foothold.gett() < topb) { topb = foothold.gett(); } uint16_t id = foothold.getid(); footholds[id] = foothold; if (!foothold.iswall()) { int16_t start = foothold.getl(); int16_t end = foothold.getr(); for (int16_t i = start; i <= end; i++) { footholdsbyx.insert(std::make_pair(i, id)); } } } } } walls = Range<int16_t>(leftw + 25, rightw - 25); borders = Range<int16_t>(topb - 300, botb + 80); }