#include #include #include "AI.h" #include "API.h" #include "utils.hpp" #include "structures.h" #define PI 3.14159265358979323846 StudentDebugAPI::StudentDebugAPI(ILogic& logic, bool file, bool print, bool warnOnly, int64_t playerID) : logic(logic) { std::string fileName = "logs/api-" + std::to_string(playerID) + "-log.txt"; auto fileLogger = std::make_shared(fileName, true); auto printLogger = std::make_shared(); std::string pattern = "[api " + std::to_string(playerID) + "] [%H:%M:%S.%e] [%l] %v"; fileLogger->set_pattern(pattern); printLogger->set_pattern(pattern); if (file) fileLogger->set_level(spdlog::level::trace); else fileLogger->set_level(spdlog::level::off); if (print) printLogger->set_level(spdlog::level::info); else printLogger->set_level(spdlog::level::off); if (warnOnly) printLogger->set_level(spdlog::level::warn); logger = std::make_unique("apiLogger", spdlog::sinks_init_list{fileLogger, printLogger}); } TrickerDebugAPI::TrickerDebugAPI(ILogic& logic, bool file, bool print, bool warnOnly, int64_t playerID) : logic(logic) { std::string fileName = "logs/api-" + std::to_string(playerID) + "-log.txt"; auto fileLogger = std::make_shared(fileName, true); auto printLogger = std::make_shared(); std::string pattern = "[api" + std::to_string(playerID) + "] [%H:%M:%S.%e] [%l] %v"; fileLogger->set_pattern(pattern); printLogger->set_pattern(pattern); if (file) fileLogger->set_level(spdlog::level::trace); else fileLogger->set_level(spdlog::level::off); if (print) printLogger->set_level(spdlog::level::info); else printLogger->set_level(spdlog::level::off); if (warnOnly) printLogger->set_level(spdlog::level::warn); logger = std::make_unique("apiLogger", spdlog::sinks_init_list{fileLogger, printLogger}); } void StudentDebugAPI::StartTimer() { startPoint = std::chrono::system_clock::now(); std::time_t t = std::chrono::system_clock::to_time_t(startPoint); logger->info("=== AI.play() ==="); logger->info("StartTimer: {}", std::ctime(&t)); } void TrickerDebugAPI::StartTimer() { startPoint = std::chrono::system_clock::now(); std::time_t t = std::chrono::system_clock::to_time_t(startPoint); logger->info("=== AI.play() ==="); logger->info("StartTimer: {}", std::ctime(&t)); } void StudentDebugAPI::EndTimer() { logger->info("Time elapsed: {}ms", Time::TimeSinceStart(startPoint)); } void TrickerDebugAPI::EndTimer() { logger->info("Time elapsed: {}ms", Time::TimeSinceStart(startPoint)); } int StudentDebugAPI::GetFrameCount() const { return logic.GetCounter(); } int TrickerDebugAPI::GetFrameCount() const { return logic.GetCounter(); } std::future StudentDebugAPI::Move(int64_t timeInMilliseconds, double angleInRadian) { logger->info("Move: timeInMilliseconds = {}, angleInRadian = {}, called at {}ms", timeInMilliseconds, angleInRadian, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.Move(timeInMilliseconds, angleInRadian); if (!result) logger->warn("Move: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::MoveDown(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, 0); } std::future StudentDebugAPI::MoveRight(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, PI * 0.5); } std::future StudentDebugAPI::MoveUp(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, PI); } std::future StudentDebugAPI::MoveLeft(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, PI * 1.5); } std::future TrickerDebugAPI::Move(int64_t timeInMilliseconds, double angleInRadian) { logger->info("Move: timeInMilliseconds = {}, angleInRadian = {}, called at {}ms", timeInMilliseconds, angleInRadian, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.Move(timeInMilliseconds, angleInRadian); if (!result) logger->warn("Move: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future TrickerDebugAPI::MoveDown(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, 0); } std::future TrickerDebugAPI::MoveRight(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, PI * 0.5); } std::future TrickerDebugAPI::MoveUp(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, PI); } std::future TrickerDebugAPI::MoveLeft(int64_t timeInMilliseconds) { return Move(timeInMilliseconds, PI * 1.5); } std::future StudentDebugAPI::PickProp(THUAI6::PropType prop) { logger->info("PickProp: prop = {}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.PickProp(prop); if (!result) logger->warn("PickProp: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::UseProp(THUAI6::PropType prop) { logger->info("UseProp: prop={}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.UseProp(prop); if (!result) logger->warn("UseProp: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future TrickerDebugAPI::PickProp(THUAI6::PropType prop) { logger->info("PickProp: prop = {}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.PickProp(prop); if (!result) logger->warn("PickProp: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future TrickerDebugAPI::UseProp(THUAI6::PropType prop) { logger->info("UseProp: prop={}, called at {}ms", THUAI6::propTypeDict[prop], Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.UseProp(prop); if (!result) logger->warn("UseProp: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::UseSkill(int32_t skillID) { logger->info("UseSkill: skillID={}, called at {}ms", skillID, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.UseSkill(skillID); if (!result) logger->warn("UseSkill: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future TrickerDebugAPI::UseSkill(int32_t skillID) { logger->info("UseSkill: skillID={}, called at {}ms", skillID, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.UseSkill(skillID); if (!result) logger->warn("UseSkill: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::OpenDoor() { return std::async(std::launch::async, [&]() { return logic.OpenDoor(); }); } std::future TrickerDebugAPI::OpenDoor() { return std::async(std::launch::async, [&]() { return logic.OpenDoor(); }); } std::future StudentDebugAPI::CloseDoor() { return std::async(std::launch::async, [&]() { return logic.CloseDoor(); }); } std::future TrickerDebugAPI::CloseDoor() { return std::async(std::launch::async, [&]() { return logic.CloseDoor(); }); } std::future StudentDebugAPI::SkipWindow() { return std::async(std::launch::async, [&]() { return logic.SkipWindow(); }); } std::future TrickerDebugAPI::SkipWindow() { return std::async(std::launch::async, [&]() { return logic.SkipWindow(); }); } std::future StudentDebugAPI::StartOpenGate() { return std::async(std::launch::async, [&]() { return logic.StartOpenGate(); }); } std::future TrickerDebugAPI::StartOpenGate() { return std::async(std::launch::async, [&]() { return logic.StartOpenGate(); }); } std::future StudentDebugAPI::StartOpenChest() { return std::async(std::launch::async, [&]() { return logic.StartOpenChest(); }); } std::future TrickerDebugAPI::StartOpenChest() { return std::async(std::launch::async, [&]() { return logic.StartOpenChest(); }); } std::future StudentDebugAPI::EndAllAction() { return std::async(std::launch::async, [&]() { return logic.EndAllAction(); }); } std::future TrickerDebugAPI::EndAllAction() { return std::async(std::launch::async, [&]() { return logic.EndAllAction(); }); } std::future StudentDebugAPI::SendMessage(int64_t toID, std::string message) { logger->info("SendMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.SendMessage(toID, message); if (!result) logger->warn("SendMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future TrickerDebugAPI::SendMessage(int64_t toID, std::string message) { logger->info("SendMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.SendMessage(toID, message); if (!result) logger->warn("SendMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::HaveMessage() { logger->info("HaveMessage: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.HaveMessage(); if (!result) logger->warn("HaveMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future TrickerDebugAPI::HaveMessage() { logger->info("HaveMessage: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.HaveMessage(); if (!result) logger->warn("HaveMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future>> StudentDebugAPI::GetMessage() { logger->info("GetMessage: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.GetMessage(); if (result == std::nullopt) logger->warn("GetMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future>> TrickerDebugAPI::GetMessage() { logger->info("GetMessage: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.GetMessage(); if (result == std::nullopt) logger->warn("GetMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::Wait() { logger->info("Wait: called at {}ms", Time::TimeSinceStart(startPoint)); if (logic.GetCounter() == -1) return std::async(std::launch::async, []() { return false; }); else return std::async(std::launch::async, [this]() { return logic.WaitThread(); }); } std::future TrickerDebugAPI::Wait() { logger->info("Wait: called at {}ms", Time::TimeSinceStart(startPoint)); if (logic.GetCounter() == -1) return std::async(std::launch::async, []() { return false; }); else return std::async(std::launch::async, [this]() { return logic.WaitThread(); }); } std::vector> StudentDebugAPI::GetTrickers() const { return logic.GetTrickers(); } std::vector> StudentDebugAPI::GetStudents() const { return logic.GetStudents(); } std::vector> TrickerDebugAPI::GetTrickers() const { return logic.GetTrickers(); } std::vector> TrickerDebugAPI::GetStudents() const { return logic.GetStudents(); } std::vector> StudentDebugAPI::GetProps() const { return logic.GetProps(); } std::vector> TrickerDebugAPI::GetProps() const { return logic.GetProps(); } std::vector> StudentDebugAPI::GetFullMap() const { return logic.GetFullMap(); } THUAI6::PlaceType StudentDebugAPI::GetPlaceType(int32_t cellX, int32_t cellY) const { return logic.GetPlaceType(cellX, cellY); } THUAI6::PlaceType TrickerDebugAPI::GetPlaceType(int32_t cellX, int32_t cellY) const { return logic.GetPlaceType(cellX, cellY); } std::vector> TrickerDebugAPI::GetFullMap() const { return logic.GetFullMap(); } bool StudentDebugAPI::IsDoorOpen(int32_t cellX, int32_t cellY) const { return logic.IsDoorOpen(cellX, cellY); } bool TrickerDebugAPI::IsDoorOpen(int32_t cellX, int32_t cellY) const { return logic.IsDoorOpen(cellX, cellY); } int32_t StudentDebugAPI::GetClassroomProgress(int32_t cellX, int32_t cellY) const { return logic.GetClassroomProgress(cellX, cellY); } int32_t TrickerDebugAPI::GetClassroomProgress(int32_t cellX, int32_t cellY) const { return logic.GetClassroomProgress(cellX, cellY); } int32_t StudentDebugAPI::GetChestProgress(int32_t cellX, int32_t cellY) const { return logic.GetChestProgress(cellX, cellY); } int32_t TrickerDebugAPI::GetChestProgress(int32_t cellX, int32_t cellY) const { return logic.GetChestProgress(cellX, cellY); } int32_t StudentDebugAPI::GetGateProgress(int32_t cellX, int32_t cellY) const { return logic.GetGateProgress(cellX, cellY); } int32_t TrickerDebugAPI::GetGateProgress(int32_t cellX, int32_t cellY) const { return logic.GetGateProgress(cellX, cellY); } std::shared_ptr StudentDebugAPI::GetGameInfo() const { return logic.GetGameInfo(); } std::shared_ptr TrickerDebugAPI::GetGameInfo() const { return logic.GetGameInfo(); } std::vector StudentDebugAPI::GetPlayerGUIDs() const { return logic.GetPlayerGUIDs(); } std::vector TrickerDebugAPI::GetPlayerGUIDs() const { return logic.GetPlayerGUIDs(); } std::future StudentDebugAPI::StartLearning() { logger->info("StartLearning: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.StartLearning(); if (!result) logger->warn("StartLearning: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::StartRescueMate() { logger->info("StartRescueMate: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.StartRescueMate(); if (!result) logger->warn("StartRescueMate: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::StartTreatMate() { logger->info("StartTreatMate: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.StartTreatMate(); if (!result) logger->warn("StartTreatMate: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::Graduate() { logger->info("Graduate: called at {}ms", Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [this]() { auto result = logic.Graduate(); if (!result) logger->warn("Graduate: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::shared_ptr StudentDebugAPI::GetSelfInfo() const { return logic.StudentGetSelfInfo(); } std::future TrickerDebugAPI::Attack(double angleInRadian) { logger->info("Attack: angleInRadian = {}, called at {}ms", angleInRadian, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.Attack(angleInRadian); if (!result) logger->warn("Attack: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::future StudentDebugAPI::Attack(double angleInRadian) { logger->info("Attack: angleInRadian = {}, called at {}ms", angleInRadian, Time::TimeSinceStart(startPoint)); return std::async(std::launch::async, [=]() { auto result = logic.Attack(angleInRadian); if (!result) logger->warn("Attack: failed at {}ms", Time::TimeSinceStart(startPoint)); return result; }); } std::shared_ptr TrickerDebugAPI::GetSelfInfo() const { return logic.TrickerGetSelfInfo(); } void StudentDebugAPI::PrintStudent() const { for (const auto& student : logic.GetStudents()) { logger->info("******Student Info******"); logger->info("playerID={}, GUID={}, x={}, y={}", student->playerID, student->guid, student->x, student->y); logger->info("speed={}, view range={}, place={}", student->speed, student->viewRange, THUAI6::placeTypeDict[student->place]); logger->info("state={}, determination={}, addiction={}", THUAI6::playerStateDict[student->playerState], student->determination, student->addiction); std::string skillTime = "skill time="; for (const auto& time : student->timeUntilSkillAvailable) skillTime += std::to_string(time) + ", "; logger->info(skillTime); std::string studentBuff = "buff="; std::string studentProp = "prop="; for (const auto& buff : student->buff) studentBuff += THUAI6::studentBuffDict[buff] + ", "; for (const auto& prop : student->props) studentProp += THUAI6::propTypeDict[prop] + ", "; logger->info(studentBuff); logger->info(studentProp); logger->info("**********************"); } } void TrickerDebugAPI::PrintStudent() const { for (const auto& student : logic.GetStudents()) { logger->info("******Student Info******"); logger->info("playerID={}, GUID={}, x={}, y={}", student->playerID, student->guid, student->x, student->y); logger->info("speed={}, view range={}, place={}", student->speed, student->viewRange, THUAI6::placeTypeDict[student->place]); logger->info("state={}, determination={}, addiction={}", THUAI6::playerStateDict[student->playerState], student->determination, student->addiction); std::string skillTime = "skill time="; for (const auto& time : student->timeUntilSkillAvailable) skillTime += std::to_string(time) + ", "; logger->info(skillTime); std::string studentBuff = "buff="; std::string studentProp = "prop="; for (const auto& buff : student->buff) studentBuff += THUAI6::studentBuffDict[buff] + ", "; for (const auto& prop : student->props) studentProp += THUAI6::propTypeDict[prop] + ", "; logger->info(studentBuff); logger->info(studentProp); logger->info("**********************"); } } void StudentDebugAPI::PrintTricker() const { for (const auto& tricker : logic.GetTrickers()) { logger->info("******Tricker Info******"); logger->info("playerID={}, GUID={}, x={}, y={}", tricker->playerID, tricker->guid, tricker->x, tricker->y); logger->info("speed={}, view range={}, place={}", tricker->speed, tricker->viewRange, THUAI6::placeTypeDict[tricker->place]); logger->info("damage={}, state={}", tricker->damage, THUAI6::playerStateDict[tricker->playerState]); std::string skillTime = "skill time="; for (const auto& time : tricker->timeUntilSkillAvailable) skillTime += std::to_string(time) + ", "; logger->info(skillTime); std::string trickerBuff = "buff="; for (const auto& buff : tricker->buff) trickerBuff += THUAI6::trickerBuffDict[buff] + ", "; logger->info(trickerBuff); std::string trickerProp = "prop="; for (const auto& prop : tricker->props) trickerProp += THUAI6::propTypeDict[prop] + ", "; logger->info(trickerProp); logger->info("************************"); } } void TrickerDebugAPI::PrintTricker() const { for (auto tricker : logic.GetTrickers()) { logger->info("******Tricker Info******"); logger->info("playerID={}, GUID={}, x={}, y={}", tricker->playerID, tricker->guid, tricker->x, tricker->y); logger->info("speed={}, view range={}, place={}", tricker->speed, tricker->viewRange, THUAI6::placeTypeDict[tricker->place]); logger->info("damage={}, state={}", tricker->damage, THUAI6::playerStateDict[tricker->playerState]); std::string skillTime = "skill time="; for (const auto& time : tricker->timeUntilSkillAvailable) skillTime += std::to_string(time) + ", "; logger->info(skillTime); std::string trickerBuff = "buff="; for (const auto& buff : tricker->buff) trickerBuff += THUAI6::trickerBuffDict[buff] + ", "; logger->info(trickerBuff); std::string trickerProp = "prop="; for (const auto& prop : tricker->props) trickerProp += THUAI6::propTypeDict[prop] + ", "; logger->info(trickerProp); logger->info("************************"); } } void StudentDebugAPI::PrintProp() const { for (auto prop : logic.GetProps()) { logger->info("******Prop Info******"); logger->info("GUID={}, x={}, y={}, place={}, is moving={}", prop->guid, prop->x, prop->y, THUAI6::placeTypeDict[prop->place], prop->isMoving); logger->info("*********************"); } } void TrickerDebugAPI::PrintProp() const { for (auto prop : logic.GetProps()) { logger->info("******Prop Info******"); logger->info("GUID={}, x={}, y={}, place={}, is moving={}", prop->guid, prop->x, prop->y, THUAI6::placeTypeDict[prop->place], prop->isMoving); logger->info("*********************"); } } void StudentDebugAPI::PrintSelfInfo() const { auto self = logic.StudentGetSelfInfo(); logger->info("******Self Info******"); logger->info("playerID={}, GUID={}, x={}, y={}", self->playerID, self->guid, self->x, self->y); logger->info("speed={}, view range={}, place={}", self->speed, self->viewRange, THUAI6::placeTypeDict[self->place]); logger->info("state={}, determination={}, addiction", THUAI6::playerStateDict[self->playerState], self->determination, self->addiction); std::string skillTime = "skill time="; for (const auto& time : self->timeUntilSkillAvailable) skillTime += std::to_string(time) + ", "; logger->info(skillTime); std::string studentBuff = "buff="; for (const auto& buff : self->buff) studentBuff += THUAI6::studentBuffDict[buff] + ", "; logger->info(studentBuff); std::string studentProp = "prop="; for (const auto& prop : self->props) studentProp += THUAI6::propTypeDict[prop] + ", "; logger->info(studentProp); logger->info("*********************"); } void TrickerDebugAPI::PrintSelfInfo() const { auto self = logic.TrickerGetSelfInfo(); logger->info("******Self Info******"); logger->info("playerID={}, GUID={}, x={}, y={}", self->playerID, self->guid, self->x, self->y); logger->info("speed={}, view range={}, place={}", self->speed, self->viewRange, THUAI6::placeTypeDict[self->place]); logger->info("damage={}, state={}", self->damage, THUAI6::playerStateDict[self->playerState]); std::string skillTime = "skill time="; for (const auto& time : self->timeUntilSkillAvailable) skillTime += std::to_string(time) + ", "; logger->info(skillTime); std::string trickerBuff = "buff="; for (const auto& buff : self->buff) trickerBuff += THUAI6::trickerBuffDict[buff] + ", "; logger->info(trickerBuff); std::string trickerProp = "prop="; for (const auto& prop : self->props) trickerProp += THUAI6::propTypeDict[prop] + ", "; logger->info(trickerProp); logger->info("*********************"); } void StudentDebugAPI::Play(IAI& ai) { ai.play(*this); } void TrickerDebugAPI::Play(IAI& ai) { ai.play(*this); }