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); 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) { 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); }