using System; using System.Collections.Generic; using System.Linq; using System.Text; using SCJMapper_V2.SC; using SCJMapper_V2.Devices; using SCJMapper_V2.Devices.Joystick; namespace SCJMapper_V2.Actions { /// /// Maintains one ActionCommand /// AC2 style input is used i.e. with device tag in front /// commands are a built from as devID_input where .. /// devID: jsN, mo1, xi1, kb1, thumbl_down and modified ones: ralt+button1 (modifier+deviceinput) /// input: x, mouse1, r, and ~ as internal blend (defined in DeviceCls) /// public class ActionCommandCls : ICloneable { /// /// The Input commands used incl. modifiers (mod+command) /// public string Input { get; set; } // AC2 style: input command name AC2 e.g. x, mouse1, r, "~" to blend /// /// The device ID of the device (jsN, mo1, kb1, xi1) /// public string DevID { get; set; } // the device ID (jsN, mo1, xi1, kb1) /// /// The applied ActivationMode for this command /// public ActivationMode ActivationMode { get; set; } // "" or one of the defined ActivationModes /// /// Returns true if default ActivationMode is set /// public bool DefaultActivationMode { get { return ActivationMode == ActivationMode.Default; } } /// /// The complete input string (devID_input) /// Assuming internally blended ones only (i.e. no space blends contained) /// Can derive if a device tag is given /// public string DevInput { get { if ( string.IsNullOrEmpty( Input ) ) return Input; // no Input - return empty else if ( string.IsNullOrEmpty( DevID ) ) return Input; // no devID - return input only else return string.Format( "{0}_{1}", DevID, Input ); // fully qualified only if both exist } set { // decompose the deviceInput into parts if ( string.IsNullOrEmpty( value ) ) { // no Input - insert input empty Input = ""; // empty one } else if ( value.IndexOf( "_" ) == 3 ) { // fully qualified only if both exist single digit number DevID = value.Substring( 0, 3 ); Input = value.Substring( 4 ); } else if ( value.IndexOf( "_" ) == 4 ) { // fully qualified only if both exist 2 digit number DevID = value.Substring( 0, 4 ); Input = value.Substring( 5 ); } else { // no device - insert input empty // treat as input only Input = value; } } } /// /// The index of the visible child node (-1 -> shown in ActionNode) /// public int NodeIndex { get; set; } // index of the vis treenode /// /// Clone this object /// /// A deep Clone of this object public object Clone( ) { ActionCommandCls ac = (ActionCommandCls)this.MemberwiseClone(); // more objects to deep copy ac.ActivationMode = ( ActivationMode )this.ActivationMode.Clone( ); return ac; } /// /// Copy return the action while reassigning the JsN Tag /// /// The JsN reassign list /// The action copy with reassigned input public ActionCommandCls ReassignJsN( JsReassingList newJsList ) { ActionCommandCls newAc = (ActionCommandCls)this.Clone(); // reassign the jsX part for Joystick commands if ( this.DevID.StartsWith( "js" ) ) { int oldJsN = JoystickCls.JSNum( this.DevID ); if ( JoystickCls.IsJSValid( oldJsN ) ) { if ( newJsList.ContainsOldJs( oldJsN ) ) newAc.DevID = JoystickCls.ReassignJSTag( this.DevID, newJsList.newJsFromOldJs( oldJsN ) ); } } return newAc; } // ctor public ActionCommandCls( ) { // init with something to debug if needed Input = "UNDEF"; DevID = "NA0"; ActivationMode = new ActivationMode( ActivationMode.Default ); NodeIndex = -1; } // ctor public ActionCommandCls( string devInp ) { DevInput = devInp; ActivationMode = new ActivationMode( ActivationMode.Default ); NodeIndex = -1; } // ctor public ActionCommandCls( string devInp, int nodeIx ) { DevInput = devInp; ActivationMode = new ActivationMode( ActivationMode.Default ); NodeIndex = nodeIx; } // ctor public ActionCommandCls( string dev, string inp ) { Input = inp; DevID = dev; ActivationMode = new ActivationMode( ActivationMode.Default ); NodeIndex = -1; } // ctor public ActionCommandCls( string dev, string inp, int nodeIx ) { Input = inp; DevID = dev; ActivationMode = new ActivationMode( ActivationMode.Default ); NodeIndex = nodeIx; } /// /// Updates an actionCommand with a new input (command) /// /// The input command public void UpdateCommandFromInput( string devInput, Act.ActionDevice actionDevice) // ActionCommandCls actionCmd ) { // Apply the input to the ActionTree this.DevInput = Act.DisableInput( devInput, actionDevice ); if ( Act.IsDisabledInput( this.DevInput ) || string.IsNullOrEmpty( devInput ) ) { this.ActivationMode = new ActivationMode( ActivationMode.Default ); // reset activation mode if the input is empty } } /// /// Strange behavior of SC - needs a proper multitap to accept ActivationModes /// /// /// private string MutitapFudge( ActivationMode actMode ) { if ( actMode.IsDoubleTap ) { return "multiTap = \"2\""; } else { return "multiTap = \"1\""; } } /// /// Dump the action as partial XML nicely formatted /// /// the action as XML fragment public string toXML( ) { string r = ""; if ( !string.IsNullOrEmpty( Input ) ) { // regular - apply XML formatting to internally blended items r += string.Format( "input=\"{0}_{1}\" {2} ", DevID, DeviceCls.toXML( Input ), DeviceCls.toXMLBlendExtension(Input) ); // add multitap override if needed if ( ! ActivationMode.Equals( ActivationMode.Default ) ) { r += string.Format( "ActivationMode=\"{0}\" {1} ", ActivationMode.Name, MutitapFudge(ActivationMode) ); } } r += string.Format( " />\n" ); return r; } } }