You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

DebugAPI.cpp 34 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. #include <optional>
  2. #include <string>
  3. #include "AI.h"
  4. #include "API.h"
  5. #include "utils.hpp"
  6. #include "structures.h"
  7. #undef GetMessage
  8. #undef SendMessage
  9. #undef PeekMessage
  10. #define PI 3.14159265358979323846
  11. StudentDebugAPI::StudentDebugAPI(ILogic& logic, bool file, bool print, bool warnOnly, int64_t playerID) :
  12. logic(logic)
  13. {
  14. std::string fileName = "logs/api-" + std::to_string(playerID) + "-log.txt";
  15. auto fileLogger = std::make_shared<spdlog::sinks::basic_file_sink_mt>(fileName, true);
  16. auto printLogger = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  17. std::string pattern = "[api " + std::to_string(playerID) + "] [%H:%M:%S.%e] [%l] %v";
  18. fileLogger->set_pattern(pattern);
  19. printLogger->set_pattern(pattern);
  20. if (file)
  21. fileLogger->set_level(spdlog::level::trace);
  22. else
  23. fileLogger->set_level(spdlog::level::off);
  24. if (print)
  25. printLogger->set_level(spdlog::level::info);
  26. else
  27. printLogger->set_level(spdlog::level::off);
  28. if (warnOnly)
  29. printLogger->set_level(spdlog::level::warn);
  30. logger = std::make_unique<spdlog::logger>("apiLogger", spdlog::sinks_init_list{fileLogger, printLogger});
  31. logger->flush_on(spdlog::level::warn);
  32. }
  33. TrickerDebugAPI::TrickerDebugAPI(ILogic& logic, bool file, bool print, bool warnOnly, int64_t playerID) :
  34. logic(logic)
  35. {
  36. std::string fileName = "logs/api-" + std::to_string(playerID) + "-log.txt";
  37. auto fileLogger = std::make_shared<spdlog::sinks::basic_file_sink_mt>(fileName, true);
  38. auto printLogger = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  39. std::string pattern = "[api" + std::to_string(playerID) + "] [%H:%M:%S.%e] [%l] %v";
  40. fileLogger->set_pattern(pattern);
  41. printLogger->set_pattern(pattern);
  42. if (file)
  43. fileLogger->set_level(spdlog::level::trace);
  44. else
  45. fileLogger->set_level(spdlog::level::off);
  46. if (print)
  47. printLogger->set_level(spdlog::level::info);
  48. else
  49. printLogger->set_level(spdlog::level::off);
  50. if (warnOnly)
  51. printLogger->set_level(spdlog::level::warn);
  52. logger = std::make_unique<spdlog::logger>("apiLogger", spdlog::sinks_init_list{fileLogger, printLogger});
  53. }
  54. void StudentDebugAPI::StartTimer()
  55. {
  56. startPoint = std::chrono::system_clock::now();
  57. std::time_t t = std::chrono::system_clock::to_time_t(startPoint);
  58. logger->info("=== AI.play() ===");
  59. logger->info("StartTimer: {}", std::ctime(&t));
  60. }
  61. void TrickerDebugAPI::StartTimer()
  62. {
  63. startPoint = std::chrono::system_clock::now();
  64. std::time_t t = std::chrono::system_clock::to_time_t(startPoint);
  65. logger->info("=== AI.play() ===");
  66. logger->info("StartTimer: {}", std::ctime(&t));
  67. }
  68. void StudentDebugAPI::EndTimer()
  69. {
  70. logger->info("Time elapsed: {}ms", Time::TimeSinceStart(startPoint));
  71. }
  72. void TrickerDebugAPI::EndTimer()
  73. {
  74. logger->info("Time elapsed: {}ms", Time::TimeSinceStart(startPoint));
  75. }
  76. int StudentDebugAPI::GetFrameCount() const
  77. {
  78. return logic.GetCounter();
  79. }
  80. int TrickerDebugAPI::GetFrameCount() const
  81. {
  82. return logic.GetCounter();
  83. }
  84. std::future<bool> StudentDebugAPI::Move(int64_t timeInMilliseconds, double angleInRadian)
  85. {
  86. logger->info("Move: timeInMilliseconds = {}, angleInRadian = {}, called at {}ms", timeInMilliseconds, angleInRadian, Time::TimeSinceStart(startPoint));
  87. return std::async(std::launch::async, [=]()
  88. { auto result = logic.Move(timeInMilliseconds, angleInRadian);
  89. if (!result)
  90. logger->warn("Move: failed at {}ms", Time::TimeSinceStart(startPoint));
  91. return result; });
  92. }
  93. std::future<bool> StudentDebugAPI::MoveDown(int64_t timeInMilliseconds)
  94. {
  95. return Move(timeInMilliseconds, 0);
  96. }
  97. std::future<bool> StudentDebugAPI::MoveRight(int64_t timeInMilliseconds)
  98. {
  99. return Move(timeInMilliseconds, PI * 0.5);
  100. }
  101. std::future<bool> StudentDebugAPI::MoveUp(int64_t timeInMilliseconds)
  102. {
  103. return Move(timeInMilliseconds, PI);
  104. }
  105. std::future<bool> StudentDebugAPI::MoveLeft(int64_t timeInMilliseconds)
  106. {
  107. return Move(timeInMilliseconds, PI * 1.5);
  108. }
  109. std::future<bool> TrickerDebugAPI::Move(int64_t timeInMilliseconds, double angleInRadian)
  110. {
  111. logger->info("Move: timeInMilliseconds = {}, angleInRadian = {}, called at {}ms", timeInMilliseconds, angleInRadian, Time::TimeSinceStart(startPoint));
  112. return std::async(std::launch::async, [=]()
  113. { auto result = logic.Move(timeInMilliseconds, angleInRadian);
  114. if (!result)
  115. logger->warn("Move: failed at {}ms", Time::TimeSinceStart(startPoint));
  116. return result; });
  117. }
  118. std::future<bool> TrickerDebugAPI::MoveDown(int64_t timeInMilliseconds)
  119. {
  120. return Move(timeInMilliseconds, 0);
  121. }
  122. std::future<bool> TrickerDebugAPI::MoveRight(int64_t timeInMilliseconds)
  123. {
  124. return Move(timeInMilliseconds, PI * 0.5);
  125. }
  126. std::future<bool> TrickerDebugAPI::MoveUp(int64_t timeInMilliseconds)
  127. {
  128. return Move(timeInMilliseconds, PI);
  129. }
  130. std::future<bool> TrickerDebugAPI::MoveLeft(int64_t timeInMilliseconds)
  131. {
  132. return Move(timeInMilliseconds, PI * 1.5);
  133. }
  134. std::future<bool> StudentDebugAPI::PickProp(THUAI6::PropType prop)
  135. {
  136. logger->info("PickProp: prop = {}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint));
  137. return std::async(std::launch::async, [=]()
  138. { auto result = logic.PickProp(prop);
  139. if (!result)
  140. logger->warn("PickProp: failed at {}ms", Time::TimeSinceStart(startPoint));
  141. return result; });
  142. }
  143. std::future<bool> StudentDebugAPI::UseProp(THUAI6::PropType prop)
  144. {
  145. logger->info("UseProp: prop={}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint));
  146. return std::async(std::launch::async, [=]()
  147. { auto result = logic.UseProp(prop);
  148. if (!result)
  149. logger->warn("UseProp: failed at {}ms", Time::TimeSinceStart(startPoint));
  150. return result; });
  151. }
  152. std::future<bool> TrickerDebugAPI::PickProp(THUAI6::PropType prop)
  153. {
  154. logger->info("PickProp: prop = {}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint));
  155. return std::async(std::launch::async, [=]()
  156. { auto result = logic.PickProp(prop);
  157. if (!result)
  158. logger->warn("PickProp: failed at {}ms", Time::TimeSinceStart(startPoint));
  159. return result; });
  160. }
  161. std::future<bool> TrickerDebugAPI::UseProp(THUAI6::PropType prop)
  162. {
  163. logger->info("UseProp: prop={}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint));
  164. return std::async(std::launch::async, [=]()
  165. { auto result = logic.UseProp(prop);
  166. if (!result)
  167. logger->warn("UseProp: failed at {}ms", Time::TimeSinceStart(startPoint));
  168. return result; });
  169. }
  170. std::future<bool> StudentDebugAPI::ThrowProp(THUAI6::PropType prop)
  171. {
  172. logger->info("ThrowProp: prop={}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint));
  173. return std::async(std::launch::async, [=]()
  174. { auto result = logic.ThrowProp(prop);
  175. if (!result)
  176. logger->warn("ThrowProp: failed at {}ms", Time::TimeSinceStart(startPoint));
  177. return result; });
  178. }
  179. std::future<bool> TrickerDebugAPI::ThrowProp(THUAI6::PropType prop)
  180. {
  181. logger->info("ThrowProp: prop={}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint));
  182. return std::async(std::launch::async, [=]()
  183. { auto result = logic.ThrowProp(prop);
  184. if (!result)
  185. logger->warn("ThrowProp: failed at {}ms", Time::TimeSinceStart(startPoint));
  186. return result; });
  187. }
  188. std::future<bool> StudentDebugAPI::UseSkill(int32_t skillID)
  189. {
  190. logger->info("UseSkill: skillID={}, called at {}ms", skillID, Time::TimeSinceStart(startPoint));
  191. return std::async(std::launch::async, [=]()
  192. { auto result = logic.UseSkill(skillID);
  193. if (!result)
  194. logger->warn("UseSkill: failed at {}ms", Time::TimeSinceStart(startPoint));
  195. return result; });
  196. }
  197. std::future<bool> TrickerDebugAPI::UseSkill(int32_t skillID)
  198. {
  199. logger->info("UseSkill: skillID={}, called at {}ms", skillID, Time::TimeSinceStart(startPoint));
  200. return std::async(std::launch::async, [=]()
  201. { auto result = logic.UseSkill(skillID);
  202. if (!result)
  203. logger->warn("UseSkill: failed at {}ms", Time::TimeSinceStart(startPoint));
  204. return result; });
  205. }
  206. std::future<bool> StudentDebugAPI::OpenDoor()
  207. {
  208. logger->info("OpenDoor: called at {}ms", Time::TimeSinceStart(startPoint));
  209. return std::async(std::launch::async, [this]()
  210. { auto result = logic.OpenDoor();
  211. if (!result)
  212. logger->warn("OpenDoor: failed at {}ms", Time::TimeSinceStart(startPoint));
  213. return result; });
  214. }
  215. std::future<bool> TrickerDebugAPI::OpenDoor()
  216. {
  217. logger->info("OpenDoor: called at {}ms", Time::TimeSinceStart(startPoint));
  218. return std::async(std::launch::async, [this]()
  219. { auto result = logic.OpenDoor();
  220. if (!result)
  221. logger->warn("OpenDoor: failed at {}ms", Time::TimeSinceStart(startPoint));
  222. return result; });
  223. }
  224. std::future<bool> StudentDebugAPI::CloseDoor()
  225. {
  226. logger->info("CloseDoor: called at {}ms", Time::TimeSinceStart(startPoint));
  227. return std::async(std::launch::async, [this]()
  228. { auto result = logic.CloseDoor();
  229. if (!result)
  230. logger->warn("CloseDoor: failed at {}ms", Time::TimeSinceStart(startPoint));
  231. return result; });
  232. }
  233. std::future<bool> TrickerDebugAPI::CloseDoor()
  234. {
  235. logger->info("CloseDoor: called at {}ms", Time::TimeSinceStart(startPoint));
  236. return std::async(std::launch::async, [this]()
  237. { auto result = logic.CloseDoor();
  238. if (!result)
  239. logger->warn("CloseDoor: failed at {}ms", Time::TimeSinceStart(startPoint));
  240. return result; });
  241. }
  242. std::future<bool> StudentDebugAPI::SkipWindow()
  243. {
  244. logger->info("SkipWindow: called at {}ms", Time::TimeSinceStart(startPoint));
  245. return std::async(std::launch::async, [this]()
  246. { auto result = logic.SkipWindow();
  247. if (!result)
  248. logger->warn("SkipWindow: failed at {}ms", Time::TimeSinceStart(startPoint));
  249. return result; });
  250. }
  251. std::future<bool> TrickerDebugAPI::SkipWindow()
  252. {
  253. logger->info("SkipWindow: called at {}ms", Time::TimeSinceStart(startPoint));
  254. return std::async(std::launch::async, [this]()
  255. { auto result = logic.SkipWindow();
  256. if (!result)
  257. logger->warn("SkipWindow: failed at {}ms", Time::TimeSinceStart(startPoint));
  258. return result; });
  259. }
  260. std::future<bool> StudentDebugAPI::StartOpenGate()
  261. {
  262. logger->info("StartOpenGate: called at {}ms", Time::TimeSinceStart(startPoint));
  263. return std::async(std::launch::async, [this]()
  264. { auto result = logic.StartOpenGate();
  265. if (!result)
  266. logger->warn("StartOpenGate: failed at {}ms", Time::TimeSinceStart(startPoint));
  267. return result; });
  268. }
  269. std::future<bool> TrickerDebugAPI::StartOpenGate()
  270. {
  271. logger->info("StartOpenGate: called at {}ms", Time::TimeSinceStart(startPoint));
  272. return std::async(std::launch::async, [this]()
  273. { auto result = logic.StartOpenGate();
  274. if (!result)
  275. logger->warn("StartOpenGate: failed at {}ms", Time::TimeSinceStart(startPoint));
  276. return result; });
  277. }
  278. std::future<bool> StudentDebugAPI::StartOpenChest()
  279. {
  280. logger->info("StartOpenChest: called at {}ms", Time::TimeSinceStart(startPoint));
  281. return std::async(std::launch::async, [this]()
  282. { auto result = logic.StartOpenChest();
  283. if (!result)
  284. logger->warn("StartOpenChest: failed at {}ms", Time::TimeSinceStart(startPoint));
  285. return result; });
  286. }
  287. std::future<bool> TrickerDebugAPI::StartOpenChest()
  288. {
  289. logger->info("StartOpenChest: called at {}ms", Time::TimeSinceStart(startPoint));
  290. return std::async(std::launch::async, [this]()
  291. { auto result = logic.StartOpenChest();
  292. if (!result)
  293. logger->warn("StartOpenChest: failed at {}ms", Time::TimeSinceStart(startPoint));
  294. return result; });
  295. }
  296. std::future<bool> StudentDebugAPI::EndAllAction()
  297. {
  298. logger->info("EndAllAction: called at {}ms", Time::TimeSinceStart(startPoint));
  299. return std::async(std::launch::async, [this]()
  300. { auto result = logic.EndAllAction();
  301. if (!result)
  302. logger->warn("EndAllAction: failed at {}ms", Time::TimeSinceStart(startPoint));
  303. return result; });
  304. }
  305. std::future<bool> TrickerDebugAPI::EndAllAction()
  306. {
  307. logger->info("EndAllAction: called at {}ms", Time::TimeSinceStart(startPoint));
  308. return std::async(std::launch::async, [this]()
  309. { auto result = logic.EndAllAction();
  310. if (!result)
  311. logger->warn("EndAllAction: failed at {}ms", Time::TimeSinceStart(startPoint));
  312. return result; });
  313. }
  314. std::future<bool> StudentDebugAPI::SendMessage(int64_t toID, std::string message)
  315. {
  316. logger->info("SendMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint));
  317. return std::async(std::launch::async, [=]()
  318. { auto result = logic.SendMessage(toID, message);
  319. if (!result)
  320. logger->warn("SendMessage: failed at {}ms", Time::TimeSinceStart(startPoint));
  321. return result; });
  322. }
  323. std::future<bool> TrickerDebugAPI::SendMessage(int64_t toID, std::string message)
  324. {
  325. logger->info("SendMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint));
  326. return std::async(std::launch::async, [=]()
  327. { auto result = logic.SendMessage(toID, message);
  328. if (!result)
  329. logger->warn("SendMessage: failed at {}ms", Time::TimeSinceStart(startPoint));
  330. return result; });
  331. }
  332. bool StudentDebugAPI::HaveMessage()
  333. {
  334. logger->info("HaveMessage: called at {}ms", Time::TimeSinceStart(startPoint));
  335. auto result = logic.HaveMessage();
  336. if (!result)
  337. logger->warn("HaveMessage: failed at {}ms", Time::TimeSinceStart(startPoint));
  338. return result;
  339. }
  340. bool TrickerDebugAPI::HaveMessage()
  341. {
  342. logger->info("HaveMessage: called at {}ms", Time::TimeSinceStart(startPoint));
  343. auto result = logic.HaveMessage();
  344. if (!result)
  345. logger->warn("HaveMessage: failed at {}ms", Time::TimeSinceStart(startPoint));
  346. return result;
  347. }
  348. std::pair<int64_t, std::string> StudentDebugAPI::GetMessage()
  349. {
  350. logger->info("GetMessage: called at {}ms", Time::TimeSinceStart(startPoint));
  351. auto result = logic.GetMessage();
  352. if (result.first == -1)
  353. logger->warn("GetMessage: failed at {}ms", Time::TimeSinceStart(startPoint));
  354. return result;
  355. }
  356. std::pair<int64_t, std::string> TrickerDebugAPI::GetMessage()
  357. {
  358. logger->info("GetMessage: called at {}ms", Time::TimeSinceStart(startPoint));
  359. auto result = logic.GetMessage();
  360. if (result.first == -1)
  361. logger->warn("GetMessage: failed at {}ms", Time::TimeSinceStart(startPoint));
  362. return result;
  363. }
  364. bool StudentDebugAPI::Wait()
  365. {
  366. logger->info("Wait: called at {}ms", Time::TimeSinceStart(startPoint));
  367. if (logic.GetCounter() == -1)
  368. return false;
  369. else
  370. return logic.WaitThread();
  371. }
  372. bool TrickerDebugAPI::Wait()
  373. {
  374. logger->info("Wait: called at {}ms", Time::TimeSinceStart(startPoint));
  375. if (logic.GetCounter() == -1)
  376. return false;
  377. else
  378. return logic.WaitThread();
  379. }
  380. std::vector<std::shared_ptr<const THUAI6::Tricker>> StudentDebugAPI::GetTrickers() const
  381. {
  382. return logic.GetTrickers();
  383. }
  384. std::vector<std::shared_ptr<const THUAI6::Student>> StudentDebugAPI::GetStudents() const
  385. {
  386. return logic.GetStudents();
  387. }
  388. std::vector<std::shared_ptr<const THUAI6::Tricker>> TrickerDebugAPI::GetTrickers() const
  389. {
  390. return logic.GetTrickers();
  391. }
  392. std::vector<std::shared_ptr<const THUAI6::Student>> TrickerDebugAPI::GetStudents() const
  393. {
  394. return logic.GetStudents();
  395. }
  396. std::vector<std::shared_ptr<const THUAI6::Prop>> StudentDebugAPI::GetProps() const
  397. {
  398. return logic.GetProps();
  399. }
  400. std::vector<std::shared_ptr<const THUAI6::Prop>> TrickerDebugAPI::GetProps() const
  401. {
  402. return logic.GetProps();
  403. }
  404. std::vector<std::shared_ptr<const THUAI6::Bullet>> StudentDebugAPI::GetBullets() const
  405. {
  406. return logic.GetBullets();
  407. }
  408. std::vector<std::shared_ptr<const THUAI6::Bullet>> TrickerDebugAPI::GetBullets() const
  409. {
  410. return logic.GetBullets();
  411. }
  412. std::vector<std::vector<THUAI6::PlaceType>> StudentDebugAPI::GetFullMap() const
  413. {
  414. return logic.GetFullMap();
  415. }
  416. THUAI6::PlaceType StudentDebugAPI::GetPlaceType(int32_t cellX, int32_t cellY) const
  417. {
  418. return logic.GetPlaceType(cellX, cellY);
  419. }
  420. THUAI6::PlaceType TrickerDebugAPI::GetPlaceType(int32_t cellX, int32_t cellY) const
  421. {
  422. return logic.GetPlaceType(cellX, cellY);
  423. }
  424. std::vector<std::vector<THUAI6::PlaceType>> TrickerDebugAPI::GetFullMap() const
  425. {
  426. return logic.GetFullMap();
  427. }
  428. bool StudentDebugAPI::IsDoorOpen(int32_t cellX, int32_t cellY) const
  429. {
  430. return logic.IsDoorOpen(cellX, cellY);
  431. }
  432. bool TrickerDebugAPI::IsDoorOpen(int32_t cellX, int32_t cellY) const
  433. {
  434. return logic.IsDoorOpen(cellX, cellY);
  435. }
  436. int32_t StudentDebugAPI::GetClassroomProgress(int32_t cellX, int32_t cellY) const
  437. {
  438. return logic.GetClassroomProgress(cellX, cellY);
  439. }
  440. int32_t TrickerDebugAPI::GetClassroomProgress(int32_t cellX, int32_t cellY) const
  441. {
  442. return logic.GetClassroomProgress(cellX, cellY);
  443. }
  444. int32_t StudentDebugAPI::GetChestProgress(int32_t cellX, int32_t cellY) const
  445. {
  446. return logic.GetChestProgress(cellX, cellY);
  447. }
  448. int32_t TrickerDebugAPI::GetChestProgress(int32_t cellX, int32_t cellY) const
  449. {
  450. return logic.GetChestProgress(cellX, cellY);
  451. }
  452. int32_t StudentDebugAPI::GetDoorProgress(int32_t cellX, int32_t cellY) const
  453. {
  454. return logic.GetDoorProgress(cellX, cellY);
  455. }
  456. int32_t TrickerDebugAPI::GetDoorProgress(int32_t cellX, int32_t cellY) const
  457. {
  458. return logic.GetDoorProgress(cellX, cellY);
  459. }
  460. THUAI6::HiddenGateState StudentDebugAPI::GetHiddenGateState(int32_t cellX, int32_t cellY) const
  461. {
  462. return logic.GetHiddenGateState(cellX, cellY);
  463. }
  464. THUAI6::HiddenGateState TrickerDebugAPI::GetHiddenGateState(int32_t cellX, int32_t cellY) const
  465. {
  466. return logic.GetHiddenGateState(cellX, cellY);
  467. }
  468. int32_t StudentDebugAPI::GetGateProgress(int32_t cellX, int32_t cellY) const
  469. {
  470. return logic.GetGateProgress(cellX, cellY);
  471. }
  472. int32_t TrickerDebugAPI::GetGateProgress(int32_t cellX, int32_t cellY) const
  473. {
  474. return logic.GetGateProgress(cellX, cellY);
  475. }
  476. std::shared_ptr<const THUAI6::GameInfo> StudentDebugAPI::GetGameInfo() const
  477. {
  478. return logic.GetGameInfo();
  479. }
  480. std::shared_ptr<const THUAI6::GameInfo> TrickerDebugAPI::GetGameInfo() const
  481. {
  482. return logic.GetGameInfo();
  483. }
  484. std::vector<int64_t> StudentDebugAPI::GetPlayerGUIDs() const
  485. {
  486. return logic.GetPlayerGUIDs();
  487. }
  488. std::vector<int64_t> TrickerDebugAPI::GetPlayerGUIDs() const
  489. {
  490. return logic.GetPlayerGUIDs();
  491. }
  492. std::future<bool> StudentDebugAPI::StartLearning()
  493. {
  494. logger->info("StartLearning: called at {}ms", Time::TimeSinceStart(startPoint));
  495. return std::async(std::launch::async, [this]()
  496. { auto result = logic.StartLearning();
  497. if (!result)
  498. logger->warn("StartLearning: failed at {}ms", Time::TimeSinceStart(startPoint));
  499. return result; });
  500. }
  501. std::future<bool> StudentDebugAPI::StartRouseMate(int64_t mateID)
  502. {
  503. logger->info("StartRouseMate: mate id={}, called at {}ms", mateID, Time::TimeSinceStart(startPoint));
  504. return std::async(std::launch::async, [=]()
  505. { auto result = logic.StartRouseMate(mateID);
  506. if (!result)
  507. logger->warn("StartRouseMate: failed at {}ms", Time::TimeSinceStart(startPoint));
  508. return result; });
  509. }
  510. std::future<bool> StudentDebugAPI::StartEncourageMate(int64_t mateID)
  511. {
  512. logger->info("StartEncourageMate: mate id={}, called at {}ms", mateID, Time::TimeSinceStart(startPoint));
  513. return std::async(std::launch::async, [=]()
  514. { auto result = logic.StartEncourageMate(mateID);
  515. if (!result)
  516. logger->warn("StartEncourageMate: failed at {}ms", Time::TimeSinceStart(startPoint));
  517. return result; });
  518. }
  519. std::future<bool> StudentDebugAPI::Graduate()
  520. {
  521. logger->info("Graduate: called at {}ms", Time::TimeSinceStart(startPoint));
  522. return std::async(std::launch::async, [this]()
  523. { auto result = logic.Graduate();
  524. if (!result)
  525. logger->warn("Graduate: failed at {}ms", Time::TimeSinceStart(startPoint));
  526. return result; });
  527. }
  528. std::shared_ptr<const THUAI6::Student> StudentDebugAPI::GetSelfInfo() const
  529. {
  530. return logic.StudentGetSelfInfo();
  531. }
  532. std::future<bool> TrickerDebugAPI::Attack(double angleInRadian)
  533. {
  534. logger->info("Attack: angleInRadian = {}, called at {}ms", angleInRadian, Time::TimeSinceStart(startPoint));
  535. return std::async(std::launch::async, [=]()
  536. { auto result = logic.Attack(angleInRadian);
  537. if (!result)
  538. logger->warn("Attack: failed at {}ms", Time::TimeSinceStart(startPoint));
  539. return result; });
  540. }
  541. std::future<bool> StudentDebugAPI::Attack(double angleInRadian)
  542. {
  543. logger->info("Attack: angleInRadian = {}, called at {}ms", angleInRadian, Time::TimeSinceStart(startPoint));
  544. return std::async(std::launch::async, [=]()
  545. { auto result = logic.Attack(angleInRadian);
  546. if (!result)
  547. logger->warn("Attack: failed at {}ms", Time::TimeSinceStart(startPoint));
  548. return result; });
  549. }
  550. std::shared_ptr<const THUAI6::Tricker> TrickerDebugAPI::GetSelfInfo() const
  551. {
  552. return logic.TrickerGetSelfInfo();
  553. }
  554. bool StudentDebugAPI::HaveView(int gridX, int gridY) const
  555. {
  556. auto selfInfo = GetSelfInfo();
  557. return logic.HaveView(gridX, gridY, selfInfo->x, selfInfo->y, selfInfo->viewRange);
  558. }
  559. bool TrickerDebugAPI::HaveView(int gridX, int gridY) const
  560. {
  561. auto selfInfo = GetSelfInfo();
  562. return logic.HaveView(gridX, gridY, selfInfo->x, selfInfo->y, selfInfo->viewRange);
  563. }
  564. void StudentDebugAPI::Print(std::string str) const
  565. {
  566. logger->info(str);
  567. }
  568. void TrickerDebugAPI::Print(std::string str) const
  569. {
  570. logger->info(str);
  571. }
  572. void StudentDebugAPI::PrintStudent() const
  573. {
  574. for (const auto& student : logic.GetStudents())
  575. {
  576. logger->info("******Student Info******");
  577. logger->info("playerID={}, GUID={}, x={}, y={}", student->playerID, student->guid, student->x, student->y);
  578. logger->info("speed={}, view range={}, place={}, radius={}", student->speed, student->viewRange, THUAI6::placeTypeDict[student->place], student->radius);
  579. std::string skillTime = "";
  580. for (const auto& time : student->timeUntilSkillAvailable)
  581. skillTime += std::to_string(time) + ", ";
  582. logger->info("score={}, facing direction={}, skill time={}", student->score, student->facingDirection, skillTime);
  583. std::string props = "";
  584. for (const auto& prop : student->props)
  585. props += THUAI6::propTypeDict[prop] + ", ";
  586. logger->info("state={}, bullet={}, props={}", THUAI6::playerStateDict[student->playerState], THUAI6::bulletTypeDict[student->bulletType], props);
  587. logger->info("type={}, determination={}, addiction={}, danger alert={}", THUAI6::studentTypeDict[student->studentType], student->determination, student->addiction, student->dangerAlert);
  588. logger->info("learning speed={}, encourage speed={}, encourage progress={}, rouse progress={}", student->learningSpeed, student->encourageSpeed, student->encourageProgress, student->rouseProgress);
  589. std::string studentBuff = "";
  590. for (const auto& buff : student->buff)
  591. studentBuff += THUAI6::studentBuffDict[buff] + ", ";
  592. logger->info("buff={}", studentBuff);
  593. logger->info("************************\n");
  594. }
  595. }
  596. void TrickerDebugAPI::PrintStudent() const
  597. {
  598. for (const auto& student : logic.GetStudents())
  599. {
  600. logger->info("******Student Info******");
  601. logger->info("playerID={}, GUID={}, x={}, y={}", student->playerID, student->guid, student->x, student->y);
  602. logger->info("speed={}, view range={}, place={}, radius={}", student->speed, student->viewRange, THUAI6::placeTypeDict[student->place], student->radius);
  603. std::string skillTime = "";
  604. for (const auto& time : student->timeUntilSkillAvailable)
  605. skillTime += std::to_string(time) + ", ";
  606. logger->info("score={}, facing direction={}, skill time={}", student->score, student->facingDirection, skillTime);
  607. std::string props = "";
  608. for (const auto& prop : student->props)
  609. props += THUAI6::propTypeDict[prop] + ", ";
  610. logger->info("state={}, bullet={}, props={}", THUAI6::playerStateDict[student->playerState], THUAI6::bulletTypeDict[student->bulletType], props);
  611. logger->info("type={}, determination={}, addiction={}, danger alert={}", THUAI6::studentTypeDict[student->studentType], student->determination, student->addiction, student->dangerAlert);
  612. logger->info("learning speed={}, encourage speed={}, encourage progress={}, rouse progress={}", student->learningSpeed, student->encourageSpeed, student->encourageProgress, student->rouseProgress);
  613. std::string studentBuff = "";
  614. for (const auto& buff : student->buff)
  615. studentBuff += THUAI6::studentBuffDict[buff] + ", ";
  616. logger->info("buff={}", studentBuff);
  617. logger->info("************************\n");
  618. }
  619. }
  620. void StudentDebugAPI::PrintTricker() const
  621. {
  622. for (const auto& tricker : logic.GetTrickers())
  623. {
  624. logger->info("******Tricker Info******");
  625. logger->info("playerID={}, GUID={}, x={}, y={}", tricker->playerID, tricker->guid, tricker->x, tricker->y);
  626. logger->info("speed={}, view range={}, place={}, radius={}", tricker->speed, tricker->viewRange, THUAI6::placeTypeDict[tricker->place], tricker->radius);
  627. std::string skillTime = "";
  628. for (const auto& time : tricker->timeUntilSkillAvailable)
  629. skillTime += std::to_string(time) + ", ";
  630. logger->info("score={}, facing direction={}, skill time={}", tricker->score, tricker->facingDirection, skillTime);
  631. std::string props = "";
  632. for (const auto& prop : tricker->props)
  633. props += THUAI6::propTypeDict[prop] + ", ";
  634. logger->info("state={}, bullet={}, props={}", THUAI6::playerStateDict[tricker->playerState], THUAI6::bulletTypeDict[tricker->bulletType], props);
  635. logger->info("type={}, trick desire={}, class volume={}", THUAI6::trickerTypeDict[tricker->trickerType], tricker->trickDesire, tricker->classVolume);
  636. std::string trickerBuff = "";
  637. for (const auto& buff : tricker->buff)
  638. trickerBuff += THUAI6::trickerBuffDict[buff] + ", ";
  639. logger->info("buff={}", trickerBuff);
  640. logger->info("************************\n");
  641. }
  642. }
  643. void TrickerDebugAPI::PrintTricker() const
  644. {
  645. for (auto tricker : logic.GetTrickers())
  646. {
  647. logger->info("******Tricker Info******");
  648. logger->info("playerID={}, GUID={}, x={}, y={}", tricker->playerID, tricker->guid, tricker->x, tricker->y);
  649. logger->info("speed={}, view range={}, place={}, radius={}", tricker->speed, tricker->viewRange, THUAI6::placeTypeDict[tricker->place], tricker->radius);
  650. std::string skillTime = "";
  651. for (const auto& time : tricker->timeUntilSkillAvailable)
  652. skillTime += std::to_string(time) + ", ";
  653. logger->info("score={}, facing direction={}, skill time={}", tricker->score, tricker->facingDirection, skillTime);
  654. std::string props = "";
  655. for (const auto& prop : tricker->props)
  656. props += THUAI6::propTypeDict[prop] + ", ";
  657. logger->info("state={}, bullet={}, props={}", THUAI6::playerStateDict[tricker->playerState], THUAI6::bulletTypeDict[tricker->bulletType], props);
  658. logger->info("type={}, trick desire={}, class volume={}", THUAI6::trickerTypeDict[tricker->trickerType], tricker->trickDesire, tricker->classVolume);
  659. std::string trickerBuff = "";
  660. for (const auto& buff : tricker->buff)
  661. trickerBuff += THUAI6::trickerBuffDict[buff] + ", ";
  662. logger->info("buff={}", trickerBuff);
  663. logger->info("************************\n");
  664. }
  665. }
  666. void StudentDebugAPI::PrintProp() const
  667. {
  668. for (auto prop : logic.GetProps())
  669. {
  670. logger->info("******Prop Info******");
  671. logger->info("GUID={}, x={}, y={}, place={}, facing direction={}", prop->guid, prop->x, prop->y, THUAI6::placeTypeDict[prop->place], prop->facingDirection);
  672. logger->info("*********************\n");
  673. }
  674. }
  675. void TrickerDebugAPI::PrintProp() const
  676. {
  677. for (auto prop : logic.GetProps())
  678. {
  679. logger->info("******Prop Info******");
  680. logger->info("GUID={}, x={}, y={}, place={}, facing direction={}", prop->guid, prop->x, prop->y, THUAI6::placeTypeDict[prop->place], prop->facingDirection);
  681. logger->info("*********************\n");
  682. }
  683. }
  684. void StudentDebugAPI::PrintSelfInfo() const
  685. {
  686. auto student = logic.StudentGetSelfInfo();
  687. logger->info("******Self Info******");
  688. logger->info("playerID={}, GUID={}, x={}, y={}", student->playerID, student->guid, student->x, student->y);
  689. logger->info("speed={}, view range={}, place={}, radius={}", student->speed, student->viewRange, THUAI6::placeTypeDict[student->place], student->radius);
  690. std::string skillTime = "";
  691. for (const auto& time : student->timeUntilSkillAvailable)
  692. skillTime += std::to_string(time) + ", ";
  693. logger->info("score={}, facing direction={}, skill time={}", student->score, student->facingDirection, skillTime);
  694. std::string props = "";
  695. for (const auto& prop : student->props)
  696. props += THUAI6::propTypeDict[prop] + ", ";
  697. logger->info("state={}, bullet={}, props={}", THUAI6::playerStateDict[student->playerState], THUAI6::bulletTypeDict[student->bulletType], props);
  698. logger->info("type={}, determination={}, addiction={}, danger alert={}", THUAI6::studentTypeDict[student->studentType], student->determination, student->addiction, student->dangerAlert);
  699. logger->info("learning speed={}, encourage speed={}, encourage progress={}, rouse progress={}", student->learningSpeed, student->encourageSpeed, student->encourageProgress, student->rouseProgress);
  700. std::string studentBuff = "";
  701. for (const auto& buff : student->buff)
  702. studentBuff += THUAI6::studentBuffDict[buff] + ", ";
  703. logger->info("buff={}", studentBuff);
  704. logger->info("*********************\n");
  705. }
  706. void TrickerDebugAPI::PrintSelfInfo() const
  707. {
  708. auto tricker = logic.TrickerGetSelfInfo();
  709. logger->info("******Self Info******");
  710. logger->info("playerID={}, GUID={}, x={}, y={}", tricker->playerID, tricker->guid, tricker->x, tricker->y);
  711. logger->info("speed={}, view range={}, place={}, radius={}", tricker->speed, tricker->viewRange, THUAI6::placeTypeDict[tricker->place], tricker->radius);
  712. std::string skillTime = "";
  713. for (const auto& time : tricker->timeUntilSkillAvailable)
  714. skillTime += std::to_string(time) + ", ";
  715. logger->info("score={}, facing direction={}, skill time={}", tricker->score, tricker->facingDirection, skillTime);
  716. std::string props = "";
  717. for (const auto& prop : tricker->props)
  718. props += THUAI6::propTypeDict[prop] + ", ";
  719. logger->info("state={}, bullet={}, props={}", THUAI6::playerStateDict[tricker->playerState], THUAI6::bulletTypeDict[tricker->bulletType], props);
  720. logger->info("type={}, trick desire={}, class volume={}", THUAI6::trickerTypeDict[tricker->trickerType], tricker->trickDesire, tricker->classVolume);
  721. std::string trickerBuff = "";
  722. for (const auto& buff : tricker->buff)
  723. trickerBuff += THUAI6::trickerBuffDict[buff] + ", ";
  724. logger->info("buff={}", trickerBuff);
  725. logger->info("*********************\n");
  726. }
  727. void StudentDebugAPI::Play(IAI& ai)
  728. {
  729. ai.play(*this);
  730. }
  731. void TrickerDebugAPI::Play(IAI& ai)
  732. {
  733. ai.play(*this);
  734. }