void Agent::moveTo(float _x, float _y, bool force) { // Move ourselves to the specified location. wasmoved = true; // if we're being carried and aren't being forced to move (prbly by our carrier), forget it if (carriedby && !force) return; // TODO: what if we move while being carried? doomy explosions ensue, that's what! float xoffset = _x - x; float yoffset = _y - y; x = _x; y = _y; // handle wraparound // TODO: this is perhaps non-ideal if (engine.version < 3 && xoffset != 0.0f) { // TODO: it'd be nice to handle multiple metarooms MetaRoom *m = world.map.getFallbackMetaroom(); assert(m); if (x < m->x()) { x += m->width(); } else if (x > m->x() + m->width()) { x -= m->width(); } } for (std::vector<AgentRef>::iterator i = floated.begin(); i != floated.end(); i++) { assert(*i); (*i)->moveTo((*i)->x + xoffset, (*i)->y + yoffset); } adjustCarried(xoffset, yoffset); }
MetaRoom *Map::metaRoomAt(unsigned int _x, unsigned int _y) { for (std::vector<MetaRoom *>::iterator i = metarooms.begin(); i != metarooms.end(); i++) { MetaRoom *r = *i; if ((_x >= r->x()) && (_y >= r->y())) if ((_x <= (r->x() + r->width())) && (_y <= (r->y() + r->height()))) return r; } return 0; }