class InputUtils { //useful for console preset differentiation static const string PRESET_OLD = "#STR_UAPRESET_0"; static const string PRESET_NEW = "#STR_UAPRESET_1"; static const int VARIANT_OLD = 0; static const int VARIANT_NEW = 1; static int m_CurrentPresetIDConsole = -1; // static protected ref map> m_InputActionSortingMap; //> static protected ref array m_UnsortedInputActions; static const float ICON_SCALE_NORMAL = 1.21; static const float ICON_SCALE_TOOLBAR = 1.81; static string GetButtonNameFromInput(string pInputName, int pInputDeviceType) { UAInput inp = GetUApi().GetInputByName(pInputName); for (int i = 0; i < inp.AlternativeCount(); i++) { inp.SelectAlternative(i); if (inp.CheckBindDevice(0, pInputDeviceType)) { return GetUApi().GetButtonName(inp.GetBindKey(0)); } } return ""; } //! returns a map of button names, combo or not static map GetComboButtonNamesFromInput(string pInputName, int pInputDeviceType) //TODO: revisit to include same input device alternatives too? { UAInput inp = GetUApi().GetInputByName(pInputName); TStringArray buttons; map output;//> for (int i = 0; i < inp.AlternativeCount(); i++) { inp.SelectAlternative(i); if (inp.BindingCount() > 0 && inp.Binding(0) != 0 && inp.CheckBindDevice(0,pInputDeviceType)) { buttons = new TStringArray; if (inp.IsCombo()) { buttons.Insert(GetUApi().GetButtonName( inp.Binding(0) )); for (int j = 1; j < inp.BindingCount(); j++) { if (inp.Binding(j) != 0 && inp.CheckBindDevice(j,pInputDeviceType)) { buttons.Insert(GetUApi().GetButtonName( inp.Binding(j) )); } } //return buttons; } else { buttons.Insert(GetUApi().GetButtonName(inp.GetBindKey(0))); //return buttons; } if (buttons.Count() > 0) { if (!output) { output = new map; } output.Insert(i,buttons); } } } return output; } static array GetButtonIconPathFromInput(notnull UAInput pInput, int pInputDeviceType = EUAINPUT_DEVICE_CONTROLLER) { array buttonIcons = new array(); for (int i = 0; i < pInput.AlternativeCount(); i++) { pInput.SelectAlternative(i); bool done = false; for (int bk = 0; bk < pInput.BindKeyCount(); bk++) { if (pInput.CheckBindDevice(0, pInputDeviceType)) { buttonIcons.Insert(GetUApi().GetButtonIcon(pInput.Binding(bk))); if (bk == pInput.BindKeyCount() - 1) { done = true; } } } if (done) { buttonIcons.Invert(); return buttonIcons; } } return buttonIcons; } static array GetButtonIconPathFromInput(string pInputName, int pInputDeviceType) { UAInput inp = GetUApi().GetInputByName(pInputName); array buttonIcons = new array(); buttonIcons = InputUtils.GetButtonIconPathFromInput(inp, pInputDeviceType); return buttonIcons; } static void GetImagesetAndIconFromInputAction(notnull UAInput pInput, int pInputDeviceType, out array pImageSet, out array pIconName) { array buttons = InputUtils.GetButtonIconPathFromInput(pInput, pInputDeviceType); if (buttons.Count() == 0 ) { return; } for (int i = 0; i < buttons.Count(); i++) { array parts = new array; buttons.Get(i).Split(":", parts); if (parts.Count() < 2) { return; } pImageSet.Insert(parts[1].SubstringInverted(parts[1], parts[1].Length() - 6, parts[1].Length())); //! Asia vs Europe/N.America controller layout #ifdef PLATFORM_PS4 if (GetGame().GetInput().GetEnterButton() == GamepadButton.B) { //! switch confirm button if (parts[2] == "cross") { parts[2] = "circle"; } //! switch back button if (parts[2] == "circle") { parts[2] = "cross"; } } #endif pIconName.Insert(parts[2]); } } static void GetImagesetAndIconFromInputAction(string pInputAction, int pInputDeviceType, out array pImageSet, out array pIconName) { UAInput inp = GetUApi().GetInputByName(pInputAction); InputUtils.GetImagesetAndIconFromInputAction(inp, pInputDeviceType, pImageSet, pIconName); } static string GetRichtextButtonIconFromInputAction(notnull UAInput pInput, string pLocalizedDescription, int pInputDeviceType = EUAINPUT_DEVICE_CONTROLLER, float pScale = ICON_SCALE_NORMAL, bool pVertical = false) { array imageSets = new array(); array iconNames = new array(); InputUtils.GetImagesetAndIconFromInputAction(pInput, pInputDeviceType, imageSets, iconNames); if (imageSets.Count() == 0) { return ""; } string result = string.Format("", imageSets.Get(0), iconNames.Get(0), pScale); string divider = " "; if (pVertical) { divider = string.Format("\n%1\n", divider); } if (imageSets.Count() > 1) { //! first element is already taken for (int i = 1; i < imageSets.Count(); i++) { result = string.Format("%1%2", result, divider, imageSets.Get(i), iconNames.Get(i), pScale); } } return string.Format("%1 %2", result, pLocalizedDescription); } static string GetRichtextButtonIconFromInputAction(string pInputAction, string pLocalizedDescription, int pInputDeviceType = EUAINPUT_DEVICE_CONTROLLER, float pScale = ICON_SCALE_NORMAL, bool pVertical = false) { UAInput inp = GetUApi().GetInputByName(pInputAction); array imageSets = new array(); array iconNames = new array(); InputUtils.GetImagesetAndIconFromInputAction(inp, pInputDeviceType, imageSets, iconNames); return InputUtils.GetRichtextButtonIconFromInputAction(inp, pLocalizedDescription, pInputDeviceType, pScale, pVertical); } static void UpdateConsolePresetID() { string profile_name; GetGame().GetInput().GetProfileName(GetUApi().PresetCurrent(), profile_name); if (profile_name == PRESET_OLD) { m_CurrentPresetIDConsole = VARIANT_OLD; } else { m_CurrentPresetIDConsole = VARIANT_NEW; } } static int GetConsolePresetID() { return m_CurrentPresetIDConsole; } static map> GetInputActionSortingMap() { return m_InputActionSortingMap; } static array GetUnsortedInputActions() { return m_UnsortedInputActions; } static bool InitInputMetadata() { if (!m_InputActionSortingMap) { m_InputActionSortingMap = new map>; TIntArray sorted_actions = new TIntArray; if (!m_UnsortedInputActions) { m_UnsortedInputActions = new array; } GetUApi().GetActiveInputs(m_UnsortedInputActions); UAInput inp; for (int i = 0; i < GetUApi().SortingCount(); i++) { int input_id; array sorting_content = new array; for (int j = 0; j < m_UnsortedInputActions.Count(); j++) { input_id = m_UnsortedInputActions[j]; inp = GetUApi().GetInputByID(input_id); if (inp.HasSorting(i)) { sorting_content.Insert(input_id); sorted_actions.Insert(input_id); } } if (sorting_content.Count() > 0) { sorting_content.Sort(); m_InputActionSortingMap.Insert(i,sorting_content); } } //remove sorted used inputs int count = sorted_actions.Count(); for (i = 0; i < count; i++) { m_UnsortedInputActions.RemoveItem(sorted_actions[i]); } return true; } return false; } }