MissionTime.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //============================================================================================
  2. // Spirenkov Maxim, 2006
  3. //============================================================================================
  4. // MissionTime
  5. //============================================================================================
  6. #include "MissionTime.h"
  7. MissionTime::MissionTime()
  8. {
  9. timeScale = 1.0f;
  10. oldTimeScale = newTimeScale = 1.0f;
  11. speed = blendPosition = 1.0f;
  12. }
  13. MissionTime::~MissionTime()
  14. {
  15. ::Mission & mis = (::Mission &)Mission();
  16. mis.RemoveTimeModifier(&timeScale);
  17. }
  18. //Инициализировать объект
  19. bool MissionTime::Create(MOPReader & reader)
  20. {
  21. speed = blendPosition = 1.0f;
  22. timeScale = oldTimeScale = newTimeScale = reader.Float();
  23. Activate(reader.Bool());
  24. trigger.Init(reader);
  25. return true;
  26. }
  27. //Активировать/деактивировать объект
  28. void MissionTime::Activate(bool isActive)
  29. {
  30. MissionObject::Activate(isActive);
  31. ::Mission & mis = (::Mission &)Mission();
  32. if(isActive)
  33. {
  34. mis.AddTimeModifier(&timeScale);
  35. }else{
  36. mis.RemoveTimeModifier(&timeScale);
  37. DelUpdate(&MissionTime::Update);
  38. }
  39. }
  40. //Обработчик команд для объекта
  41. void MissionTime::Command(const char * id, dword numParams, const char ** params)
  42. {
  43. Assert(id);
  44. if(string::IsEqual(id, "set"))
  45. {
  46. if(numParams)
  47. {
  48. char * ptr = (char *)params[0];
  49. newTimeScale = (float)strtod(params[0], &ptr);
  50. newTimeScale = Clampf(newTimeScale, 0.0f, 10000.0f);
  51. oldTimeScale = timeScale;
  52. if(numParams > 1)
  53. {
  54. char * ptr = (char *)params[1];
  55. speed = (float)strtod(params[1], &ptr);
  56. speed = Clampf(speed, 0.0f, 1000.0f);
  57. LogicDebug("Command \"set\" blend current value %f to %f by %f seconds", oldTimeScale, newTimeScale, speed);
  58. if(speed > 1e-10f)
  59. {
  60. speed = 1.0f/speed;
  61. blendPosition = 0.0f;
  62. SetUpdate(&MissionTime::Update);
  63. }else{
  64. timeScale = newTimeScale;
  65. }
  66. }else{
  67. timeScale = newTimeScale;
  68. LogicDebug("Command \"set\" current value is %f", timeScale);
  69. }
  70. }else{
  71. LogicDebugError("Skipp command \"%s\" becouse no parameters", id);
  72. }
  73. }else{
  74. LogicDebugError("Undefined command: \"%s\"", id);
  75. }
  76. }
  77. //Исполниться
  78. void _cdecl MissionTime::Update(float dltTime, long level)
  79. {
  80. dltTime = api->GetDeltaTime();
  81. blendPosition += speed*dltTime;
  82. if(blendPosition < 1.0f)
  83. {
  84. timeScale = oldTimeScale + (newTimeScale - oldTimeScale)*blendPosition;
  85. }else{
  86. timeScale = newTimeScale;
  87. DelUpdate(&MissionTime::Update);
  88. trigger.Activate(Mission(), false);
  89. }
  90. }
  91. //Пересоздать объект
  92. void MissionTime::Restart()
  93. {
  94. Unregistry();
  95. DelUpdate();
  96. ReCreate();
  97. };
  98. //Инициализировать объект
  99. bool MissionTime::EditMode_Create(MOPReader & reader)
  100. {
  101. return true;
  102. }
  103. const char * MissionTime::comment =
  104. "Mission time apply time scale for current mission...\n"
  105. "\n"
  106. "Commands list:\n"
  107. "----------------------------------------\n"
  108. " Command set - set new current value\n"
  109. "----------------------------------------\n"
  110. " command: set\n"
  111. " parm: time\n"
  112. " [parm: blend time from current to default value]\n"
  113. " if blend time not defined, value set instantly\n"
  114. " \n"
  115. " ";
  116. MOP_BEGINLISTCG(MissionTime, "Mission time", '1.00', 0, MissionTime::comment, "Managment")
  117. MOP_FLOATEXC("Time scale", 1.0f, 0.000001f, 1000.0f, "Default time scale")
  118. MOP_BOOL("Active", true)
  119. MOP_MISSIONTRIGGERG("Event", "End command event")
  120. MOP_ENDLIST(MissionTime)