diff --git a/lib/CCreatureHandler.cpp b/lib/CCreatureHandler.cpp index 3292317f6..7ac3e6f1b 100644 --- a/lib/CCreatureHandler.cpp +++ b/lib/CCreatureHandler.cpp @@ -963,9 +963,6 @@ void CCreatureHandler::loadStackExperience(CCreature * creature, const JsonNode { for (const JsonNode &exp : input.Vector()) { - auto bonus = JsonUtils::parseBonus (exp["bonus"]); - bonus->source = Bonus::STACK_EXPERIENCE; - bonus->duration = Bonus::PERMANENT; const JsonVector &values = exp["values"].Vector(); int lowerLimit = 1;//, upperLimit = 255; if (values[0].getType() == JsonNode::JsonType::DATA_BOOL) @@ -974,8 +971,14 @@ void CCreatureHandler::loadStackExperience(CCreature * creature, const JsonNode { if(val.Bool()) { + // parse each bonus separately + // we can not create copies since identifiers resolution does not tracks copies + // leading to unset identifier values in copies + auto bonus = JsonUtils::parseBonus (exp["bonus"]); + bonus->source = Bonus::STACK_EXPERIENCE; + bonus->duration = Bonus::PERMANENT; bonus->limiter = std::make_shared(RankRangeLimiter(lowerLimit)); - creature->addNewBonus (std::make_shared(*bonus)); //bonuses must be unique objects + creature->addNewBonus (bonus); break; //TODO: allow bonuses to turn off? } ++lowerLimit; @@ -988,9 +991,14 @@ void CCreatureHandler::loadStackExperience(CCreature * creature, const JsonNode { if (val.Float() != lastVal) { - bonus->val = static_cast(val.Float()) - lastVal; + JsonNode bonusInput = exp["bonus"]; + bonusInput["val"].Float() = static_cast(val.Float()) - lastVal; + + auto bonus = JsonUtils::parseBonus (bonusInput); + bonus->source = Bonus::STACK_EXPERIENCE; + bonus->duration = Bonus::PERMANENT; bonus->limiter.reset (new RankRangeLimiter(lowerLimit)); - creature->addNewBonus (std::make_shared(*bonus)); + creature->addNewBonus (bonus); } lastVal = static_cast(val.Float()); ++lowerLimit;