etqw-sdk/source/game/botai/BotThread.h

71 lines
1.9 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#ifndef __BOTTHREAD_H__
#define __BOTTHREAD_H__
/*
===============================================================================
idBotThread
The bot thread is setup such that the bot AI can never think for more
frames than there are game frames. Furthermore the bot AI cannot
think for less frames than one fourth the number of game frames.
In other words the AI runs asynchronously but it can run at most
at 30 Hz (USERCMD_HZ) and if not enough CPU is available it can
seamlessly scale down to 6 Hz. If the bot AI runs fast the bot
thread will wait for the game thread. If the bot AI runs really
slow such that it cannot maintain 8 Hz the game code will wait
for the bot thread to catch up.
===============================================================================
*/
#define MAX_FRAME_TIMES 16
class idBotAI;
class idBotThread : public sdThreadProcess {
public:
idBotThread();
~idBotThread();
void StartThread();
void StopThread();
virtual unsigned int Run( void* parm );
virtual void Stop();
void WaitForGameThread() { gameSignal.SignalAndWait( botSignal ); }
void SignalGameThread() { botSignal.Set(); }
void WaitForBotThread() { botSignal.Wait(); }
void SignalBotThread() { gameSignal.Set(); }
void Lock() { lock.Acquire(); }
void UnLock() { lock.Release(); }
int GetLastGameFrameNum() const { return lastGameFrameNum; }
int GetFrameRate() const;
bool IsActive() const { return isActive; }
bool IsWaiting() const { return isWaiting; }
private:
sdThread * thread;
sdSignal gameSignal;
sdSignal botSignal;
sdLock lock;
int lastGameFrameNum;
bool isWaiting;
bool isActive;
int frameTimes[MAX_FRAME_TIMES];
int numFrameTimes;
};
extern idBotThread * botThread;
#endif /* !__BOTTHREAD_H__ */