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 |
|
|
|