// (c) Copyright HutongGames, LLC 2010-2014. All rights reserved. using UnityEngine; using System.Collections.Generic; namespace HutongGames.PlayMaker.Actions { [NoActionTargets] [ActionCategory(ActionCategory.Array)] [Tooltip("Transfer a value from one array to another, basically a copy/cut paste action on steroids.")] public class ArrayTransferValue : FsmStateAction { public enum ArrayTransferType {Copy,Cut,nullify}; public enum ArrayPasteType {AsFirstItem,AsLastItem,InsertAtSameIndex,ReplaceAtSameIndex}; [RequiredField] [UIHint(UIHint.Variable)] [Tooltip("The Array Variable source.")] public FsmArray arraySource; [RequiredField] [UIHint(UIHint.Variable)] [Tooltip("The Array Variable target.")] public FsmArray arrayTarget; [MatchFieldType("array")] [Tooltip("The index to transfer.")] public FsmInt indexToTransfer; [ActionSection("Transfer Options")] [ObjectType(typeof(ArrayTransferType))] public FsmEnum copyType; [ObjectType(typeof(ArrayPasteType))] public FsmEnum pasteType; [ActionSection("Result")] [Tooltip("Event sent if this array source does not contains that element (described below)")] public FsmEvent indexOutOfRange; public override void Reset () { arraySource = null; arrayTarget = null; indexToTransfer = null; copyType = ArrayTransferType.Copy; pasteType = ArrayPasteType.AsLastItem; } // Code that runs on entering the state. public override void OnEnter () { DoTransferValue (); Finish (); } private void DoTransferValue () { if (arraySource.IsNone || arrayTarget.IsNone) { return; } int _index = indexToTransfer.Value; if (_index< 0 || _index>=arraySource.Length) { Fsm.Event(indexOutOfRange); return; } var _value = arraySource.Values[_index]; if ((ArrayTransferType)copyType.Value == ArrayTransferType.Cut) { List _list = new List(arraySource.Values); _list.RemoveAt(_index); arraySource.Values = _list.ToArray(); }else if ((ArrayTransferType)copyType.Value == ArrayTransferType.nullify) { arraySource.Values.SetValue(null,_index); } if ( (ArrayPasteType)pasteType.Value == ArrayPasteType.AsFirstItem) { List _listTarget = new List(arrayTarget.Values); _listTarget.Insert(0,_value); arrayTarget.Values = _listTarget.ToArray(); }else if( (ArrayPasteType)pasteType.Value == ArrayPasteType.AsLastItem) { arrayTarget.Resize(arrayTarget.Length + 1); arrayTarget.Set(arrayTarget.Length - 1, _value); }else if( (ArrayPasteType)pasteType.Value == ArrayPasteType.InsertAtSameIndex) { if (_index>=arrayTarget.Length) { Fsm.Event(indexOutOfRange); } List _listTarget = new List(arrayTarget.Values); _listTarget.Insert(_index,_value); arrayTarget.Values = _listTarget.ToArray(); }else if( (ArrayPasteType)pasteType.Value == ArrayPasteType.ReplaceAtSameIndex) { if (_index>=arrayTarget.Length) { Fsm.Event(indexOutOfRange); }else{ arrayTarget.Set(_index, _value); } } } } }