void mousePassive(int x, int y) { float *objectCoords = getRayFromMouse(x, y); float posXs = *objectCoords; float posYs = *(++objectCoords); float posZs = *(++objectCoords); float posXe = *(++objectCoords); float posYe = *(++objectCoords); float posZe = *(++objectCoords); if (hoverCard == nullptr || !hoverCard->collidesWithRay(posXs, posYs, posZs, posXe, posYe, posZe)) { hoverCard = nullptr; position_hand(player.hand); for (auto &it : player.hand) { if (it.second.collidesWithRay(posXs, posYs, posZs, posXe, posYe, posZe)) { hoverCard = &it.second; hoverID = it.first; } } for (auto &it : player.in_play) { if (it.second.collidesWithRay(posXs, posYs, posZs, posXe, posYe, posZe)) { hoverCard = &it.second; hoverID = it.first; } } position_hand(player.hand); glutPostRedisplay(); } //std::cout << std::to_string(posX) + " " + std::to_string(posY)+ " " + std::to_string(posZ) << std::endl; }
void put_down_one() { Servos s; lower_hand(); nap(); open_hand(); position_hand(10); close_hand(); }
void mouseClick(int button, int state, int x, int y) { float *objectCoords = getRayFromMouse(x, y); float posXs = *objectCoords; float posYs = *(++objectCoords); float posZs = *(++objectCoords); float posXe = *(++objectCoords); float posYe = *(++objectCoords); float posZe = *(++objectCoords); if (button == GLUT_LEFT_BUTTON) { // button release if (state == GLUT_UP) { if (gameData.get_game_state() == CHAT_SCREEN) { if (x > 100 && y > 510 && x < 220 && y < 550) { messages.push_back("...ready..."); glutPostRedisplay(); send_ready(); gameData.toggle_player_ready(); } } else if (gameData.get_game_state() == GAME) { if (cardGrabbed) { if (hoverCard->getY() > -0.35f) play_card(hoverID); cardGrabbed = false; } else if (attack_drag) { //&& hoverCard != attackingCard // some allowance for click-and-move? // check attack ... if (hoverCard != nullptr && hoverCard->isAttackable()) { // attack. send_attack(attackerID, hoverID); gameData.setup_attack(attackerID, hoverID); gameData.queue_action(&attack); } attack_drag = false; for (auto &it : opponent.in_play) { it.second.set_attackable(false); } } position_hand(player.hand); movX = 0; movY = 0; arrow_head_x = 0; arrow_head_y = 0; } } else if (state == GLUT_DOWN) { if (gameData.get_game_state() == GAME) { if (gameData.is_my_turn() && hoverCard == nullptr) { float t = (0.0f - posZs) / (posZe - posZs); float x = posXs + t*(posXe - posXs); float y = posYs + t*(posYe - posYs); if (x > 1.7f && y > 0.0f && x < 2.0f && y < 0.15f) { gameData.queue_action(&end_turn); } } if (gameData.is_my_turn() && hoverCard != nullptr) { if (player.hand.find(hoverID) != player.hand.end() && hoverCard->getCard().getCost() <= gameData.get_energy_player().get_current()) { cardGrabbed = true; } else if (player.in_play.find(hoverID) != player.in_play.end() && hoverCard->getCard().can_attack()) { attackingCard = hoverCard; attackerID = hoverID; attack_drag = true; arrow_head_x = hoverCard->getX() + 0.075f; arrow_head_y = hoverCard->getY() + 0.15f; bool taunt_present = false; for (auto &it : opponent.in_play) { // Highlighting creatures that can be attacked. // Problem -> visual feedback on which one you're choosing. if (it.second.getCard().getStatus() & STATUS_TAUNT) { it.second.set_attackable(true); taunt_present = true; } } for (auto &it : opponent.in_play) { if (!(it.second.getCard().getStatus() & STATUS_TAUNT)) { if (!taunt_present) { it.second.set_attackable(true); } else { it.second.set_attackable(false); } } } } } } } } glutPostRedisplay(); }