При написании GuiLog с функцие телетайпа понадобился класс отвечающий за телетайп-строку.
Реализация не до конца продуманна и не идеальна, но работает.
Суть заключается в том что сам класс содержит саму строку, и функционал по телетайпу(задерждка, старт, цвет и т.д.)

Переделал менеджер событий EventManager ver2, исправлены некоторые ошибки(отложенная отправка проваливалась если на событие не было подписчиков).

Приемущества от предыдущей версии:
 - Весь код засунут в конструктор
 - отсюда, возможно создать не ограниченное количество менеджеров, например для Gui, System, GameEvents и других назначений.

Минусы:
- отладка!, если что то пошло не так, отладить или отлавливать логическую ошибку в МОРЕ событий  это просто АД. В код я засунул по возможности где можно выводы в лог отладчика, это хоть как то да помогает найти проблемные места.

Следующая улучшенная версия менеджера событий ver1 подошла к выходу.


1. Решена проблема функциональной атомарности.
2. Вызывать события можно прямо из метода Create любого объекта независимо от его позиции в иерархии создания объектов в комнате. Это не маловажный нюанс, т.к. не обязательно создавать менеджер событий самым первым в комнате, тем самым повышается гибкость использования скрипта. Но вызов события должен быть обязательно "отложенный" т.е. events_queque_publish
Пример:

//метод Create

events_listen("kuku", function(_data) 
{
	trace("получил данные = ", _data);
});

events_queque_publish("kuku", "отправка всем данных");

Данное сообщение получат все объекты кто подписался на событие kuku

При масштабировании программного кода возникла необходимость взаимодействия между собой большого количества объектов. Реализовывать внутри объектов ссылки на другие объекту идея не очень. Необходимо что бы взаимодействие осуществлялось между собой абсолютно не связанных между собой объектов. Что бы они понятия не имели о существовании друг друга но имели возможность "общения" между собой.

Функциональные требования к менеджеру:

1. Иметь возможность любому объекту подписки на событие сразу в событии Create(касается п.7), и отправка сообщения подписчикам с параметрами (это базовые требования).

2. Исключена возможность двойной подписки конкретного объекта, на конкретное событие.

3. Должна быть как ручная отписка, так и автоматическая, в случае уничтожения(исчезновения) объекта, да бы если подписчик вдруг "откинется" и не засорять пустыми данными структуру подписчиков.

4. возможность отписки от всего и сразу!

5. отложенная во времени отправка сообщений подписчикам - это значительно экономит такты процессорного времени в каждом шаге/step`е программы ,  так же решает проблему функциональной атомарности.

6. Возможность подписки сразу же в событии Create объекта, т.е. менеджер событий уже должен быть готов как штык к плотной работе!  

7. отвязка менеджера от базового "объекта менеджера" в комнате (или по крайне мере от хронологии его создания в комнате) касается п.1

8. простота использования

 

В результате на свет появился данный скрипт менеджера событий, выступающего в роли посредника между объектами.

И так содержимое скрипта sript_listen_manager.gml

Для упорядочивания и создание удобоваримого вывода отладочной информации запилен простеньки логировщик:

globalvar trace_isfirst;
trace_isfirst=true;

function _log(t){ show_debug_message(t);};
//*************************************************************************************
function trace() 
{
	if trace_isfirst then
	{
		trace_isfirst=false;
		_log("");_log("");
		_log("==============================================================================");

		_log("=                        Началo лoгa                                        =");		

		_log("==============================================================================");
	}	
	var r = string(argument[0]), i;	
	for (i = 1; i < argument_count; i++) 
	{
	  var _arg=argument[i];		
		if _arg=="1" then r += "true(1)";
		else if _arg=="0" then r += "false(0)";
		else r += "" + string(argument[i]);		
	}	
	var _oname = object_get_name(object_index);	
	
	var _iname = "";
	var e = _get_event(event_type) + "[" + string(event_number) + "]";	
	var _date = date_time_string(date_current_datetime()) + ": ";
	show_debug_message(_date + "object=(" + _oname + "" + _iname + "), event" + string(event_type) +"=("+ e + "): " + r);	
}

Выводятся в одну строку инфа "дата:время  объект:событие + допинфа в зависимости от аргументов"