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;
}
}
}