#ifndef CHARACTER_MANAGER_CLASS #define CHARACTER_MANAGER_CLASS #include #include #include #include class Character; class Rig; class Animation; class HitboxSystem; struct CharacterTemplate; class CharacterManager { public: CharacterManager(); ~CharacterManager(); Rig* LoadRig(const std::string& name, const std::string& path); Animation* LoadAnimation(const std::string& name, const std::string& path, const std::string& rigName = ""); Character* CreateCharacter(const std::string& name, const std::string& rigName = "", const std::string& animationName = ""); // A new kind of fighter to fill in, or the one already called name CharacterTemplate* AddTemplate(const std::string& name); CharacterTemplate* GetTemplate(const std::string& name) const; const std::vector& GetTemplates() const { return templateOrder; } // in the order they were added // A character that's the template called templateName, see Character::ApplyTemplate. nullptr if there's no such template. Character* CreateCharacterFromTemplate(const std::string& name, const std::string& templateName); Rig* GetRig(const std::string& name) const; Animation* GetAnimation(const std::string& name) const; Character* GetCharacter(const std::string& name) const; // Every character's mind decides its actions for this frame void Think(); void Step(float dt); // Puts out the hitbox of every swing that can connect this frame, after Step void AddAttackHitboxes(HitboxSystem& hitboxes); const std::vector& GetCharacters() const { return characterOrder; } private: std::unordered_map> rigs; std::unordered_map> animations; std::unordered_map> templates; std::unordered_map> characters; std::vector characterOrder; std::vector templateOrder; }; #endif