1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Merge pull request #3303 from IvanSavenko/artifact_randomization_fix

Remove allowed artifacts list from arthandler
This commit is contained in:
Ivan Savenko 2023-12-11 18:23:19 +02:00 committed by GitHub
commit afff10aab0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 11 additions and 22 deletions

View File

@ -625,7 +625,7 @@ void CArtHandler::makeItCommanderArt(CArtifact * a, bool onlyCommander)
a->possibleSlots[ArtBearer::COMMANDER].push_back(ArtifactPosition(slot));
}
bool CArtHandler::legalArtifact(const ArtifactID & id)
bool CArtHandler::legalArtifact(const ArtifactID & id) const
{
auto art = id.toArtifact();
//assert ( (!art->constituents) || art->constituents->size() ); //artifacts is not combined or has some components
@ -648,18 +648,6 @@ bool CArtHandler::legalArtifact(const ArtifactID & id)
return false;
}
void CArtHandler::initAllowedArtifactsList(const std::set<ArtifactID> & allowed)
{
allowedArtifacts.clear();
for (ArtifactID i : allowed)
{
if (legalArtifact(ArtifactID(i)))
allowedArtifacts.push_back(i.toArtifact());
//keep im mind that artifact can be worn by more than one type of bearer
}
}
std::set<ArtifactID> CArtHandler::getDefaultAllowed() const
{
std::set<ArtifactID> allowedArtifacts;

View File

@ -141,15 +141,11 @@ public:
class DLL_LINKAGE CArtHandler : public CHandlerBase<ArtifactID, Artifact, CArtifact, ArtifactService>
{
public:
/// List of artifacts allowed on the map
std::vector<const CArtifact *> allowedArtifacts;
void addBonuses(CArtifact *art, const JsonNode &bonusList);
static CArtifact::EartClass stringToClass(const std::string & className); //TODO: rework EartClass to make this a constructor
bool legalArtifact(const ArtifactID & id);
void initAllowedArtifactsList(const std::set<ArtifactID> & allowed);
bool legalArtifact(const ArtifactID & id) const;
static void makeItCreatureArt(CArtifact * a, bool onlyCreature = true);
static void makeItCommanderArt(CArtifact * a, bool onlyCommander = true);

View File

@ -384,8 +384,9 @@ namespace JsonRandom
ArtifactID loadArtifact(const JsonNode & value, CRandomGenerator & rng, const Variables & variables)
{
std::set<ArtifactID> allowedArts;
for (auto const * artifact : VLC->arth->allowedArtifacts)
allowedArts.insert(artifact->getId());
for(const auto & artifact : VLC->arth->objects)
if (IObjectInterface::cb->isAllowed(artifact->getId()) && VLC->arth->legalArtifact(artifact->getId()))
allowedArts.insert(artifact->getId());
std::set<ArtifactID> potentialPicks = filterKeys(value, allowedArts, variables);

View File

@ -195,7 +195,6 @@ void CGameState::init(const IMapService * mapService, StartInfo * si, Load::Prog
logGlobal->error("Wrong mode: %d", static_cast<int>(scenarioOps->mode));
return;
}
VLC->arth->initAllowedArtifactsList(map->allowedArtifact);
logGlobal->info("Map loaded!");
checkMapChecksum();
@ -1947,8 +1946,13 @@ ArtifactID CGameState::pickRandomArtifact(CRandomGenerator & rand, int flags, st
std::set<ArtifactID> potentialPicks;
// Select artifacts that satisfy provided criterias
for (auto const * artifact : VLC->arth->allowedArtifacts)
for (auto const & artifactID : map->allowedArtifact)
{
if (!VLC->arth->legalArtifact(artifactID))
continue;
auto const * artifact = artifactID.toArtifact();
assert(artifact->aClass != CArtifact::ART_SPECIAL); // should be filtered out when allowedArtifacts is initialized
if ((flags & CArtifact::ART_TREASURE) == 0 && artifact->aClass == CArtifact::ART_TREASURE)