new

an anonymous user · March 01, 2025
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <functional>

struct ITool {
    virtual ~ITool() = default;
    virtual void processPick(int x, int y) = 0;
    virtual void update(int i){};
};

struct ToolManager {
    ITool* getActiveTool() {
        if(m_tool_builders.find(m_active_tool_name) == m_tool_builders.end())
            return nullptr;
        return m_tool_builders[m_active_tool_name];
    }

    std::string m_active_tool_name = "";
    std::map<std::string, ITool*> m_tool_builders;     
};

ToolManager g_toolManager;

struct ToolCollectInRadius : public ITool {
    void processPick(int x, int y) override {
        std::cout << "From ToolCollectInRadius\n";
        collectItems();
        std::cout << '\t'; for(int i : m_items) std::cout << i << ','; std::cout << '\n';
    }
    void update(int i) override {
        m_radius += i;
    }
    virtual void collectItems() {
        for(int i = 0; i < m_radius; ++i)
            m_items.push_back(i);
        std::cout << "\tadded items in radius " << m_radius << '\n';
    }
    
    float m_radius = 0;
    std::vector<int> m_items;
};

struct ToolAllign : public ToolCollectInRadius {
    void processPick(int x, int y) override  {
        std::cout << "From ToolAllign\n";
        collectItems();
        std::cout << "\talign " << m_items.size() << " items \n";
    }
};

struct ToolInstancer : public ITool {
    void processPick(int x, int y) override  {
        std::cout << "From ToolInstancer\n";
        for(auto& item : items) std::cout << "\tspawn item: " << item << '\n';
    }
    void update(int i) override {
        items.push_back(std::to_string(i));
    }

    std::vector<std::string> items;
};

void processClick(int x, int y) {
    if (auto active_tool = g_toolManager.getActiveTool())
        active_tool->processPick(x, y);
}

void update_tool(int i) {
    if (auto active_tool = g_toolManager.getActiveTool())
        active_tool->update(i);
}
int main() {
    g_toolManager.m_tool_builders["collect_in_radius"] = new ToolCollectInRadius();
    g_toolManager.m_tool_builders["allign"] = new ToolAllign();
    g_toolManager.m_tool_builders["instancer"] = new ToolInstancer();

    g_toolManager.m_active_tool_name = "collect_in_radius";
    update_tool(8);
    processClick(10, 10);

    g_toolManager.m_active_tool_name = "allign";
    update_tool(15);
    processClick(10, 10);

    g_toolManager.m_active_tool_name = "instancer";
    update_tool(10);
    processClick(10, 10);
    
    g_toolManager.m_active_tool_name = "collect_in_radius";
    processClick(10, 10);
    
    g_toolManager.m_active_tool_name = "instancer";
    update_tool(100);
    processClick(10, 10); }
Output

Comments

Please sign up or log in to contribute to the discussion.