void Level::Builder::putSquare(Vec2 posT, PSquare square, SquareType t, vector<SquareAttrib> attr) { Vec2 pos = transform(posT); CHECK(!contains({SquareType::UP_STAIRS, SquareType::DOWN_STAIRS}, type[pos])) << "Attempted to overwrite stairs"; square->setPosition(pos); if (squares[pos]) square->setBackground(squares[pos].get()); squares[pos] = std::move(square); for (SquareAttrib at : attr) attrib[pos].insert(at); type[pos] = t; }
void Level::replaceSquare(Vec2 pos, PSquare square, bool storePrevious) { squares[pos]->onConstructNewSquare(square.get()); Creature* c = squares[pos]->getCreature(); if (c) squares[pos]->removeCreature(); for (Item* it : copyOf(squares[pos]->getItems())) square->dropItem(squares[pos]->removeItem(it)); addLightSource(pos, squares[pos]->getLightEmission(), -1); square->setPosition(pos); square->setLevel(this); if (squares[pos]->isUnavailable()) square->setUnavailable(); for (PTrigger& t : squares[pos]->removeTriggers()) square->addTrigger(std::move(t)); square->setBackground(squares[pos].get()); if (const Tribe* tribe = squares[pos]->getForbiddenTribe()) square->forbidMovementForTribe(tribe); if (storePrevious) oldSquares[pos] = std::move(squares[pos]); squares[pos] = std::move(square); if (c) { squares[pos]->setCreature(c); } addLightSource(pos, squares[pos]->getLightEmission(), 1); updateVisibility(pos); squares[pos]->updateSunlightMovement(isInSunlight(pos)); updateConnectivity(pos); }
void Level::replaceSquare(Vec2 pos, PSquare square) { if (contains(tickingSquares, getSquare(pos))) removeElement(tickingSquares, getSquare(pos)); Creature* c = squares[pos]->getCreature(); for (Item* it : squares[pos]->getItems()) square->dropItem(squares[pos]->removeItem(it)); squares[pos]->onConstructNewSquare(square.get()); addLightSource(pos, squares[pos]->getLightEmission(), -1); square->setCovered(squares[pos]->isCovered()); square->addLight(squares[pos]->getTotalLight()); square->setBackground(squares[pos].get()); squares[pos] = std::move(square); squares[pos]->setPosition(pos); squares[pos]->setLevel(this); if (c) { squares[pos]->putCreatureSilently(c); } addLightSource(pos, squares[pos]->getLightEmission(), 1); updateVisibility(pos); }
void Level::replaceSquare(Vec2 pos, PSquare square) { squares[pos]->onConstructNewSquare(square.get()); Creature* c = squares[pos]->getCreature(); for (Item* it : squares[pos]->getItems()) square->dropItem(squares[pos]->removeItem(it)); addLightSource(pos, squares[pos]->getLightEmission(), -1); square->setPosition(pos); square->setLevel(this); for (PTrigger& t : squares[pos]->removeTriggers()) square->addTrigger(std::move(t)); square->setBackground(squares[pos].get()); squares[pos] = std::move(square); if (c) { squares[pos]->putCreatureSilently(c); } addLightSource(pos, squares[pos]->getLightEmission(), 1); updateVisibility(pos); }