Browse Source

fix prices

Laserlicht 1 month ago
parent
commit
ded1a70dd7

+ 2 - 1
AI/Nullkiller/AIUtility.cpp

@@ -15,6 +15,7 @@
 #include "../../lib/UnlockGuard.h"
 #include "../../lib/CConfigHandler.h"
 #include "../../lib/entities/artifact/CArtifact.h"
+#include "../../lib/entities/ResourceTypeHandler.h"
 #include "../../lib/mapObjects/MapObjects.h"
 #include "../../lib/mapObjects/CQuest.h"
 #include "../../lib/mapping/TerrainTile.h"
@@ -470,7 +471,7 @@ int32_t getArtifactBonusScoreImpl(const std::shared_ptr<Bonus> & bonus)
 		case BonusType::UNDEAD_RAISE_PERCENTAGE:
 			return bonus->val * 400;
 		case BonusType::GENERATE_RESOURCE:
-			return bonus->val * LIBRARY->objh->resVals.at(bonus->subtype.as<GameResID>().getNum()) * 10;
+			return bonus->val * LIBRARY->resourceTypeHandler->getById(bonus->subtype.as<GameResID>())->getPrice() * 10;
 		case BonusType::SPELL_DURATION:
 			return bonus->val * 200;
 		case BonusType::MAGIC_RESISTANCE:

+ 16 - 0
config/resources.json

