-
Notifications
You must be signed in to change notification settings - Fork 1
/
MyBotLogic.cpp
131 lines (105 loc) · 4.34 KB
/
MyBotLogic.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "MyBotLogic.h"
#include "TurnInfo.h"
#include "NPCInfo.h"
#include "LevelInfo.h"
#include "MyBotLogic/Tools/Minuteur.h"
#include "MyBotLogic/Tools/Profiler.h"
#include "Windows.h"
#include <sstream>
#include <thread>
#include <future>
#include <functional>
using std::stringstream;
using std::endl;
using std::to_string;
MyBotLogic::MyBotLogic() :
logpath{ "" }
{
//Write Code Here
}
/*virtual*/ MyBotLogic::~MyBotLogic()
{
//Write Code Here
}
/*virtual*/ void MyBotLogic::Configure(int argc, char *argv[], const string& _logpath)
{
#ifdef BOT_LOGIC_DEBUG
mLogger.Init(_logpath, "MyBotLogic.log");
#endif
BOT_LOGIC_LOG(mLogger, "Configure", true);
/* _logpath =
C:\Users\dusa2404\Documents\IA\IABootCamp\AIBot_v0.59\\LocalMatchResults\aibotlog
*/
logpath = _logpath;
//Write Code Here
}
/*virtual*/ void MyBotLogic::Start()
{
//Write Code Here
}
/*virtual*/ void MyBotLogic::Init(LevelInfo& _levelInfo)
{
// On crée notre modèle du jeu en cours !
auto pre = Minuteur::now();
// Le logger
GameManager::setLog(logpath, "MyLog.log");
GameManager::setLogRelease(logpath, "MyLogRelease.log");
manager.Init(_levelInfo);
manager.InitializeBehaviorTree();
auto post = Minuteur::now();
// On associe à chaque npc son objectif !
stringstream ss;
ss << "Durée Initialisation = " << Minuteur::dureeMicroseconds(pre, post) / 1000.f << "ms";
LOG(ss.str());
tempsAvantServeur = Minuteur::now();
}
/*virtual*/ void MyBotLogic::OnGameStarted()
{
//Write Code Here
}
/*virtual*/ void MyBotLogic::FillActionList(TurnInfo& _turnInfo, vector<Action*>& _actionList)
{
ProfilerDebug profiler{ GameManager::getLogger(), "Tour" };
ProfilerRelease profilerRelease{ GameManager::getLoggerRelease(), "Tour", true, false, manager.TEMPS_ACCORDE_TOUR };
profiler << "TURN =========================== " << _turnInfo.turnNb << endl;
profilerRelease << "TURN =========================== " << _turnInfo.turnNb << endl;
tempsApresServeur = Minuteur::now();
profilerRelease << "Duree serveur : " << duration_cast<milliseconds>(tempsApresServeur - tempsAvantServeur).count() << " ms" << endl;
if (manager.etatFloodFill == GameManager::FonctionEtat::PAS_COMMENCE
&& manager.etatExecute == GameManager::FonctionEtat::PAS_COMMENCE) {
// On complete notre modele avec l'information qu'on vient de decouvrir !
manager.updateModel(_turnInfo, *this);
}
manager.etatFloodFill = (manager.floodFillFinished(*this)) ? GameManager::FonctionEtat::CALCULE_PAS_UTILISE : GameManager::FonctionEtat::EN_COURS;
if (manager.etatFloodFill == GameManager::FonctionEtat::CALCULE_PAS_UTILISE
&& manager.etatExecute == GameManager::FonctionEtat::PAS_COMMENCE) {
// On definit notre strategie en executant notre arbre de comportement
manager.execute(*this);
}
if (manager.etatFloodFill == GameManager::FonctionEtat::CALCULE_PAS_UTILISE) {
manager.etatExecute = (manager.executeFinished(*this)) ? GameManager::FonctionEtat::CALCULE_PAS_UTILISE : GameManager::FonctionEtat::EN_COURS;
}
if (manager.etatFloodFill == GameManager::FonctionEtat::CALCULE_PAS_UTILISE
&& manager.etatExecute == GameManager::FonctionEtat::CALCULE_PAS_UTILISE) {
// On fait se deplacer chaque Npc vers son objectif associe =)
manager.moveNpcs(_actionList);
manager.etatExecute = GameManager::FonctionEtat::PAS_COMMENCE;
manager.etatFloodFill = GameManager::FonctionEtat::PAS_COMMENCE;
}
if (manager.etatFloodFill == GameManager::FonctionEtat::EN_COURS
|| manager.etatExecute == GameManager::FonctionEtat::EN_COURS) {
microseconds tempsDepuisDebutTour = duration_cast<microseconds>(Minuteur::now() - tempsApresServeur);
microseconds dureeSleep = manager.TEMPS_ACCORDE_TOUR;
if (tempsDepuisDebutTour < dureeSleep) {
auto tempsAvantSleep = Minuteur::now();
//profilerRelease << "On voudrait dormir pendant " << (dureeSleep - tempsDepuisDebutTour).count() << " us" << endl;
while (duration_cast<microseconds>(Minuteur::now() - tempsApresServeur) < dureeSleep);
//profilerRelease << "On a dormis pendant " << duration_cast<microseconds>(Minuteur::now() - tempsAvantSleep).count() << " us" << endl;
}
}
tempsAvantServeur = Minuteur::now();
}
/*virtual*/ void MyBotLogic::Exit()
{
//Write Code Here
}