diff options
Diffstat (limited to 'CrewSelection.c4d/Script.c')
| -rw-r--r-- | CrewSelection.c4d/Script.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/CrewSelection.c4d/Script.c b/CrewSelection.c4d/Script.c new file mode 100644 index 0000000..5282b3b --- /dev/null +++ b/CrewSelection.c4d/Script.c @@ -0,0 +1,194 @@ +#strict 2 + +func Activate(int player) +{ + var cursor = GetCursor(player); + if(!cursor) + { + return; + } + + var selectionMark = cursor->CreateSelectMark(); + var menu = CreateNewMenu + ([ + Menu_Caption(GetName(this)), + Menu_Symbol(GetID()), + Menu_Object(cursor), + Menu_Style_Context(), + + Menu_Factory([ObjectCallback("CrewFactory", true)], [player, selectionMark]), + Menu_Entry([ + Menu_Entry_Caption("$SelectAll$"), + Menu_Entry_Callbacks([Menu_Callback(ObjectCallback("SelectAll", true), Menu_CallbackType_Defaults, [Menu_CallbackArg_Args, Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject])]), + Menu_Entry_Args([player, 0, -3]) + ]), + Menu_Entry([ + Menu_Entry_Caption("$InvertSelection$"), + Menu_Entry_Callbacks([Menu_Callback(ObjectCallback("InvertSelection", true), Menu_CallbackType_Defaults, [Menu_CallbackArg_Args, Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject])]), + Menu_Entry_Args([player, 0, -2]) + ]), + Menu_Accept() + ]); + + var effect = AddEffect("CleanupSelectionMark", menu, 1, 0, this, 0); + 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("<c 888888>%s</c>", caption); + } + + ArrayAppend(entries, Menu_Entry + ([ + Menu_Entry_Caption(caption), + Menu_Entry_Symbol(crew), + + Menu_Entry_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]) + ]), + Menu_Entry_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; +}
\ No newline at end of file |
