void handle_mouse(Event *evt) { if (!mapEngine->mapLoaded()) return; Point camPos = graphicsEngine->getCamera()->getPosition(); Point pos; pos.x = evt->x + camPos.x; pos.y = evt->y + camPos.y + mapEngine->getTileHeight(); // left mouse button has finished being pressed if (evt->button == SDL_BUTTON_LEFT && evt->type == 1) { // check user clicked on map Node *node = graphicsEngine->getNode(pos.x, pos.y); if (node) { // show name if player/NPC is clicked Being *being = beingManager->findBeing(node->getName()); if (being) { // toggle being name being->toggleName(); if (being->isNPC() && withinReach(being->getPosition(), player->getSelectedCharacter()->getPosition()) && !being->isTalking()) { Packet *p = new Packet(PGMSG_NPC_START_TALK); p->setInteger(being->getId()); networkManager->sendPacket(p); } return; } Point pt = mapEngine->convertPixelToTile(pos.x, pos.y); if (mapEngine->blocked(pt)) return; // send move message Packet *p = new Packet(PGMSG_PLAYER_MOVE); p->setInteger(pt.x); p->setInteger(pt.y); networkManager->sendPacket(p); //logger->logDebug("Sending move request"); // save destination for later player->getSelectedCharacter()->saveDestination(pt); } } if (evt->button == 0) { if (!interfaceManager->getMouse()->cursor) return; // pos.x += mapEngine->getTileWidth() >> 1; int mapWidth = mapEngine->getWidth() * mapEngine->getTileWidth(); int mapHeight = mapEngine->getHeight() * mapEngine->getTileHeight(); if (pos.x > mapWidth || -pos.x > mapWidth) return; if (pos.y > mapHeight || pos.y < 0) return; Point tilePos = mapEngine->convertPixelToTile(pos.x, pos.y); if (tilePos.x < 0 || tilePos.y < 0) return; if (tilePos.x == interfaceManager->getMouse()->cursorPos.x && tilePos.y == interfaceManager->getMouse()->cursorPos.y) return; interfaceManager->getMouse()->cursorPos = tilePos; Point screenPos; screenPos.x = 0.5 * (tilePos.x - tilePos.y) * mapEngine->getTileWidth(); screenPos.y = 0.5 * (tilePos.x + tilePos.y) * mapEngine->getTileHeight(); interfaceManager->getMouse()->cursor->moveNode(&screenPos); } }