| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- //============================================================================================
- // Spirenkov Maxim, 2006
- //============================================================================================
- // MissionTime
- //============================================================================================
- #include "MissionTime.h"
- MissionTime::MissionTime()
- {
- timeScale = 1.0f;
- oldTimeScale = newTimeScale = 1.0f;
- speed = blendPosition = 1.0f;
- }
- MissionTime::~MissionTime()
- {
- ::Mission & mis = (::Mission &)Mission();
- mis.RemoveTimeModifier(&timeScale);
- }
- //Инициализировать объект
- bool MissionTime::Create(MOPReader & reader)
- {
- speed = blendPosition = 1.0f;
- timeScale = oldTimeScale = newTimeScale = reader.Float();
- Activate(reader.Bool());
- trigger.Init(reader);
- return true;
- }
- //Активировать/деактивировать объект
- void MissionTime::Activate(bool isActive)
- {
- MissionObject::Activate(isActive);
- ::Mission & mis = (::Mission &)Mission();
- if(isActive)
- {
- mis.AddTimeModifier(&timeScale);
- }else{
- mis.RemoveTimeModifier(&timeScale);
- DelUpdate(&MissionTime::Update);
- }
- }
- //Обработчик команд для объекта
- void MissionTime::Command(const char * id, dword numParams, const char ** params)
- {
- Assert(id);
- if(string::IsEqual(id, "set"))
- {
- if(numParams)
- {
- char * ptr = (char *)params[0];
- newTimeScale = (float)strtod(params[0], &ptr);
- newTimeScale = Clampf(newTimeScale, 0.0f, 10000.0f);
- oldTimeScale = timeScale;
- if(numParams > 1)
- {
- char * ptr = (char *)params[1];
- speed = (float)strtod(params[1], &ptr);
- speed = Clampf(speed, 0.0f, 1000.0f);
- LogicDebug("Command \"set\" blend current value %f to %f by %f seconds", oldTimeScale, newTimeScale, speed);
- if(speed > 1e-10f)
- {
- speed = 1.0f/speed;
- blendPosition = 0.0f;
- SetUpdate(&MissionTime::Update);
- }else{
- timeScale = newTimeScale;
- }
- }else{
- timeScale = newTimeScale;
- LogicDebug("Command \"set\" current value is %f", timeScale);
- }
- }else{
- LogicDebugError("Skipp command \"%s\" becouse no parameters", id);
- }
- }else{
- LogicDebugError("Undefined command: \"%s\"", id);
- }
- }
- //Исполниться
- void _cdecl MissionTime::Update(float dltTime, long level)
- {
- dltTime = api->GetDeltaTime();
- blendPosition += speed*dltTime;
- if(blendPosition < 1.0f)
- {
- timeScale = oldTimeScale + (newTimeScale - oldTimeScale)*blendPosition;
- }else{
- timeScale = newTimeScale;
- DelUpdate(&MissionTime::Update);
- trigger.Activate(Mission(), false);
- }
- }
- //Пересоздать объект
- void MissionTime::Restart()
- {
- Unregistry();
- DelUpdate();
- ReCreate();
- };
- //Инициализировать объект
- bool MissionTime::EditMode_Create(MOPReader & reader)
- {
- return true;
- }
- const char * MissionTime::comment =
- "Mission time apply time scale for current mission...\n"
- "\n"
- "Commands list:\n"
- "----------------------------------------\n"
- " Command set - set new current value\n"
- "----------------------------------------\n"
- " command: set\n"
- " parm: time\n"
- " [parm: blend time from current to default value]\n"
- " if blend time not defined, value set instantly\n"
- " \n"
- " ";
- MOP_BEGINLISTCG(MissionTime, "Mission time", '1.00', 0, MissionTime::comment, "Managment")
- MOP_FLOATEXC("Time scale", 1.0f, 0.000001f, 1000.0f, "Default time scale")
- MOP_BOOL("Active", true)
- MOP_MISSIONTRIGGERG("Event", "End command event")
- MOP_ENDLIST(MissionTime)
|