| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | ** EPITECH PROJECT, 2024 | ||
| 3 | ** zappy/ai | ||
| 4 | ** File description: | ||
| 5 | ** Forker.cpp | ||
| 6 | */ | ||
| 7 | |||
| 8 | #include "Forker.hpp" | ||
| 9 | #include "SimpleBot.hpp" | ||
| 10 | |||
| 11 | ✗ | void Forker::initChild() | |
| 12 | { | ||
| 13 | ✗ | std::cout << "🍴✅ Forker initialized" << std::endl; | |
| 14 | ✗ | } | |
| 15 | |||
| 16 | ✗ | void Forker::forkNewBot() | |
| 17 | { | ||
| 18 | ✗ | pid_t pid = fork(); | |
| 19 | |||
| 20 | ✗ | if (pid == -1) | |
| 21 | { | ||
| 22 | ✗ | std::cerr << "Fork failed" << std::endl; | |
| 23 | ✗ | return; | |
| 24 | } | ||
| 25 | |||
| 26 | ✗ | if (pid == 0) | |
| 27 | { | ||
| 28 | // TODO: use cpp function | ||
| 29 | // without term | ||
| 30 | // execl("./zappy_ai", "./zappy_ai", "-p", std::to_string(_port).c_str(), "-n", _teamName.c_str(), "-h", _host.c_str(), nullptr); | ||
| 31 | |||
| 32 | // with term that close | ||
| 33 | // execl("/usr/bin/gnome-terminal", "/usr/bin/gnome-terminal", "--", "./zappy_ai", "-p", std::to_string(_port).c_str(), "-n", _teamName.c_str(), "-h", _host.c_str(), nullptr); | ||
| 34 | |||
| 35 | // with term that stay open | ||
| 36 | ✗ | execl("/usr/bin/gnome-terminal", "/usr/bin/gnome-terminal", "--", "bash", "-c", | |
| 37 | ✗ | ("trap 'echo \"[DEBUG]\"; kill -INT $$' SIGINT; ./zappy_ai -p " + std::to_string(_port) + " -n " + _teamName + " -h " + _host + "; exec bash").c_str(), nullptr); | |
| 38 | |||
| 39 | ✗ | std::cerr << "execl failed" << std::endl; | |
| 40 | while (1) | ||
| 41 | ; | ||
| 42 | } | ||
| 43 | else | ||
| 44 | { | ||
| 45 | ✗ | std::string msg = "you_are_bot=" + std::to_string(_idBot) + "your_job=" + jobMap[SIMPLE_BOT] + "currentMessageId=" + std::to_string(_currentMessageId); | |
| 46 | // sleep(1); | ||
| 47 | ✗ | addBroadcastAction(msg); | |
| 48 | |||
| 49 | ✗ | wait(nullptr); | |
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | ✗ | void Forker::updateStrategy() | |
| 54 | { | ||
| 55 | static unsigned int limitFork = 2; // TODO: it is to debug | ||
| 56 | static bool verifySlot = true; | ||
| 57 | |||
| 58 | ✗ | std::cout << "🍴 Forker updateStrategy" << std::endl; | |
| 59 | ✗ | if (verifySlot) | |
| 60 | { | ||
| 61 | ✗ | _state.slot = 0; | |
| 62 | ✗ | queue.push_back(std::make_pair([&]() | |
| 63 | ✗ | { doAction(CONNECT_NBR, ""); }, "CONNECT_NBR")); | |
| 64 | ✗ | verifySlot = false; | |
| 65 | } | ||
| 66 | ✗ | else if (handleSurvive()) | |
| 67 | return; | ||
| 68 | ✗ | else if ((_state.state == FORKED || _state.slot > 0) && limitFork > 0) | |
| 69 | { | ||
| 70 | ✗ | forkNewBot(); | |
| 71 | // TODO: try to put a sleep because server doesn't handle multiple fork in chain sleep(2); | ||
| 72 | ✗ | _idBot++; | |
| 73 | ✗ | _state.slot--; | |
| 74 | ✗ | limitFork--; | |
| 75 | } | ||
| 76 | ✗ | else if (_state.slot == 0 && limitFork > 0) | |
| 77 | { | ||
| 78 | ✗ | queue.push_back(std::make_pair([&]() | |
| 79 | ✗ | { doAction(FORK, ""); }, "FORK")); | |
| 80 | } | ||
| 81 | } | ||
| 82 | |||
| 83 | ✗ | bool Forker::handleSurvive() | |
| 84 | { | ||
| 85 | static int searchFood = 0; | ||
| 86 | const int limitFood = 50; | ||
| 87 | |||
| 88 | ✗ | if (_iteration % 40 == 0) | |
| 89 | { | ||
| 90 | ✗ | _state.state = STANDARD; | |
| 91 | ✗ | queue.push_back({[&]() | |
| 92 | ✗ | { doAction(INVENTORY, ""); }, "INVENTORY"}); | |
| 93 | ✗ | return true; | |
| 94 | } | ||
| 95 | |||
| 96 | ✗ | if (_state.ressources.food < limitFood) | |
| 97 | { | ||
| 98 | // TODO: we want differant searchFood for each level ? | ||
| 99 | ✗ | searchFood = 250; | |
| 100 | } | ||
| 101 | ✗ | if (searchFood > 0) | |
| 102 | { | ||
| 103 | ✗ | if (searchFood == 1) | |
| 104 | ✗ | queue.push_back({[&]() | |
| 105 | ✗ | { doAction(INVENTORY, ""); }, "INVENTORY"}); | |
| 106 | else | ||
| 107 | ✗ | survive(); | |
| 108 | ✗ | _state.state = STANDARD; | |
| 109 | ✗ | _state.pattern = "survive"; | |
| 110 | ✗ | searchFood--; | |
| 111 | ✗ | return true; | |
| 112 | } | ||
| 113 | return false; | ||
| 114 | } | ||
| 115 |