Esempio n. 1
0
 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;
 }
Esempio n. 2
0
//--------------------------------------------------------------------------------------------
//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);
        }
    }
    
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;

}
Esempio n. 6
0
 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;
}