#include "common/basesystemenv.h"
#include "labengine/gamebot.h"
#include "labengine/base/kaimlogimplementation.h"
#include "labengine/base/kaimfileopener.h"
#include "labengine/utils/labengineutils.h"
namespace
{
class MinimalGameBot
{
public:
MinimalGameBot()
: m_gameVelocity()
, m_gamePosition()
, m_gameDestination(50.f, 0.f, 0.f)
, m_navBot(nullptr)
{}
{
botInitConfig.
m_startPosition = m_gamePosition;
m_navBot->Init(botInitConfig);
m_navBot->AddToDatabase();
}
void Destroy()
{
m_navBot->RemoveFromDatabase();
m_navBot = nullptr;
}
void Goto()
{
m_navBot->ComputeAStarQueryAsync(m_gameDestination);
}
void Update(
KyFloat32 simulationStepsInSeconds)
{
m_gameVelocity = m_navBot->GetBotOutput().m_outputVelocity;
m_gamePosition += m_gameVelocity*simulationStepsInSeconds;
m_navBot->SetPosition(m_gamePosition);
m_navBot->SetVelocityAndFrontDirection(m_gameVelocity);
if (HasArrived())
m_navBot->ClearFollowedPath();
}
bool HasArrived()
{
KyFloat32 arrivalPrecisionRadius = m_navBot->GetConfig().m_pathProgressConfig.m_checkPointRadius;
if (m_navBot->HasReachedPosition(m_gameDestination, arrivalPrecisionRadius))
{
return true;
}
return false;
}
public:
Kaim::Ptr<Kaim::Bot> m_navBot;
};
class NavDataLoader
{
public:
NavDataLoader() : m_file(nullptr), m_memory(nullptr) {}
~NavDataLoader()
{
if (m_file)
{
m_file->Close();
m_file = nullptr;
}
delete m_memory;
}
void LoadToMemory()
{
int length = m_file->GetLength();
m_memory = new char[length];
}
Kaim::Ptr<Kaim::File> m_file;
char* m_memory;
};
class MinimalGameWorld
{
public:
bool Init(NavDataLoader& navDatanavDataLoader)
{
if (navDatanavDataLoader.m_memory == nullptr)
loadingResult = m_navData->Load(navDatanavDataLoader.m_file);
else
loadingResult = m_navData->LoadFromMemory(navDatanavDataLoader.m_memory);
return false;
m_navData->Init(m_world->GetDatabase(0));
m_navData->AddToDatabaseImmediate();
m_minimalGameBot.Init(m_world);
m_minimalGameBot.Goto();
return true;
}
void Update()
{
const KyFloat32 simulationStepsInSeconds = 0.016f;
m_world->Update(simulationStepsInSeconds);
m_minimalGameBot.Update(simulationStepsInSeconds);
LabEngine::Utils::TimedBusyWait(simulationStepsInSeconds*1000.f);
}
void Destroy()
{
m_minimalGameBot.Destroy();
m_navData->RemoveFromDatabaseImmediate();
m_navData = nullptr;
m_world = nullptr;
}
public:
Kaim::Ptr<Kaim::NavData> m_navData;
Kaim::Ptr<Kaim::World> m_world;
MinimalGameBot m_minimalGameBot;
};
#define KT_TEST_ENV_CLASS BaseSystemEnv
KT_TEST_ENV {}
KT_TUTORIAL
{
KT_LOG_TITLE_BEGIN("TUTORIAL - Kaim::World Initialization and update");
MinimalGameWorld gameWorld;
NavDataLoader navDataLoader;
LabEngine::KaimFileOpener fileOpener;
navDataLoader.m_file = fileOpener.OpenFile(KT_ENV.GetAbsoluteInputFileName(
"generated/plane200x200_80ktri/plane200x200_80ktri.NavData").c_str(),
Kaim::OpenMode_Read);
KT_ASSERT(navDataLoader.m_file);
bool initSucceeded = gameWorld.Init(navDataLoader);
KT_ASSERT(initSucceeded);
for (
KyUInt32 gameFrame = 0; gameFrame < 10; ++gameFrame)
{
gameWorld.Update();
}
gameWorld.Destroy();
}
KT_TUTORIAL
{
KT_LOG_TITLE_BEGIN("TUTORIAL - Sharing NavData between several worlds");
MinimalGameWorld gameWorldInstances[10];
NavDataLoader navDataLoader;
LabEngine::KaimFileOpener fileOpener;
navDataLoader.m_file = fileOpener.OpenFile(KT_ENV.GetAbsoluteInputFileName(
"generated/plane200x200_80ktri/plane200x200_80ktri.NavData").c_str(),
Kaim::OpenMode_Read);
KT_ASSERT(navDataLoader.m_file);
navDataLoader.LoadToMemory();
{
bool initSucceeded = gameWorldInstances[i].Init(navDataLoader);
KT_ASSERT(initSucceeded);
}
for (
KyUInt32 gameFrame = 0; gameFrame < 10; ++gameFrame)
{
gameWorldInstances[i].Update();
}
gameWorldInstances[i].Destroy();
}
}