Files
DarkflameServer/dGame/dMission/MissionPrerequisites.h
David Markowitz 4a9971d182 fix: racing meta missions and undefined behavior in mission progression
Tested that missions can still be completed
Tested that racing meta tasks are now actually possible
TODO: Tested that old characters with incomplete meta missions are brought up to speed with their current progress
2025-11-19 22:18:57 -08:00

59 lines
1.9 KiB
C++

#pragma once
#include <vector>
#include <string>
#include <map>
#include "Mission.h"
/**
* An expression that checks if a mission may be accepted or not
*/
class PrerequisiteExpression final
{
bool m_or;
uint32_t a;
uint32_t sub;
PrerequisiteExpression* b;
public:
/**
* Executes the prerequisite, checking its contents and returning whether or not the mission may be accepted
* @param missions the list of missions to check the prerequisites against (f.e. whether they're completed)
* @return whether or not all the prerequisites are met
*/
bool Execute(const std::map<uint32_t, Mission*>& missions) const;
explicit PrerequisiteExpression(const std::string& str);
~PrerequisiteExpression();
};
/**
* Utility class for checking whether or not a mission can be accepted using its prerequisites
*/
class MissionPrerequisites final
{
public:
/**
* Checks whether or not the mission identified by the specified ID can be accepted based on the mission inventory passed.
* Also performs checks for daily missions (e.g. if the time out is valid).
* @param missionId the mission ID to check prerequisites for
* @param missions the mission inventory to check the prerequisites against
* @return whether or not the mission identified by the specified ID can be accepted
*/
static bool CanAccept(uint32_t missionId, const std::map<uint32_t, Mission*>& missions);
private:
/**
* Cache of all the executed prerequisites
*/
static std::unordered_map<uint32_t, PrerequisiteExpression*> expressions;
/**
* Checks the prerequisites for a mission
* @param missionId the mission ID to check prerequisites for
* @param missions the mission inventory to check the prerequisites against
* @return whether or not the mission identified by the specified ID can be accepted
*/
static bool CheckPrerequisites(uint32_t missionId, const std::map<uint32_t, Mission*>& missions);
};