Exemplo n.º 1
0
void SimState::raiseEvent(SDL_Event* event)
{
	smap->raiseEvent(event);
	bar->raiseEvent(event);
	hover->raiseEvent(event);

	if(actionBar != NULL && mode == S_NORMAL)
		actionBar->raiseEvent(event);

	if(endTurnBtn != NULL && mode == S_NORMAL)
		endTurnBtn->raiseEvent(event);

	if(imageHover != NULL)
		imageHover->raiseEvent(event);

	if(roadCreator != NULL && mode == S_PLACEROADEND)
		roadCreator->raiseEvent(event);

	vector<Building*>::const_iterator bit;
	for(bit = buildings.begin(); bit != buildings.end(); ++bit)
	{
		(*bit)->raiseEvent(event);
	}

	if(wonder != NULL)
		wonder->raiseEvent(event);

	if(event->type == SDL_MOUSEBUTTONDOWN && event->button.button == SDL_BUTTON_LEFT)
	{
		switch(mode)
		{
		case S_PLACECASTLE:
		{
			if(castle == NULL)
			{
				if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
				{
					castle = new Castle(this, imageHover->getX(), imageHover->getY());

					Logger::debugFormat("Castle placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;
				
					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Cannot build there!");
				}

			}
			else
			{
				Logger::error("Tried to place a second castle");
			}
			break;
		}

		case S_PLACEWONDER:
		{
			if(wonder == NULL)
			{
				if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
				{
					Wonder* wonder2 = new Wonder(this, imageHover->getX(), imageHover->getY());

					if(wonder2->canPurchase())
					{
						wonder2->purchase();

						wonder = wonder2;

						Logger::debugFormat("Wonder placed at (%i, %i)", imageHover->getX(), imageHover->getY());

						mode = S_NORMAL;

						if(imageHover != NULL)
							delete imageHover;
				
						imageHover = NULL;
					}
					else
					{
						msgBox->addMessage("Not enough resources!");
					}
				}
				else
				{
					msgBox->addMessage("Cannot build there!");
				}

			}
			else
			{
				msgBox->addMessage("You can only build one!");
				Logger::error("Tried to place a second wonder");
			}
			break;
		}

		case S_PLACEHOUSE:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				House* house = new House(this, imageHover->getX(), imageHover->getY());

				if(house->canPurchase())
				{
					house->purchase();
					buildings.push_back(house);

					Logger::debugFormat("House placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;

					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Not enough resources!");
				}
			}
			else
			{
				msgBox->addMessage("Cannot build there!");
			}

			break;
		}

		case S_PLACEFARM:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Farm* farm = new Farm(this, imageHover->getX(), imageHover->getY());

				if(farm->canPurchase())
				{
					farm->purchase();
					buildings.push_back(farm);

					Logger::debugFormat("Farm placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;

					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Not enough resources!");
				}
			}
			else
			{
				msgBox->addMessage("Cannot build there!");
			}

			break;
		}

		case S_PLACEMININGCAMP:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				MiningCamp* camp = new MiningCamp(this, imageHover->getX(), imageHover->getY());

				if(camp->canPurchase())
				{
					camp->purchase();
					buildings.push_back(camp);

					Logger::debugFormat("Mining Camp placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;

					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Not enough resources!");
				}
			}
			else
			{
				msgBox->addMessage("Cannot build there!");
			}

			break;
		}

		case S_PLACEMILL:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Mill* mill = new Mill(this, imageHover->getX(), imageHover->getY());

				if(mill->canPurchase())
				{
					mill->purchase();
					buildings.push_back(mill);

					Logger::debugFormat("Mill placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;

					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Not enough resources!");
				}
			}
			else
			{
				msgBox->addMessage("Cannot build there!");
			}

			break;
		}

		case S_PLACEWELL:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Well* well = new Well(this, imageHover->getX(), imageHover->getY());

				if(well->canPurchase())
				{
					well->purchase();
					buildings.push_back(well);

					Logger::debugFormat("Well placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;

					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Not enough resources!");
				}
			}
			else
			{
				msgBox->addMessage("Cannot build there!");
			}

			break;
		}

		case S_PLACETAVERN:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Tavern* tavern = new Tavern(this, imageHover->getX(), imageHover->getY());
				buildings.push_back(tavern);

				Logger::debugFormat("Tavern placed at (%i, %i)", imageHover->getX(), imageHover->getY());

				mode = S_NORMAL;

				if(imageHover != NULL)
					delete imageHover;

				imageHover = NULL;
			}

			break;
		}

		case S_PLACETHEATRE:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Theatre* theatre = new Theatre(this, imageHover->getX(), imageHover->getY());
				buildings.push_back(theatre);

				Logger::debugFormat("Theatre placed at (%i, %i)", imageHover->getX(), imageHover->getY());

				mode = S_NORMAL;

				if(imageHover != NULL)
					delete imageHover;

				imageHover = NULL;
			}

			break;
		}

		case S_PLACEWEAVER:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Weaver* weaver = new Weaver(this, imageHover->getX(), imageHover->getY());
				buildings.push_back(weaver);

				Logger::debugFormat("Weaver placed at (%i, %i)", imageHover->getX(), imageHover->getY());

				mode = S_NORMAL;

				if(imageHover != NULL)
					delete imageHover;

				imageHover = NULL;
			}

			break;
		}

		case S_PLACEJEWELER:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Jeweler* jeweler = new Jeweler(this, imageHover->getX(), imageHover->getY());
				buildings.push_back(jeweler);

				Logger::debugFormat("Jeweler placed at (%i, %i)", imageHover->getX(), imageHover->getY());

				mode = S_NORMAL;

				if(imageHover != NULL)
					delete imageHover;

				imageHover = NULL;
			}

			break;
		}

		case S_PLACEBLACKSMITH:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Blacksmith* blacksmith = new Blacksmith(this, imageHover->getX(), imageHover->getY());

				if(blacksmith->canPurchase())
				{
					blacksmith->purchase();
					buildings.push_back(blacksmith);

					Logger::debugFormat("Blacksmith placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;

					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Not enough resources!");
				}
			}
			else
			{
				msgBox->addMessage("Cannot build there!");
			}

			break;
		}

		case S_PLACEBAKERY:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Bakery* bakery = new Bakery(this, imageHover->getX(), imageHover->getY());
				buildings.push_back(bakery);

				Logger::debugFormat("Bakery placed at (%i, %i)", imageHover->getX(), imageHover->getY());

				mode = S_NORMAL;

				if(imageHover != NULL)
					delete imageHover;

				imageHover = NULL;
			}

			break;
		}

		case S_PLACEGUARDSTATION:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				GuardStation* guardStation = new GuardStation(this, imageHover->getX(), imageHover->getY());

				if(guardStation->canPurchase())
				{
					guardStation->purchase();
					buildings.push_back(guardStation);

					Logger::debugFormat("GuardStation placed at (%i, %i)", imageHover->getX(), imageHover->getY());

					mode = S_NORMAL;

					if(imageHover != NULL)
						delete imageHover;

					imageHover = NULL;
				}
				else
				{
					msgBox->addMessage("Not enough resources!");
				}
			}
			else
			{
				msgBox->addMessage("Cannot build here!");
			}

			break;
		}

		case S_PLACEMARKET:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) == E_GOOD)
			{
				Market* market = new Market(this, imageHover->getX(), imageHover->getY());
				buildings.push_back(market);

				Logger::debugFormat("Market placed at (%i, %i)", imageHover->getX(), imageHover->getY());

				mode = S_NORMAL;

				if(imageHover != NULL)
					delete imageHover;

				imageHover = NULL;
			}

			break;
		}

		case S_PLACEROADSTART:
		{
			if(canBuild(imageHover->getMapX(), imageHover->getMapY(), imageHover->getWidth(), imageHover->getHeight()) != E_BAD)
			{
				Logger::debugFormat("Placed Road Start at (%i, %i)", imageHover->getX(), imageHover->getY());

				mode = S_PLACEROADEND;

				if(roadCreator != NULL)
					delete roadCreator;

				roadCreator = new RoadFactory(this, imageHover->getX(), imageHover->getY());
			
				if(imageHover != NULL)
					delete imageHover;

				imageHover = NULL;
			}
			else
			{
				msgBox->addMessage("Cannot build here!");
			}

			break;
		}

		case S_PLACEROADEND:
		{
			if(roadCreator->canBuild())
			{
				Logger::debugFormat("Placed Road End at (%i, %i)", roadCreator->getFinishX(), roadCreator->getFinishY());

				mode = S_NORMAL;

				roadCreator->createRoad();


				std::map<string, Road*>::iterator ittr;
				for(ittr = roads.begin(); ittr != roads.end(); ++ittr)
					ittr->second->calculateMode();

				list<Road*> network;
				getRoadNetwork(network);

				vector<Building*>::iterator it;
				for(it = buildings.begin(); it != buildings.end(); ++it)
					(*it)->inNetwork(network);

				if(wonder != NULL)
					wonder->inNetwork(network);

				delete roadCreator;
				roadCreator = NULL;

				placeRoad();
			}
			else
			{
				msgBox->addMessage("Cannot build here!");
			}

			break;
		}

		case S_DELETE:
		{
			vector<Building*>::iterator it;
			for(it = buildings.begin(); it != buildings.end(); ++it)
			{
				if((*it)->collides(event->motion.x, event->motion.y, 1, 1))
				{
					list<Villager*>::iterator ittr;
					for(ittr = villagers.begin(); ittr != villagers.end(); ++ittr)
					{
						if((*ittr)->getHouse() == *it || (*ittr)->getJob() == *it)
						{
							Logger::debug("Citizen Leaving");

							villagers.remove(*ittr);
						}
					}

					Logger::debug("Demolishing Building");
					msgBox->addMessage("Building Destroyed");

					buildings.erase(it);
					break;
				}
			}

			
			std::map<string, Road*>::iterator itt;
			for(itt = roads.begin(); itt != roads.end(); ++itt)
			{
				if(itt->second->collides(event->motion.x, event->motion.y, 1, 1))
				{
					roads.erase(itt);

					Logger::debug("Demolishing Road");
					msgBox->addMessage("Road Destroyed");

					std::map<string, Road*>::iterator ittr;
					for(ittr = roads.begin(); ittr != roads.end(); ++ittr)
						ittr->second->calculateMode();

					list<Road*> network;
					getRoadNetwork(network);

					vector<Building*>::iterator it;
					for(it = buildings.begin(); it != buildings.end(); ++it)
						(*it)->inNetwork(network);

					if(wonder != NULL)
						wonder->inNetwork(network);

					break;
				}
			}

			break;
		}
		}
	}
}