فهرست منبع

Fixed issue that allowed to build multiple boats in town. Renamed state() to sth more sensible.

Michał W. Urbańczyk 12 سال پیش
والد
کامیت
e9d51a2670
7فایلهای تغییر یافته به همراه11 افزوده شده و 10 حذف شده
  1. 1 1
      AI/VCAI/VCAI.cpp
  2. 2 1
      client/CCastleInterface.cpp
  3. 2 2
      client/CPlayerInterface.cpp
  4. 1 1
      lib/CGameState.cpp
  5. 3 3
      lib/CObjectHandler.cpp
  6. 1 1
      lib/CObjectHandler.h
  7. 1 1
      server/CGameHandler.cpp

+ 1 - 1
AI/VCAI/VCAI.cpp

@@ -3771,7 +3771,7 @@ int3 SectorMap::firstTileToGet(HeroPtr h, crint3 dst)
 
 					shipyards.erase(boost::remove_if(shipyards, [=](const IShipyard *shipyard) -> bool
 					{
-						return shipyard->state() != 0 || retreiveTile(shipyard->bestLocation()) != sectorToReach->id;
+						return shipyard->shipyardStatus() != 0 || retreiveTile(shipyard->bestLocation()) != sectorToReach->id;
 					}),shipyards.end());
 
 					if(!shipyards.size())

+ 2 - 1
client/CCastleInterface.cpp

@@ -604,7 +604,8 @@ void CCastleBuildings::buildingClicked(BuildingID building)
 				break;
 
 		case BuildingID::SHIPYARD:
-				LOCPLINT->showShipyardDialog(town);
+				if(town->shipyardStatus() == IBoatGenerator::GOOD)
+					LOCPLINT->showShipyardDialog(town);
 				break;
 
 		case BuildingID::FORT:

+ 2 - 2
client/CPlayerInterface.cpp

@@ -1497,7 +1497,7 @@ void CPlayerInterface::waitWhileDialog(bool unlockPim /*= true*/)
 void CPlayerInterface::showShipyardDialog(const IShipyard *obj)
 {
 	EVENT_HANDLER_CALLED_BY_CLIENT;
-	auto state = obj->state();
+	auto state = obj->shipyardStatus();
 	std::vector<si32> cost;
 	obj->getBoatCost(cost);
 	CShipyardWindow *csw = new CShipyardWindow(cost, state, obj->getBoatType(), [=]{ cb->buildBoat(obj); });
@@ -2316,7 +2316,7 @@ void CPlayerInterface::showQuestLog()
 
 void CPlayerInterface::showShipyardDialogOrProblemPopup(const IShipyard *obj)
 {
-	if(obj->state() != IBoatGenerator::GOOD)
+	if(obj->shipyardStatus() != IBoatGenerator::GOOD)
 	{
 		MetaString txt;
 		obj->getProblemText(txt);

+ 1 - 1
lib/CGameState.cpp

@@ -1347,7 +1347,7 @@ void CGameState::init(StartInfo * si)
 				vti->builtBuildings.insert(BuildingID::DWELL_LVL_2);
 		}
 
-		if (vstd::contains(vti->builtBuildings, BuildingID::SHIPYARD) && vti->state()==IBoatGenerator::TILE_BLOCKED)
+		if (vstd::contains(vti->builtBuildings, BuildingID::SHIPYARD) && vti->shipyardStatus()==IBoatGenerator::TILE_BLOCKED)
 			vti->builtBuildings.erase(BuildingID::SHIPYARD);//if we have harbor without water - erase it (this is H3 behaviour)
 
 		//init hordes

+ 3 - 3
lib/CObjectHandler.cpp

@@ -6744,7 +6744,7 @@ int3 IBoatGenerator::bestLocation() const
 	return int3 (-1,-1,-1);
 }
 
-IBoatGenerator::EGeneratorState IBoatGenerator::state() const
+IBoatGenerator::EGeneratorState IBoatGenerator::shipyardStatus() const
 {
 	int3 tile = bestLocation();
 	const TerrainTile *t = IObjectInterface::cb->getTile(tile);
@@ -6772,7 +6772,7 @@ IBoatGenerator::IBoatGenerator(const CGObjectInstance *O)
 
 void IBoatGenerator::getProblemText(MetaString &out, const CGHeroInstance *visitor) const
 {
-	switch(state())
+	switch(shipyardStatus())
 	{
 	case BOAT_ALREADY_BUILT:
 		out.addTxt(MetaString::GENERAL_TXT, 51);
@@ -6848,7 +6848,7 @@ void CGShipyard::onHeroVisit( const CGHeroInstance * h ) const
 	if(!cb->gameState()->getPlayerRelations(tempOwner, h->tempOwner))
 		cb->setOwner(this, h->tempOwner);
 
-	auto s = state();
+	auto s = shipyardStatus();
 	if(s != IBoatGenerator::GOOD)
 	{
 		InfoWindow iw;

+ 1 - 1
lib/CObjectHandler.h

@@ -140,7 +140,7 @@ public:
 	int3 bestLocation() const; //returns location when the boat should be placed
 
 	enum EGeneratorState {GOOD, BOAT_ALREADY_BUILT, TILE_BLOCKED, NO_WATER};
-	EGeneratorState state() const; //0 - can buid, 1 - there is already a boat at dest tile, 2 - dest tile is blocked, 3 - no water
+	EGeneratorState shipyardStatus() const; //0 - can buid, 1 - there is already a boat at dest tile, 2 - dest tile is blocked, 3 - no water
 	void getProblemText(MetaString &out, const CGHeroInstance *visitor = nullptr) const;
 };
 

+ 1 - 1
server/CGameHandler.cpp

@@ -4931,7 +4931,7 @@ bool CGameHandler::buildBoat( ObjectInstanceID objid )
 {
 	const IShipyard *obj = IShipyard::castFrom(getObj(objid));
 
-	if(obj->state() != IBoatGenerator::GOOD)
+	if(obj->shipyardStatus() != IBoatGenerator::GOOD)
 	{
 		complain("Cannot build boat in this shipyard!");
 		return false;