#strict 3 func Activate(int player) { var cursor = GetCursor(player); if(!cursor) { return; } var selectionMark = cursor->CreateSelectMark(); var menu = CreateNewMenu ({ Settings = { Title = GetName(this), Icon = GetID(), Object = cursor, Style = C4MN_Style_Context }, Entries = [ Menu_Factory([ObjectCallback("CrewFactory", true)], [player, selectionMark]), Menu_Entry({ Text = "$SelectAll$", Callbacks = [Menu_Callback(ObjectCallback("SelectAll", true), Menu_CallbackType_Defaults, [Menu_CallbackArg_Args, Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject])], Args = [player, 0, -3] }), Menu_Entry({ Text = "$InvertSelection$", Callbacks = [Menu_Callback(ObjectCallback("InvertSelection", true), Menu_CallbackType_Defaults, [Menu_CallbackArg_Args, Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject])], Args = [player, 0, -2] }), Menu_Accept() ] }); var effect = AddEffect("CleanupSelectionMark", menu, 1, 0, this); EffectVar(0, menu, effect) = selectionMark; EffectVar(1, menu, effect) = player; return menu; } func CrewFactory(array args, int entryNumber) { var player = args[0]; var selectionMark = args[1]; var entries = []; for(var i = GetCrewCount(player) - 1; i >= 0 ; --i) { var crew = GetCrew(player, i); if(crew) { var caption = GetName(crew); if(!IsCrewSelected(player, crew)) { caption = Format("%s", caption); } entries[] = Menu_Entry ({ Text = caption, Icon = [crew, false], Callbacks = [ Menu_Callback(ObjectCallback("CrewSelection", true), Menu_CallbackType_Defaults, [Menu_CallbackArg_Args, Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject]), Menu_Callback(ObjectCallback("HighlightCrew", true), Menu_CallbackType_Selection, [Menu_CallbackArg_Args]), Menu_Callback(ObjectCallback("UnhighlightCrew", true), Menu_CallbackType_Deselection, [Menu_CallbackArg_Args]) ], Args = [player, crew, entryNumber, selectionMark] }); ++entryNumber; } } return entries; } func CheckReopenMenu(array args, object currentCursor) { if(GetCursor(args[0]) != currentCursor) { Activate(args[0])->SelectEntry(args[2]); return Menu_React_Close; } } func CheckReopenOrCloseMenu(array args, int action, object currentCursor) { if(action == Menu_CallbackType_Special2) { return CheckReopenMenu(args, currentCursor) || Menu_React_Refresh; } else { return Menu_React_Close; } } func CrewSelection(array args, int action, object currentCursor) { if(action == Menu_CallbackType_Special2) { SelectCrew(args[0], args[1], !IsCrewSelected(args[0], args[1])); } else { UnselectCrew(args[0]); SetCursor(args[0], args[1]); } return CheckReopenOrCloseMenu(args, action, currentCursor); } func SelectAll(array args, int action, object currentCursor) { for(var i = 0; i < GetCrewCount(args[0]); ++i) { var crew = GetCrew(args[0], i); if(crew) { SelectCrew(args[0], crew, true); } } return CheckReopenOrCloseMenu(args, action, currentCursor); } func InvertSelection(array args, int action, object currentCursor) { for(var i = 0; i < GetCrewCount(args[0]); ++i) { var crew = GetCrew(args[0], i); if(crew && crew != currentCursor) { SelectCrew(args[0], crew, !IsCrewSelected(args[0], crew)); } } // in case the current cursor is the first clonk it can't be unselected otherwise SelectCrew(args[0], currentCursor, false); return CheckReopenOrCloseMenu(args, action, currentCursor); } func HighlightCrew(array args) { SetPlrView(args[0], args[1]); if(args[3]) { args[3]->MarkObject(args[1]); } } func UnhighlightCrew(array args) { if(args[3]) { args[3]->Hide(); SetPlrView(args[0], GetCursor(args[0])); } } func FxCleanupSelectionMarkStop(object target, int effectNumber, int reason, bool temp) { if(!temp) { var selectionMark = EffectVar(0, target, effectNumber); if(selectionMark) { RemoveObject(selectionMark); } var player = EffectVar(1, target, effectNumber); SetPlrView(player, GetCursor(player)); } } func IsCrewSelected(int player, object crew) { for(var i = 0; i < GetCursorCount(); ++i) { if(GetCursor(player, i) == crew) { return true; } } return false; } // this is needed because GetSelectCount seems to not update immediately -.- func GetCursorCount(int player) { for(var i = 0; GetCursor(player, i); ++i); return i; }