/Code/CryEngine/CryAction/SignalTimers/SignalTimers.cpp

https://gitlab.com/dahbearz/CRYENGINE
C++ | 434 lines | 237 code | 59 blank | 138 comment | 59 complexity | aa2a5d036579d9ee32df0079b6312e4c MD5 | raw file
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2. /********************************************************************
  3. ---------------------------------------------------------------------
  4. File name: SignalTimer.h
  5. $Id$
  6. $DateTime$
  7. Description: Signal entities based on configurable timers
  8. ---------------------------------------------------------------------
  9. History:
  10. - 16:04:2007 : Created by Ricardo Pillosu
  11. *********************************************************************/
  12. #include "StdAfx.h"
  13. #include "SignalTimers.h"
  14. #include "PersonalSignalTimer.h"
  15. CSignalTimer* CSignalTimer::m_pInstance = NULL;
  16. // Description:
  17. // Constructor
  18. // Arguments:
  19. //
  20. // Return:
  21. //
  22. CSignalTimer::CSignalTimer()
  23. {
  24. m_bInit = false;
  25. m_bDebug = false;
  26. }
  27. // Description:
  28. // Destructor
  29. // Arguments:
  30. //
  31. // Return:
  32. //
  33. CSignalTimer::~CSignalTimer()
  34. {
  35. for (uint32 uIndex = 0; uIndex < m_vecPersonalSignalTimers.size(); ++uIndex)
  36. {
  37. SAFE_DELETE(m_vecPersonalSignalTimers[uIndex]);
  38. }
  39. m_vecPersonalSignalTimers.clear();
  40. }
  41. // Description:
  42. // Create
  43. // Arguments:
  44. //
  45. // Return:
  46. //
  47. CSignalTimer& CSignalTimer::ref()
  48. {
  49. CRY_ASSERT(NULL != m_pInstance);
  50. return(*m_pInstance);
  51. }
  52. // Description:
  53. // Create
  54. // Arguments:
  55. //
  56. // Return:
  57. //
  58. bool CSignalTimer::Create()
  59. {
  60. if (NULL == m_pInstance)
  61. {
  62. m_pInstance = new CSignalTimer();
  63. }
  64. else
  65. {
  66. CRY_ASSERT("Trying to Create() the singleton more than once");
  67. }
  68. return(m_pInstance != NULL);
  69. }
  70. // Description:
  71. //
  72. // Arguments:
  73. //
  74. // Return:
  75. //
  76. void CSignalTimer::Init()
  77. {
  78. if (m_bInit == false)
  79. {
  80. m_bInit = true;
  81. }
  82. }
  83. // Description:
  84. //
  85. // Arguments:
  86. //
  87. // Return:
  88. //
  89. void CSignalTimer::Reset()
  90. {
  91. for (uint32 uIndex = 0; uIndex < m_vecPersonalSignalTimers.size(); ++uIndex)
  92. {
  93. m_vecPersonalSignalTimers[uIndex]->ForceReset(false);
  94. }
  95. }
  96. // Description:
  97. //
  98. // Arguments:
  99. //
  100. // Return:
  101. //
  102. void CSignalTimer::OnEditorSetGameMode(bool bGameMode)
  103. {
  104. CRY_ASSERT(m_bInit == true);
  105. if (bGameMode == true)
  106. {
  107. Reset();
  108. }
  109. }
  110. // Description:
  111. //
  112. // Arguments:
  113. //
  114. // Return:
  115. //
  116. void CSignalTimer::OnProxyReset(EntityId IdEntity)
  117. {
  118. CRY_ASSERT(IdEntity > 0);
  119. for (uint32 uIndex = 0; uIndex < m_vecPersonalSignalTimers.size(); ++uIndex)
  120. {
  121. if (m_vecPersonalSignalTimers[uIndex]->GetEntityId() == IdEntity)
  122. {
  123. m_vecPersonalSignalTimers[uIndex]->OnProxyReset();
  124. }
  125. }
  126. }
  127. // Description:
  128. //
  129. // Arguments:
  130. //
  131. // Return:
  132. //
  133. bool CSignalTimer::Update(float fElapsedTime)
  134. {
  135. bool bRet = true;
  136. uint32 uOrder = 0;
  137. std::vector<CPersonalSignalTimer*>::iterator iter = m_vecPersonalSignalTimers.begin();
  138. while (iter != m_vecPersonalSignalTimers.end())
  139. {
  140. CPersonalSignalTimer* pPersonal = *iter;
  141. if (pPersonal && pPersonal->Update(fElapsedTime, ((m_bDebug == true) ? ++uOrder : 0)) == false)
  142. {
  143. SAFE_DELETE(pPersonal);
  144. iter = m_vecPersonalSignalTimers.erase(iter);
  145. }
  146. else
  147. {
  148. ++iter;
  149. }
  150. }
  151. return(bRet);
  152. }
  153. // Description:
  154. //
  155. // Arguments:
  156. //
  157. // Return:
  158. //
  159. void CSignalTimer::Shutdown()
  160. {
  161. SAFE_DELETE(m_pInstance);
  162. }
  163. // Description:
  164. //
  165. // Arguments:
  166. //
  167. // Return:
  168. //
  169. bool CSignalTimer::EnablePersonalManager(EntityId IdEntity, const char* sSignal)
  170. {
  171. CRY_ASSERT(m_bInit == true);
  172. CRY_ASSERT(IdEntity > 0);
  173. CRY_ASSERT(sSignal != NULL);
  174. bool bRet = true;
  175. CPersonalSignalTimer* pPersonal = GetPersonalSignalTimer(IdEntity, sSignal);
  176. if (pPersonal == NULL)
  177. {
  178. pPersonal = CreatePersonalSignalTimer(IdEntity, sSignal);
  179. bRet = false;
  180. }
  181. pPersonal->SetEnabled(true);
  182. return(bRet);
  183. }
  184. // Description:
  185. //
  186. // Arguments:
  187. //
  188. // Return:
  189. //
  190. bool CSignalTimer::DisablePersonalSignalTimer(EntityId IdEntity, const char* sSignal)
  191. {
  192. CRY_ASSERT(m_bInit == true);
  193. CRY_ASSERT(IdEntity > 0);
  194. CRY_ASSERT(sSignal != NULL);
  195. bool bRet = false;
  196. CPersonalSignalTimer* pPersonal = GetPersonalSignalTimer(IdEntity, sSignal);
  197. if (pPersonal != NULL)
  198. {
  199. pPersonal->SetEnabled(false);
  200. bRet = true;
  201. }
  202. return(bRet);
  203. }
  204. // Description:
  205. //
  206. // Arguments:
  207. //
  208. // Return:
  209. //
  210. bool CSignalTimer::ResetPersonalTimer(EntityId IdEntity, const char* sSignal)
  211. {
  212. CRY_ASSERT(m_bInit == true);
  213. CRY_ASSERT(IdEntity > 0);
  214. CRY_ASSERT(sSignal != NULL);
  215. bool bRet = false;
  216. CPersonalSignalTimer* pPersonal = GetPersonalSignalTimer(IdEntity, sSignal);
  217. if (pPersonal != NULL)
  218. {
  219. pPersonal->ForceReset();
  220. bRet = true;
  221. }
  222. return(bRet);
  223. }
  224. // Description:
  225. //
  226. // Arguments:
  227. //
  228. // Return:
  229. //
  230. bool CSignalTimer::EnableAllPersonalManagers(EntityId IdEntity)
  231. {
  232. CRY_ASSERT(m_bInit == true);
  233. CRY_ASSERT(IdEntity > 0);
  234. bool bRet = false;
  235. for (uint32 uIndex = 0; uIndex < m_vecPersonalSignalTimers.size(); ++uIndex)
  236. {
  237. if (m_vecPersonalSignalTimers[uIndex]->GetEntityId() == IdEntity)
  238. {
  239. m_vecPersonalSignalTimers[uIndex]->SetEnabled(true);
  240. bRet = true;
  241. }
  242. }
  243. return(bRet);
  244. }
  245. // Description:
  246. //
  247. // Arguments:
  248. //
  249. // Return:
  250. //
  251. bool CSignalTimer::DisablePersonalSignalTimers(EntityId IdEntity)
  252. {
  253. CRY_ASSERT(m_bInit == true);
  254. CRY_ASSERT(IdEntity > 0);
  255. bool bRet = false;
  256. for (uint32 uIndex = 0; uIndex < m_vecPersonalSignalTimers.size(); ++uIndex)
  257. {
  258. if (m_vecPersonalSignalTimers[uIndex]->GetEntityId() == IdEntity)
  259. {
  260. m_vecPersonalSignalTimers[uIndex]->SetEnabled(false);
  261. bRet = true;
  262. }
  263. }
  264. return(bRet);
  265. }
  266. // Description:
  267. //
  268. // Arguments:
  269. //
  270. // Return:
  271. //
  272. bool CSignalTimer::ResetPersonalTimers(EntityId IdEntity)
  273. {
  274. CRY_ASSERT(m_bInit == true);
  275. CRY_ASSERT(IdEntity > 0);
  276. bool bRet = false;
  277. for (uint32 uIndex = 0; uIndex < m_vecPersonalSignalTimers.size(); ++uIndex)
  278. {
  279. if (m_vecPersonalSignalTimers[uIndex]->GetEntityId() == IdEntity)
  280. {
  281. m_vecPersonalSignalTimers[uIndex]->ForceReset();
  282. bRet = true;
  283. }
  284. }
  285. return(bRet);
  286. }
  287. // Description:
  288. //
  289. // Arguments:
  290. //
  291. // Return:
  292. //
  293. bool CSignalTimer::SetTurnRate(EntityId IdEntity, const char* sSignal, float fTime, float fTimeMax)
  294. {
  295. CRY_ASSERT(m_bInit == true);
  296. CRY_ASSERT(IdEntity > 0);
  297. CRY_ASSERT(fTime > 0.0f);
  298. CRY_ASSERT(sSignal != NULL);
  299. bool bRet = false;
  300. CPersonalSignalTimer* pPersonal = GetPersonalSignalTimer(IdEntity, sSignal);
  301. if (pPersonal != NULL)
  302. {
  303. pPersonal->SetRate(fTime, max(fTimeMax, fTime));
  304. pPersonal->ForceReset();
  305. bRet = true;
  306. }
  307. return(bRet);
  308. }
  309. // Description:
  310. //
  311. // Arguments:
  312. //
  313. // Return:
  314. //
  315. CPersonalSignalTimer* CSignalTimer::GetPersonalSignalTimer(EntityId IdEntity, const char* sSignal) const
  316. {
  317. CRY_ASSERT(m_bInit == true);
  318. CRY_ASSERT(IdEntity > 0);
  319. CRY_ASSERT(sSignal != NULL);
  320. CPersonalSignalTimer* pPersonal = NULL;
  321. for (uint32 uIndex = 0; uIndex < m_vecPersonalSignalTimers.size(); ++uIndex)
  322. {
  323. if (m_vecPersonalSignalTimers[uIndex]->GetEntityId() == IdEntity &&
  324. m_vecPersonalSignalTimers[uIndex]->GetSignalString().compareNoCase(sSignal) == 0)
  325. {
  326. pPersonal = m_vecPersonalSignalTimers[uIndex];
  327. break;
  328. }
  329. }
  330. return(pPersonal);
  331. }
  332. // Description:
  333. //
  334. // Arguments:
  335. //
  336. // Return:
  337. //
  338. void CSignalTimer::SetDebug(bool bDebug)
  339. {
  340. CRY_ASSERT(m_bInit == true);
  341. m_bDebug = bDebug;
  342. }
  343. // Description:
  344. //
  345. // Arguments:
  346. //
  347. // Return:
  348. //
  349. bool CSignalTimer::GetDebug() const
  350. {
  351. return(m_bDebug);
  352. }
  353. // Description:
  354. //
  355. // Arguments:
  356. //
  357. // Return:
  358. //
  359. CPersonalSignalTimer* CSignalTimer::CreatePersonalSignalTimer(EntityId IdEntity, const char* sSignal)
  360. {
  361. CRY_ASSERT(m_bInit == true);
  362. CRY_ASSERT(IdEntity > 0);
  363. CRY_ASSERT(sSignal != NULL);
  364. CPersonalSignalTimer* pPersonal = new CPersonalSignalTimer(this);
  365. if (pPersonal->Init(IdEntity, sSignal) == true)
  366. {
  367. m_vecPersonalSignalTimers.push_back(pPersonal);
  368. }
  369. else
  370. {
  371. SAFE_DELETE(pPersonal);
  372. }
  373. return(pPersonal);
  374. }