// ============================================================================= // KEYBINDS MENU // ============================================================================= function ControlsMenuDefaultsButton::onClick(%this) { //For this to work with module-style, we have to figure that somewhere, we'll set where our default keybind script is at. //This can be hardcoded in your actual project. //exec($KeybindPath); //ControlsMenu.reload(); } function getMapDisplayName( %device, %action ) { if ( %device $= "keyboard" ) return( %action ); else if ( strstr( %device, "mouse" ) != -1 ) { // Substitute "mouse" for "button" in the action string: %pos = strstr( %action, "button" ); if ( %pos != -1 ) { %mods = getSubStr( %action, 0, %pos ); %object = getSubStr( %action, %pos, 1000 ); %instance = getSubStr( %object, strlen( "button" ), 1000 ); return( %mods @ "mouse" @ ( %instance + 1 ) ); } else error( "Mouse input object other than button passed to getDisplayMapName!" ); } else if ( strstr( %device, "joystick" ) != -1 ) { // Substitute "joystick" for "button" in the action string: %pos = strstr( %action, "button" ); if ( %pos != -1 ) { %mods = getSubStr( %action, 0, %pos ); %object = getSubStr( %action, %pos, 1000 ); %instance = getSubStr( %object, strlen( "button" ), 1000 ); return( %mods @ "joystick" @ ( %instance + 1 ) ); } else { %pos = strstr( %action, "pov" ); if ( %pos != -1 ) { %wordCount = getWordCount( %action ); %mods = %wordCount > 1 ? getWords( %action, 0, %wordCount - 2 ) @ " " : ""; %object = getWord( %action, %wordCount - 1 ); switch$ ( %object ) { case "upov": %object = "POV1 up"; case "dpov": %object = "POV1 down"; case "lpov": %object = "POV1 left"; case "rpov": %object = "POV1 right"; case "upov2": %object = "POV2 up"; case "dpov2": %object = "POV2 down"; case "lpov2": %object = "POV2 left"; case "rpov2": %object = "POV2 right"; default: %object = ""; } return( %mods @ %object ); } else error( "Unsupported Joystick input object passed to getDisplayMapName!" ); } } else if ( strstr( %device, "gamepad" ) != -1 ) { return %action; %pos = strstr( %action, "button" ); if ( %pos != -1 ) { %mods = getSubStr( %action, 0, %pos ); %object = getSubStr( %action, %pos, 1000 ); %instance = getSubStr( %object, strlen( "button" ), 1000 ); return( %mods @ "joystick" @ ( %instance + 1 ) ); } else { %pos = strstr( %action, "thumb" ); if ( %pos != -1 ) { //%instance = getSubStr( %action, strlen( "thumb" ), 1000 ); //return( "thumb" @ ( %instance + 1 ) ); return %action; } else error( "Unsupported gamepad input object passed to getDisplayMapName!" ); } } return( "" ); } function buildFullMapString( %index, %actionMap, %deviceType ) { %name = $RemapName[%index]; %cmd = $RemapCmd[%index]; %temp = %actionMap.getBinding( %cmd ); if ( %temp $= "" ) return %name TAB ""; %mapString = ""; %count = getFieldCount( %temp ); for ( %i = 0; %i < %count; %i += 2 ) { if ( %mapString !$= "" ) continue; //%mapString = %mapString @ ", "; %device = getField( %temp, %i + 0 ); %object = getField( %temp, %i + 1 ); if (startsWith(%device,"mouse")) %deviceType = "mouse"; if(%deviceType !$= "" && !startsWith(%device, %deviceType)) continue; %mapString = %mapString @ getMapDisplayName( %device, %object ); } return %name TAB %mapString; } function fillRemapList() { %device = $remapListDevice; OptionsMenuSettingsList.clear(); //build out our list of action maps %actionMapCount = ActionMapGroup.getCount(); %actionMapList = ""; for(%i=0; %i < %actionMapCount; %i++) { %actionMap = ActionMapGroup.getObject(%i); if(%actionMap == GlobalActionMap.getId()) continue; %actionMapName = %actionMap.humanReadableName $= "" ? %actionMap.getName() : %actionMap.humanReadableName; //see if we have any actual listed remappable keys for this movemap. if so, drop it from the listing %hasRemaps = false; for ( %r = 0; %r < $RemapCount; %r++ ) { %testMapName = $RemapActionMap[%r].humanReadableName $= "" ? $RemapActionMap[%r].getName() : $RemapActionMap[%r].humanReadableName; if(%actionMapName $= %testMapName) { //got a match to at least one, so we're ok to continue %hasRemaps = true; break; } } if(!%hasRemaps) continue; if(%actionMapList $= "") %actionMapList = %actionMapName; else %actionMapList = %actionMapList TAB %actionMapName; } //If we didn't find any valid actionMaps, then just exit out if(%actionMapList $= "") return; if($activeRemapControlSet $= "") $activeRemapControlSet = getField(%actionMapList, 0); OptionsMenuSettingsList.addOptionRow("Control Set", "$activeRemapControlSet", %actionMapList, false, "controlSetChanged", true, "Which keybind control set to edit", $activeRemapControlSet); for ( %i = 0; %i < $RemapCount; %i++ ) { if(%device !$= "" && %device !$= $RemapDevice[%i]) continue; %actionMapName = $RemapActionMap[%i].humanReadableName $= "" ? $RemapActionMap[%i].getName() : $RemapActionMap[%i].humanReadableName; if($activeRemapControlSet !$= %actionMapName) continue; %keyMap = buildFullMapString( %i, $RemapActionMap[%i], %device ); %description = $RemapDescription[%i]; %buttonImageAsset = getButtonBitmap(%device, getField(%keyMap, 1)); OptionsMenuSettingsList.addKeybindRow(getField(%keyMap, 0), %buttonImageAsset, "doKeyRemap", true, %description, %i); } //OptionsMenuSettingsList.refresh(); //OptionsMenu.addRow( %i, %this.buildFullMapString( %i ) ); } function controlSetChanged() { $activeRemapControlSet = OptionsMenuSettingsList.getObject(0).getCurrentOption(); fillRemapList(); } function ControlsMenuRebindButton::onClick(%this) { %name = $RemapName[%this.keybindIndex]; RemapDlg-->OptRemapText.text = "Re-bind \"" @ %name @ "\" to..." ; OptRemapInputCtrl.index = %this.keybindIndex; OptRemapInputCtrl.optionIndex = %this.optionIndex; Canvas.pushDialog( RemapDlg ); } function findRemapCmdIndex( %command ) { for ( %i = 0; %i < $RemapCount; %i++ ) { if ( %command $= $RemapCmd[%i] ) return( %i ); } return( -1 ); } function redoMapping( %device, %actionMap, %action, %cmd, %oldIndex, %newIndex ) { //%actionMap.bind( %device, %action, $RemapCmd[%newIndex] ); %actionMap.bind( %device, %action, %cmd ); fillRemapList(); }