#pragma once #include "goap.hpp" #include "ai.hpp" #include "config.hpp" #include "dinkyecs.hpp" namespace ritual { using JunkItem = std::string; struct JunkPile { std::vector contents; }; enum class Element { NONE=0, FIRE=1, LIGHTNING=2 }; enum class Kind { NONE=0, PHYSICAL=1, MAGICK=2 }; struct CraftingState { std::string script; ai::State start; ai::State original; ai::State goal; ai::ActionPlan plan; CraftingState(std::string script, ai::State start, ai::State goal) : script(script), start(start), original(start), goal(goal) { } CraftingState() {}; bool will_do(std::string name); void dump(); ai::Action pop(); bool is_combined(); void reset(); }; struct Action { float probability = 1.0f; int damage = 0; Kind kind{Kind::NONE}; Element element{Element::NONE}; std::vector names; void dump(); }; struct Engine { Config $config; ai::AIProfile $profile; std::unordered_map $actions; std::unordered_map $states; std::unordered_map> $scripts; Engine(std::string config_path="assets/rituals.json"); ai::State load_state(std::string name); ai::Action load_action(std::string name); CraftingState start(); void set_state(CraftingState& ritual, std::string name, bool setting); void plan(CraftingState& ritual); Action finalize(CraftingState& ritual); void load_junk(CraftingState& ritual, const JunkItem& item); }; struct Belt { int next_slot = 0; int max_slots = 6; std::unordered_map equipped; Action& get(int index); void equip(int index, Action& action); bool has(int index); void unequip(int index); int next(); }; struct Blanket { size_t entity_counter = 0; std::unordered_map contents; std::unordered_map selected; DinkyECS::Entity add(JunkItem name); JunkItem& get(DinkyECS::Entity ent); bool has(DinkyECS::Entity ent); void remove(DinkyECS::Entity ent); void select(DinkyECS::Entity ent); void deselect(DinkyECS::Entity ent); void reset(); bool is_selected(DinkyECS::Entity ent); bool no_selections(); void consume_crafting(); }; }