示例#1
0
/*
	New game is triggered, ask the player if they want to start a new round.
*/
void ViewBoard::newGame()
{
	int ret = QMessageBox::information(this, tr("3D Tic-Tac-Toe"), tr("Start new round?"), QMessageBox::Yes | QMessageBox::No);

	if (ret == QMessageBox::No)	// Players do not want to start a new round, return to defalut view.
		emit endTurn();		// This signal connects to MainWindow.
	else				// Players want to start a new round with the same configuration.
	{	// Reset
		m_negamax		->stop();
		m_cubeWid		->releaseKeyboard();
		setPlayers(m_player1, m_player2);
	}
}
示例#2
0
//constructor
//  initialize the board
//  pass it as a reference to che checkBoard
GEngine::GEngine():board(),checkBoard(board){
	setPlayers();
}
示例#3
0
void CJsonRmgTemplateLoader::loadTemplates()
{
	const JsonNode rootNode(ResourceID("config/rmg.json"));
	for(const auto & templatePair : rootNode.Struct())
	{
		auto tpl = new CRmgTemplate();
		try
		{
			tpl->setName(templatePair.first);
			const auto & templateNode = templatePair.second;

			// Parse main template data
			tpl->setMinSize(parseMapTemplateSize(templateNode["minSize"].String()));
			tpl->setMaxSize(parseMapTemplateSize(templateNode["maxSize"].String()));
			tpl->setPlayers(parsePlayers(templateNode["players"].String()));
			tpl->setCpuPlayers(parsePlayers(templateNode["cpu"].String()));

			// Parse zones
			std::map<TRmgTemplateZoneId, CRmgTemplateZone *> zones;
			for (const auto & zonePair : templateNode["zones"].Struct())
			{
				auto zone = new CRmgTemplateZone();
				auto zoneId = boost::lexical_cast<TRmgTemplateZoneId>(zonePair.first);
				zone->setId(zoneId);

				const auto & zoneNode = zonePair.second;
				zone->setType(parseZoneType(zoneNode["type"].String()));
				zone->setSize(zoneNode["size"].Float());
				if (!zoneNode["owner"].isNull()) zone->setOwner(zoneNode["owner"].Float());

				zone->setPlayerTowns(parseTemplateZoneTowns(zoneNode["playerTowns"]));
				zone->setNeutralTowns(parseTemplateZoneTowns(zoneNode["neutralTowns"]));
				if (!zoneNode["matchTerrainToTown"].isNull()) //default : true
					zone->setMatchTerrainToTown(zoneNode["matchTerrainToTown"].Bool());
				zone->setTerrainTypes(parseTerrainTypes(zoneNode["terrainTypes"].Vector(), zone->getDefaultTerrainTypes()));

				if (!zoneNode["townsAreSameType"].isNull()) //default : false
					zone->setTownsAreSameType((zoneNode["townsAreSameType"].Bool()));

				for (int i = 0; i < 2; ++i)
				{
					std::set<TFaction> allowedTownTypes;
					if (i)
					{
						if (zoneNode["allowedTowns"].isNull())
							allowedTownTypes = zone->getDefaultTownTypes();
					}
					else
					{
						if (zoneNode["allowedMonsters"].isNull())
							allowedTownTypes = VLC->townh->getAllowedFactions(false);
					}

					if (allowedTownTypes.empty())
					{
						for (const JsonNode & allowedTown : zoneNode[i ? "allowedTowns" : "allowedMonsters"].Vector())
						{
							//complain if the town type is not present in our game
							if (auto id = VLC->modh->identifiers.getIdentifier("faction", allowedTown, false))
								allowedTownTypes.insert(id.get());
						}
					}

					if (!zoneNode[i ? "bannedTowns" : "bannedMonsters"].isNull())
					{
						for (const JsonNode & bannedTown : zoneNode[i ? "bannedTowns" : "bannedMonsters"].Vector())
						{
							//erase unindentified towns silently
							if (auto id = VLC->modh->identifiers.getIdentifier("faction", bannedTown, true))
								vstd::erase_if_present(allowedTownTypes, id.get());
						}
					}
					if (i)
						zone->setTownTypes(allowedTownTypes);
					else
						zone->setMonsterTypes(allowedTownTypes);
				}

				const std::string monsterStrength = zoneNode["monsters"].String();
				if (monsterStrength == "weak")
					zone->setMonsterStrength(EMonsterStrength::ZONE_WEAK);
				else if (monsterStrength == "normal")
					zone->setMonsterStrength(EMonsterStrength::ZONE_NORMAL);
				else if (monsterStrength == "strong")
					zone->setMonsterStrength(EMonsterStrength::ZONE_STRONG);
				else
					throw (rmgException("incorrect monster power"));

				if (!zoneNode["mines"].isNull())
				{
					auto mines = zoneNode["mines"].Struct();
					//FIXME: maybe there is a smarter way to parse it already?
					zone->setMinesAmount(Res::WOOD, mines["wood"].Float());
					zone->setMinesAmount(Res::ORE, mines["ore"].Float());
					zone->setMinesAmount(Res::GEMS, mines["gems"].Float());
					zone->setMinesAmount(Res::CRYSTAL, mines["crystal"].Float());
					zone->setMinesAmount(Res::SULFUR, mines["sulfur"].Float());
					zone->setMinesAmount(Res::MERCURY, mines["mercury"].Float());
					zone->setMinesAmount(Res::GOLD, mines["gold"].Float());
					//TODO: Mithril
				}

				//treasures
				if (!zoneNode["treasure"].isNull())
				{
					//TODO: parse vector of different treasure settings
					if (zoneNode["treasure"].getType() == JsonNode::DATA_STRUCT)
					{
						auto treasureInfo = zoneNode["treasure"].Struct();
						{
							CTreasureInfo ti;
							ti.min = treasureInfo["min"].Float();
							ti.max = treasureInfo["max"].Float();
							ti.density = treasureInfo["density"].Float(); //TODO: use me
							zone->addTreasureInfo(ti);
						}
					}
					else if (zoneNode["treasure"].getType() == JsonNode::DATA_VECTOR)
					{
						for (auto treasureInfo : zoneNode["treasure"].Vector())
						{
							CTreasureInfo ti;
							ti.min = treasureInfo["min"].Float();
							ti.max = treasureInfo["max"].Float();
							ti.density = treasureInfo["density"].Float();
							zone->addTreasureInfo(ti);
						}
					}
				}

				zones[zone->getId()] = zone;
			}

			//copy settings from already parsed zones
			for (const auto & zonePair : templateNode["zones"].Struct())
			{
				auto zoneId = boost::lexical_cast<TRmgTemplateZoneId>(zonePair.first);
				auto zone = zones[zoneId];

				const auto & zoneNode = zonePair.second;

				if (!zoneNode["terrainTypeLikeZone"].isNull())
				{
					int id = zoneNode["terrainTypeLikeZone"].Float();
					zone->setTerrainTypes(zones[id]->getTerrainTypes());
					zone->setMatchTerrainToTown(zones[id]->getMatchTerrainToTown());
				}

				if (!zoneNode["townTypeLikeZone"].isNull())
					zone->setTownTypes (zones[zoneNode["townTypeLikeZone"].Float()]->getTownTypes());

				if (!zoneNode["treasureLikeZone"].isNull())
				{
					for (auto treasureInfo : zones[zoneNode["treasureLikeZone"].Float()]->getTreasureInfo())
					{
						zone->addTreasureInfo(treasureInfo);
					}
				}

				if (!zoneNode["minesLikeZone"].isNull())
				{
					for (auto mineInfo : zones[zoneNode["minesLikeZone"].Float()]->getMinesInfo())
					{
						zone->setMinesAmount (mineInfo.first, mineInfo.second);
					}
					
				}
			}

			tpl->setZones(zones);

			// Parse connections
			std::list<CRmgTemplateZoneConnection> connections;
			for(const auto & connPair : templateNode["connections"].Vector())
			{
				CRmgTemplateZoneConnection conn;
				conn.setZoneA(zones.find(boost::lexical_cast<TRmgTemplateZoneId>(connPair["a"].String()))->second);
				conn.setZoneB(zones.find(boost::lexical_cast<TRmgTemplateZoneId>(connPair["b"].String()))->second);
				conn.setGuardStrength(connPair["guard"].Float());
				connections.push_back(conn);
			}
			tpl->setConnections(connections);
			{
				auto zones = tpl->getZones();
				for (auto con : tpl->getConnections())
				{
					auto idA = con.getZoneA()->getId();
					auto idB = con.getZoneB()->getId();
					zones[idA]->addConnection(idB);
					zones[idB]->addConnection(idA);
				}
			}
			tpl->validate();
			templates[tpl->getName()] = tpl;
		}
		catch(const std::exception & e)
		{
			logGlobal->errorStream() << boost::format("Template %s has errors. Message: %s.") % tpl->getName() % std::string(e.what());
		}
	}
}