| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- //===========================================================================================================================
- // Spirenkov Maxim, 2003
- //===========================================================================================================================//
- // Mission objects
- //===========================================================================================================================
- // Synchronizer
- //============================================================================================
-
- #include "Synchronizer.h"
- #include "MissionReloader.h"
- const Synchronizer::Logic Synchronizer::logics[] =
- {
- {ConstString("All at one time"), &Synchronizer::LogicAll},
- {ConstString("One at one time (random)"), &Synchronizer::LogicRand},
- {ConstString("One at one time (first)"), &Synchronizer::LogicFirst},
- };
- //============================================================================================
- Synchronizer::Synchronizer() : events(_FL_)
- {
- logicIndex = -1;
- }
- Synchronizer::~Synchronizer()
- {
- }
- //============================================================================================
- //Инициализировать объект
- bool Synchronizer::Create(MOPReader & reader)
- {
- events.DelAll();
- ConstString type = reader.Enum();
- logicIndex = -1;
- for(long i = 0; i < ARRSIZE(logics); i++)
- {
- if(type == logics[i].name)
- {
- logicIndex = i;
- break;
- }
- }
- Assert(logicIndex >= 0);
- long count = reader.Array();
- for(long i = 0; i < count; i++)
- {
- Event & evt = events[events.Add()];
- evt.name = reader.String();
- evt.event.Init(reader);
- evt.state = false;
- }
- tick.Init(reader);
- Activate(reader.Bool());
- return true;
- }
- //Обработчик команд для объекта
- void Synchronizer::Command(const char * id, dword numParams, const char ** params)
- {
- if(!id) return;
- ConstString cid(id);
- static const ConstString reset("reset");
- if(cid == reset)
- {
- for(long i = 0; i < events; i++)
- {
- events[i].state = false;
- events[i].event.Reset();
- }
- LogicDebug("Reseting...");
- return;
- }
- if(!IsActive()) return;
- //Тик
- static const ConstString ctick("tick");
- if(cid == ctick)
- {
- LogicDebug("Tick event...");
- LogicDebugLevel(true);
- if(logicIndex >= 0)
- {
- LogicDebug("Logic: \"%s\"", logics[logicIndex].name.c_str());
- (this->*logics[logicIndex].logic)();
- }
- LogicDebugLevel(false);
- tick.Activate(Mission(), false);
- return;
- }
- //Если ошибочны параметры - скипаем
- if(!numParams || !params[0])
- {
- LogicDebug("Synchronizer -> invalidate event name: \"\"");
- return;
- }
- ConstString param(params[0]);
- long index = -1;
- for(long i = 0; i < events; i++)
- {
- if(events[i].name == param)
- {
- index = i;
- break;
- }
- }
- if(index < 0)
- {
- LogicDebug("Synchronizer -> invalidate input event name: \"%s\"", params[0]);
- return;
- }
- //Активация
- static const ConstString evt("event");
- if(cid == evt)
- {
- LogicDebug("Registry event \"%s\"", params[0]);
- events[index].state = true;
- return;
- }
- //Деактивация
- static const ConstString unevt("unevent");
- if(cid == unevt)
- {
- LogicDebug("Unevent \"%s\"", params[0]);
- events[index].state = false;
- return;
- }
- LogicDebugError("Unknown command: %s", id);
- }
- //Активировать
- void Synchronizer::Activate(bool isActive)
- {
- MissionObject::Activate(isActive);
- if(IsActive())
- {
- LogicDebug("Activate");
- }else{
- LogicDebug("Deactivate");
- }
- }
- //Инициализировать объект
- bool Synchronizer::EditMode_Create(MOPReader & reader)
- {
- return true;
- }
- //Обновить параметры
- bool Synchronizer::EditMode_Update(MOPReader & reader)
- {
- return true;
- }
- //Получить размеры описывающего ящика
- void Synchronizer::EditMode_GetSelectBox(Vector & min, Vector & max)
- {
- min = max = 0.0f;
- }
- void _cdecl Synchronizer::LogicAll()
- {
- for(long i = 0; i < events; i++)
- {
- if(events[i].state)
- {
- LogicDebug("Activate event \"%s\"", events[i].name.c_str());
- events[i].event.Activate(Mission(), false);
- events[i].state = false;
- }
- }
- }
- void _cdecl Synchronizer::LogicRand()
- {
- long count = 0;
- for(long i = 0; i < events; i++)
- {
- if(events[i].state)
- {
- count++;
- }
- }
- if(!count) return;
- long index = (long)Rnd(count + 0.999f);
- if(index >= count) index = count - 1;
- count = 0;
- for(long i = 0; i < events; i++)
- {
- if(events[i].state)
- {
- if(count++ == index)
- {
- LogicDebug("Activate event \"%s\"", events[i].name.c_str());
- events[i].event.Activate(Mission(), false);
- events[i].state = false;
- return;
- }
- }
- }
- Assert(false);
- }
- void _cdecl Synchronizer::LogicFirst()
- {
- for(long i = 0; i < events; i++)
- {
- if(events[i].state)
- {
- LogicDebug("Activate event \"%s\"", events[i].name.c_str());
- events[i].event.Activate(Mission(), false);
- events[i].state = false;
- break;
- }
- }
- }
- //============================================================================================
- //Описание
- //============================================================================================
- const char * Synchronizer::desc =
- "Trigger type:\n"
- " #b\"All at one time\"@b when get tick event, all active input triggers,\n"
- " sended events and reset it active state\n"
- " #b\"One at one time (random)\"@b when get tick event, one random active input trigger\n"
- " sended event and reset his active state\n"
- " #b\"One at one time (first)\"@b when get tick event, one first active input trigger\n"
- " sended event and reset his active state\n"
- " ";
- const char * Synchronizer::comment =
- "Object for synchinize events in time\n"
- " \n"
- "Commands list:\n"
- "----------------------------------------\n"
- " Tick event - time for action\n"
- "----------------------------------------\n"
- " command: tick\n"
- " \n"
- "----------------------------------------\n"
- " Activate input trigger\n"
- "----------------------------------------\n"
- " command: event\n"
- " parm: input trigger name\n"
- " \n"
- "----------------------------------------\n"
- " Deactivate input trigger\n"
- "----------------------------------------\n"
- " command: unevent\n"
- " parm: input trigger name\n"
- " \n"
- "----------------------------------------\n"
- " Reset all input triggers and\n"
- " output trigger\n"
- "----------------------------------------\n"
- " command: reset\n"
- " \n"
- " ";
- //============================================================================================
- //Параметры инициализации
- //============================================================================================
- MOP_BEGINLISTCG(Synchronizer, "Synchronizer", '1.00', 0x0fffffff, Synchronizer::comment, "Logic")
- MOP_ENUMBEG("SynchroFunction")
- for(dword i = 0; i < ARRSIZE(Synchronizer::logics); i++)
- {
- MOP_ENUMELEMENT(Synchronizer::logics[i].name.c_str())
- }
- MOP_ENUMEND
- MOP_ENUMC("SynchroFunction", "Type", Synchronizer::desc)
- MOP_ARRAYBEGC("Events", 1, 1000, "Synchronize/unsynchronize events")
- MOP_STRINGC("Name", "", "Input event name")
- MOP_MISSIONTRIGGER("")
- MOP_ARRAYEND
- MOP_MISSIONTRIGGERG("Tick event", "Tick event")
- MOP_BOOLC("Active", true, "Active trigger in start mission time")
- MOP_ENDLIST(Synchronizer)
|