#pragma once #include "StarRoot.hpp" #include "StarAssets.hpp" #include "StarTtlCache.hpp" namespace Star { STAR_STRUCT(Tenant); STAR_CLASS(TenantDatabase); STAR_EXCEPTION(TenantException, StarException); struct TenantNpcSpawnable { List species; String type; Maybe level; Maybe overrides; }; struct TenantMonsterSpawnable { String type; Maybe level; Maybe overrides; }; typedef MVariant TenantSpawnable; struct TenantRent { Vec2F periodRange; String pool; }; struct Tenant { bool criteriaSatisfied(StringMap const& colonyTags) const; String name; float priority; // The colonyTag multiset the house must contain in order to satisfy this // tenant. StringMap colonyTagCriteria; List tenants; Maybe rent; // The Json this tenant was parsed from Json config; }; class TenantDatabase { public: TenantDatabase(); void cleanup(); TenantPtr getTenant(String const& name) const; // Return the list of all tenants for which colonyTags is a superset of // colonyTagCriteria List getMatchingTenants(StringMap const& colonyTags) const; private: static TenantPtr readTenant(String const& path); Map m_paths; mutable Mutex m_cacheMutex; mutable HashTtlCache m_tenantCache; }; }