void Player::targetAction() { CHECK(target); if (creature->getPosition() == *target || model->getView()->travelInterrupt()) { target = Nothing(); return; } if (auto action = creature->moveTowards(*target)) action.perform(); else target = Nothing(); itemsMessage(); if (interruptedByEnemy()) target = Nothing(); }
void Player::targetAction() { CHECK(target); if (creature->getPosition() == *target || model->getView()->travelInterrupt()) { target = Nothing(); return; } Optional<Vec2> move = creature->getMoveTowards(*target); if (move) creature->move(*move); else target = Nothing(); itemsMessage(); if (interruptedByEnemy()) target = Nothing(); }
void Player::travelAction() { if (!creature->canMove(travelDir) || model->getView()->travelInterrupt() || interruptedByEnemy()) { travelling = false; return; } creature->move(travelDir); itemsMessage(); const Location* currentLocation = creature->getLevel()->getLocation(creature->getPosition()); if (lastLocation != currentLocation && currentLocation != nullptr && currentLocation->hasName()) { privateMessage("You arrive at " + addAParticle(currentLocation->getName())); travelling = false; return; } vector<Vec2> squareDirs = creature->getConstSquare()->getTravelDir(); if (squareDirs.size() != 2) { travelling = false; Debug() << "Stopped by multiple routes"; return; } Optional<int> myIndex = findElement(squareDirs, -travelDir); CHECK(myIndex) << "Bad travel data in square"; travelDir = squareDirs[(*myIndex + 1) % 2]; }