1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-10-08 23:22:25 +02:00

fix prices

This commit is contained in:
Laserlicht
2025-09-14 15:04:02 +02:00
parent 62ca532291
commit ded1a70dd7
8 changed files with 53 additions and 23 deletions

View File

@@ -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:

View File

@@ -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
}

View File

@@ -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"
}
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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

View File

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

View File

@@ -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;