Tower* removeTower(Vec2i position){ Tower* ret = nullptr; for(auto it = towers.begin(); it!= towers.end(); it++) if((*it)->getPosition()==position){ ret = *it; removeTower(it); break; } return ret; }
//-------------------------------------------------------------------------------------------- //make sure our colleciton of towers matches up with cups in the real world void Scene::checkCups(){ //first, mark each tower as having not yet been checked this frame for (int i=0; i<towers.size(); i++){ towers[i]->hasBeenCheckedThisFrame = false; } //go through the list of real world cups for (int i=0; i<cupTracker->activeCups.size(); i++){ CupInfo thisCup = cupTracker->activeCups[i]; bool foundTower = false; //check if there is a coresponding tower for (int k=0; k<towers.size(); k++){ if (towers[k]->uniqueID == thisCup.uniqueID){ //store the old values float prevAngle = towers[k]->targetAngle; ofVec2f prevPos = towers[k]->pos; //update towers[k]->setFromCupInfo(thisCup); towers[k]->hasBeenCheckedThisFrame = true; //mark that we checked it so it doesn't get killed foundTower = true; //and mark that this cup is accounted for //check if it moved enough to not be considered idle if ( ofDistSquared(prevPos.x, prevPos.y, towers[k]->pos.x, towers[k]->pos.y) > idleTowerMoveThreshold*idleTowerMoveThreshold){ //cout<<"big move"<<endl; idleTimer = 0; } if ( abs(prevAngle-towers[k]->targetAngle) > idleTowerRotateThreshold){ //cout<<"big angle"<<endl; idleTimer = 0; } break; } } //if no tower was found, it is a new cup, and we need a tower for it! if ( !foundTower ){ idleTimer = 0; addTower(thisCup); } } //now that we've gone through all cups, go through and remove any towers not accounted for for (int i=towers.size()-1; i>=0; i--){ if ( !towers[i]->hasBeenCheckedThisFrame && !towers[i]->ignoreAutoRemove){ idleTimer = 0; removeTower(i); } } }
int moveCursor(cursor* c, camera *cam, char *grid, tower** towers, mob *mobs, int *money) //detecs the pressed keys and moves the cursor { int towerId = -1, returned = -1, i = 0; if(KeyDown(K_LEFT) && c->gridX > 0) { c->gridX--; if(cam->x / 9 > c->gridX) cam->x-= 9; } if(KeyDown(K_RIGHT) && c->gridX < GRID_LENGTH -1) { c->gridX++; if((cam->x + 128)/ 9 < (c->gridX +1)) cam->x+= 9; } if(KeyDown(K_UP) && c->gridY > 0) { c->gridY--; if(cam->y / 9 > c->gridY) cam->y -= 9; } if(KeyDown(K_DOWN) && c->gridY < GRID_WIDTH -1) { c->gridY++; if((cam->y + 64)/9 < (c->gridY+1)) cam->y += 9; } if(KeyDown(K_EXE) && grid[c->gridY * GRID_LENGTH + c->gridX]==6) { returned = openTowerEditionMenu(*c, cam, grid, *towers, mobs, money); while(KeyDown(K_EXE)) {} } if(KeyDown(K_EXE) && grid[c->gridY * GRID_LENGTH + c->gridX]==0) { towerId = openTowerSelectionMenu(*c, cam, grid, *towers, mobs, money); while(KeyDown(K_EXE)) {} } if(returned != -1) { if(returned == 4) { *towers = removeTower(findTowerXY(c->gridX, c->gridY, *towers), *towers); grid[c->gridY * GRID_LENGTH + c->gridX] = 0; } } if(towerId != -1) { *towers = addTower(c->gridX, c->gridY, towerId, *towers); } return towerId; }
bool WorldScene::event(QEvent *event) { //Allowing hovered item to display differently. if (event->type() == QEvent::GraphicsSceneMouseMove) { QGraphicsSceneMouseEvent *e = static_cast<QGraphicsSceneMouseEvent *>(event); QGraphicsItem * itemHovered = itemAt(e->scenePos(), QGraphicsItem::UserType + 1); if(itemHovered != m_hoveredItem ) { if(m_hoveredItem) static_cast<HexTile *>(m_hoveredItem)->hoverLeaveEvent(e); if(itemHovered) static_cast<HexTile *>(itemHovered)->hoverEnterEvent(e); m_hoveredItem = itemHovered; } e->accept(); return true; } //Handling clicks to create/remove towers else if(event->type() == QEvent::GraphicsSceneMousePress) { QGraphicsSceneMouseEvent *e = static_cast<QGraphicsSceneMouseEvent *>(event); if(e->button() == Qt::LeftButton) { QGraphicsItem * item = itemAt(e->scenePos(), QGraphicsItem::UserType + 1); if(item) emit placeTower(item); } else if(e->button() == Qt::RightButton) { QGraphicsItem * item = itemAt(e->scenePos(), QGraphicsItem::UserType + 1); if(item) emit removeTower(item); } } return QGraphicsScene::event(event); //return true; }
int clickTourDelete(LTower* p_ltower, LShot* p_lshot, Tower* p_courant, Interface* interface, float x, float y, int* propriete) { if(p_ltower != NULL) { if(p_courant != NULL) { if(*propriete == 1) { if(x <= 190 && x >= 10 && y <= 540 && y >= 490) { Shot* p_tmp = p_lshot->p_head; while(p_tmp != NULL) { if(p_tmp->tower == p_courant) p_tmp->tower = NULL; p_tmp = p_tmp->p_next; } interface->money += p_courant->cost; p_ltower = removeTower(p_ltower, p_courant); *propriete = 0; } } } else { fprintf(stderr, "Erreur la tour courante\n"); return 0; } } else { fprintf(stderr, "Erreur avec la liste de tours\n"); return 0; } return 1; }
void clearTowers(){ for(auto it = towers.begin(); it!=towers.end();){ delete *it; it = removeTower(it); } }
int game_host::performUpdate(string upd) { int updateType = 0; UpdMess update(upd); updateType = update.getType(); if(updateType == TOWER) { int subType = update.getVal(0); //Tower Placement: UpdMess(Player[1], TOWER, TOWERPLACE[2], TowerX[2], Tower[Y]); if(subType == TOWERPLACE) { // placeTower(int playerNumber, int towerType, int x, int y); if(isEmptyLocation(update.getVal(1), update.getVal(2))) { placeTower(update.getPlayer(), STRUCTURE, update.getVal(1), update.getVal(2)); } } else if(subType == MINEPLACE) { if(isEmptyLocation(update.getVal(1), update.getVal(2))) { placeTower(update.getPlayer(), MINETOWER, update.getVal(1), update.getVal(2)); } } //Tower Upgrade: UpdMess(Player[1], TOWER, TOWERUPGRADE[2], TowerID[4]); else if(subType == TOWERUPGRADE) { if(towerList.checkForObjectWithID(update.getId1()) == true) { if(towerList.getNodeWithID(update.getId1())->getData()->getType() != STRUCTURE) { if(towerList.getNodeWithID(update.getId1())->getData()->upgrade()) { sendMessageToQueue(UpdMess(update.getPlayer(), TOWER, TOWERUPGRADE, update.getId1()).getMT()); } } } } //Tower ChangeType: UpdMess(Player[1], TOWER, TOWERCHANGE[2], TowerID[4], newType[2]); else if(subType == TOWERCHANGE) { if(towerList.checkForObjectWithID(update.getId1()) == true) { if(towerList.getNodeWithID(update.getId1())->getData()->getType() == STRUCTURE) { return changeStructure(update.getId1(), update.getVal(1)); } else if(towerList.getNodeWithID(update.getId1())->getData()->getType() == NORMCREEPTOWER) { if(towerList.getNodeWithID(update.getId1())->getData()->changeType(update.getVal(1))) { sendMessageToQueue(UpdMess(update.getPlayer(), TOWER, TOWERCHANGE, update.getId1(),update.getVal(1)).getMT()); } } } } //Tower Toggle Pause: UpdMess(Player[1], TOWER, TOWERTOGGLE[2], TowerID[4], newValue); else if(subType == TOWERTOGGLE) { if(towerList.checkForObjectWithID(update.getId1())) { int towerTypeRec = towerList.getNodeWithID(update.getId1())->getData()->getType(); if(towerList.getNodeWithID(update.getId1())->getData()->getType() >= NORMCREEPTOWER && towerList.getNodeWithID(update.getId1())->getData()->getType() <= FATTYCREEPTOWER) { if(update.getVal(1) == 1) towerList.getNodeWithID(update.getId1())->getData()->pause(); else if(update.getVal(1) == 0) towerList.getNodeWithID(update.getId1())->getData()->unpause(); sendMessageToQueue(UpdMess(towerList.getNodeWithID(update.getId1())->getData()->getPlayer(), TOWER, TOWERTOGGLE, update.getId1(), towerList.getNodeWithID(update.getId1())->getData()->isPaused()).getMT()); } } } else if(subType == TOWERDELETE) { if(towerList.checkForObjectWithID(update.getId1())) { removeTower(update.getId1(), update.getPlayer()); } } } else if(updateType == BASE) { int subType = update.getVal(0); if(subType == UPGRADE) { if(this->getPlayer(update.getPlayer())->getMoney() >= BASEUPGRADECOST) { if(update.getPlayer() == 1) { if(this->p1Spawner->getLevel() < 5 && players[0].getMoney() >= (p1Spawner->getLevel() + 1) * BASEUPGRADECOST) { players[0].spendMoney((p1Spawner->getLevel() + 1) * BASEUPGRADECOST); this->p1Spawner->setLevel(this->p1Spawner->getLevel() + 1); sendMessageToQueue(UpdMess(1, BASE, UPGRADE).getMT()); } } else if(update.getPlayer() == 2) { if(this->p2Spawner->getLevel() < 5 && players[1].getMoney() >= (p2Spawner->getLevel() + 1) * BASEUPGRADECOST) { players[1].spendMoney((p2Spawner->getLevel() + 1) * BASEUPGRADECOST); this->p2Spawner->setLevel(this->p2Spawner->getLevel() + 1); sendMessageToQueue(UpdMess(2, BASE, UPGRADE).getMT()); } } } } else if(subType == ADDTYPE) { int addType = update.getVal(1); if(!(addType >= FAST && addType <= FATTY)) return -1; if(update.getPlayer() == 1) { if(this->p1Spawner->isInSpawner(addType)) return -1; // Already in the spawner } else if(update.getPlayer() == 2) { if(this->p2Spawner->isInSpawner(addType)) return -1; // Already in the spawner } else return -1; if(this->getPlayer(update.getPlayer())->getMoney() >= addSpawnArr[addType]) { this->getPlayer(update.getPlayer())->spendMoney(addSpawnArr[addType]); if(update.getPlayer() == 1) { this->p1Spawner->addCreepType(addType); sendMessageToQueue(UpdMess(1, BASE, ADDTYPE, addType).getMT()); } else { this->p2Spawner->addCreepType(addType); sendMessageToQueue(UpdMess(2, BASE, ADDTYPE, addType).getMT()); } } } else return -1; } else return -1; sendMessageToQueue(UpdMess(1, PLAYERUPDATE, getPlayer(1)->getHealth(), getPlayer(1)->getMoney()).getMT()); sendMessageToQueue(UpdMess(2, PLAYERUPDATE, getPlayer(2)->getHealth(), getPlayer(2)->getMoney()).getMT()); return 0; }