@@ -1,40 +1,56 @@
 {
 	"wood": {
+		"index" : 0,
+		"name": "Wood",
 		"price": 250
 
 	},
 	
 	"mercury": {
+		"index" : 1,
+		"name": "Mercury",
 		"price": 500
 
 	},
 	
 	"ore": {
+		"index" : 2,
+		"name": "Ore",
 		"price": 250
 
 	},
 	
 	"sulfur": {
+		"index" : 3,
+		"name": "Sulfur",
 		"price": 500
 
 	},
 	
 	"crystal": {
+		"index" : 4,
+		"name": "Crystal",
 		"price": 500
 
 	},
 	
 	"gems": {
+		"index" : 5,
+		"name": "Gems",
 		"price": 500
 
 	},
 	
 	"gold": {
+		"index" : 6,
+		"name": "Gold",
 		"price": 1
 
 	},
 	
 	"mithril": {
+		"index" : 7,
+		"name": "Mithril",
 		"price": 0
 
 	}

+ 22 - 0
config/schemas/resources.json

@@ -0,0 +1,22 @@
+{
+	"type" : "object",
+	"$schema" : "http://json-schema.org/draft-04/schema",
+	"title" : "VCMI resources format",
+	"description" : "Format used to define new resources in VCMI",
+	"required" : [ "name", "price" ],
+	"additionalProperties" : false,
+	"properties" : {
+		"index" : {
+			"type" : "number",
+			"description" : "numeric id of h3 resource, prohibited for new resources"
+		},
+		"name" : {
+			"type" : "string",
+			"description" : "Localizable name of this resource"
+		},
+		"price" : {
+			"type" : "number",
+			"description" : "Price of resource in gold"
+		}
+	}
+}

+ 2 - 2
lib/ResourceSet.cpp

@@ -13,7 +13,7 @@
 #include "ResourceSet.h"
 #include "constants/StringConstants.h"
 #include "serializer/JsonSerializeFormat.h"
-#include "mapObjects/CObjectHandler.h"
+#include "entities/ResourceTypeHandler.h"
 #include "GameLibrary.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
@@ -98,7 +98,7 @@ TResourceCap ResourceSet::marketValue() const
 {
 	TResourceCap total = 0;
 	for(int i = 0; i < GameConstants::RESOURCE_QUANTITY; i++)
-		total += static_cast<TResourceCap>(LIBRARY->objh->resVals[i]) * static_cast<TResourceCap>(operator[](i));
+		total += static_cast<TResourceCap>(LIBRARY->resourceTypeHandler->getById(i)->getPrice()) * static_cast<TResourceCap>(operator[](i));
 	return total;
 }
 

+ 5 - 5
lib/entities/ResourceTypeHandler.cpp

@@ -20,7 +20,7 @@ VCMI_LIB_NAMESPACE_BEGIN
 
 std::string resources::ResourceType::getNameTextID() const
 {
-	return TextIdentifier( "resourceType", modScope, identifier, "name" ).get();
+	return TextIdentifier( "resources", modScope, identifier, "name" ).get();
 }
 
 std::string resources::ResourceType::getNameTranslated() const
@@ -54,22 +54,22 @@ std::shared_ptr<resources::ResourceType> ResourceTypeHandler::loadObjectImpl(std
 void ResourceTypeHandler::loadObject(std::string scope, std::string name, const JsonNode & data)
 {
 	objects.push_back(loadObjectImpl(scope, name, data, objects.size()));
-	registerObject(scope, "resourceType", name, objects.back()->getIndex());
+	registerObject(scope, "resources", name, objects.back()->getIndex());
 }
 
 void ResourceTypeHandler::loadObject(std::string scope, std::string name, const JsonNode & data, size_t index)
 {
 	assert(objects[index] == nullptr); // ensure that this id was not loaded before
 	objects[index] = loadObjectImpl(scope, name, data, index);
-	registerObject(scope, "resourceType", name, objects[index]->getIndex());
+	registerObject(scope, "resources", name, objects[index]->getIndex());
 }
 
 std::vector<GameResID> ResourceTypeHandler::getAllObjects() const
 {
 	std::vector<GameResID> result;
 
-	for (const auto & school : objects)
-		result.push_back(school->id);
+	for (const auto & resource : objects)
+		result.push_back(resource->id);
 
 	return result;
 }

+ 0 - 7
lib/mapObjects/CObjectHandler.cpp

@@ -21,13 +21,6 @@ VCMI_LIB_NAMESPACE_BEGIN
 
 CObjectHandler::CObjectHandler()
 {
-	logGlobal->trace("\t\tReading resources prices ");
-	for(auto & res : LIBRARY->resourceTypeHandler->getAllObjects())
-	{
-		auto resType = LIBRARY->resourceTypeHandler->getById(res);
-		resVals[res] = static_cast<ui32>(resType->getPrice());
-	}
-	logGlobal->trace("\t\tDone loading resource prices!");
 }
 
 VCMI_LIB_NAMESPACE_END

+ 0 - 2
lib/mapObjects/CObjectHandler.h

@@ -19,8 +19,6 @@ class int3;
 class DLL_LINKAGE CObjectHandler
 {
 public:
-	std::map<GameResID, ui32> resVals; //default values of resources in gold
-
 	CObjectHandler();
 };
 

+ 6 - 6
lib/mapObjects/IMarket.cpp

@@ -13,10 +13,10 @@
 
 #include "CCreatureHandler.h"
 #include "CGObjectInstance.h"
-#include "CObjectHandler.h"
 
 #include "../GameLibrary.h"
 #include "../entities/artifact/CArtHandler.h"
+#include "../entities/ResourceTypeHandler.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
@@ -33,8 +33,8 @@ bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode)
 		{
 			double effectiveness = std::min((getMarketEfficiency() + 1.0) / 20.0, 0.5);
 
-			double r = LIBRARY->objh->resVals[id1]; //value of given resource
-			double g = LIBRARY->objh->resVals[id2] / effectiveness; //value of wanted resource
+			double r = LIBRARY->resourceTypeHandler->getById(id1)->getPrice(); //value of given resource
+			double g = LIBRARY->resourceTypeHandler->getById(id2)->getPrice() / effectiveness; //value of wanted resource
 
 			if(r>g) //if given resource is more expensive than wanted
 			{
@@ -54,7 +54,7 @@ bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode)
 			double effectiveness = effectivenessArray[std::min(getMarketEfficiency(), 8)];
 
 			double r = LIBRARY->creatures()->getByIndex(id1)->getRecruitCost(EGameResID::GOLD); //value of given creature in gold
-			double g = LIBRARY->objh->resVals[id2] / effectiveness; //value of wanted resource
+			double g = LIBRARY->resourceTypeHandler->getById(id2)->getPrice() / effectiveness; //value of wanted resource
 
 			if(r>g) //if given resource is more expensive than wanted
 			{
@@ -75,7 +75,7 @@ bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode)
 	case EMarketMode::RESOURCE_ARTIFACT:
 		{
 			double effectiveness = std::min((getMarketEfficiency() + 3.0) / 20.0, 0.6);
-			double r = LIBRARY->objh->resVals[id1]; //value of offered resource
+			double r = LIBRARY->resourceTypeHandler->getById(id1)->getPrice(); //value of offered resource
 			double g = LIBRARY->artifacts()->getByIndex(id2)->getPrice() / effectiveness; //value of bought artifact in gold
 
 			if(id1 != 6) //non-gold prices are doubled
@@ -89,7 +89,7 @@ bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode)
 		{
 			double effectiveness = std::min((getMarketEfficiency() + 3.0) / 20.0, 0.6);
 			double r = LIBRARY->artifacts()->getByIndex(id1)->getPrice() * effectiveness;
-			double g = LIBRARY->objh->resVals[id2];
+			double g = LIBRARY->resourceTypeHandler->getById(id2)->getPrice();
 
 // 			if(id2 != 6) //non-gold prices are doubled
 // 				r /= 2;