/// <summary> /// Adds a blank item after the current point in the time line. /// </summary> /// <param name="timeLineItemViewModel"></param> public void AddTimeLineItem(TimeLineItemViewModel timeLineItemViewModel) { TimeLineItems.Insert(TimeLineItems.IndexOf(SelectedTimeLineItem) + 1, timeLineItemViewModel); SelectedTimeLineItem = timeLineItemViewModel; NotifyOfPropertyChange(() => CanRemoveItem); NotifyOfPropertyChange(() => TimeLineItems); }
/// <summary> /// Opens a new time line from file. /// </summary> /// <param name="filePath"></param> /// <param name="append"></param> public void OpenTimeLine(string filePath, bool append = false) { if (string.IsNullOrWhiteSpace(filePath)) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "SF4 Combo|*.cmb"; openFileDialog.RestoreDirectory = true; openFileDialog.ShowDialog(); if (openFileDialog.FileName == "") { return; } filePath = openFileDialog.FileName; } List <string> lines = File.ReadAllLines(filePath).ToList(); if (!append) { ClearTimeLine(); } if (lines.First().StartsWith("FTComboFile")) { lines.RemoveAt(0); foreach (String line in lines) { TimeLineItemViewModel timeLineItemViewModel = new TimeLineItemViewModel(this); InputItemViewModel inputItem = InputItemViewModel.Deserialize(line); timeLineItemViewModel.PlaySound = inputItem.PlaySound; timeLineItemViewModel.WaitFrames = inputItem.WaitFrames; timeLineItemViewModel.Direction = inputItem.Direction; timeLineItemViewModel.Light_Punch = inputItem.Light_Punch; timeLineItemViewModel.Medium_Punch = inputItem.Medium_Punch; timeLineItemViewModel.Hard_Punch = inputItem.Hard_Punch; timeLineItemViewModel.Light_Kick = inputItem.Light_Kick; timeLineItemViewModel.Medium_Kick = inputItem.Medium_Kick; timeLineItemViewModel.Hard_Kick = inputItem.Hard_Kick; TimeLineItems.Add(timeLineItemViewModel); } } else { OldDeserialize(lines); } }
/// <summary> /// Handles the <see cref="AddTimeLineItemMessage"/> /// </summary> /// <param name="message">The add time line message.</param> public void Handle(AddTimeLineItemMessage message) { TimeLineItemViewModel timeLineItem = message.TimeLineItemViewModel; if (message.Player == 1) { PlayerOneTimeLineViewModel.AddTimeLineItem(timeLineItem); } else { PlayerTwoTimeLineViewModel.AddTimeLineItem(timeLineItem); } }
/// <summary> /// </summary> /// <param name="player"> /// </param> /// <param name="timeLineItem"> /// </param> private void SendPlayerInput(int player, TimeLineItemViewModel timeLineItem) { InputCommandModel icm = timeLineItem.InputItemViewModel.InputItem.InputCommandState; foreach (Input input in icm.ToInputsReleasedArray()) { InputSimulator.SimulateKeyUp(_inputResolver.Get(input, player)); } foreach (Input input in icm.ToInputsPressedArray()) { InputSimulator.SimulateKeyDown(_inputResolver.Get(input, player)); } }
/// <summary> /// Performs all presses and releases for a time line item. /// </summary> /// <param name="timeLineItem"> /// </param> /// <param name="sendInputs"> /// </param> /// <param name="player"> /// </param> private void Action(TimeLineItemViewModel timeLineItem, bool sendInputs, int player = 1) { if (sendInputs) { InputCommandModel icm = timeLineItem.InputItemViewModel.InputItem.InputCommandState; foreach (Input input in icm.ToInputsReleasedArray()) { InputSimulator.SimulateKeyUp(_inputResolver.Get(input, player)); } foreach (Input input in icm.ToInputsPressedArray()) { InputSimulator.SimulateKeyDown(_inputResolver.Get(input, player)); } WaitForFrames(1); } else { // press event waits 1 frame, if send inputs is disabled wait frame is maintained WaitForFrames(1); } if (timeLineItem.InputItemViewModel.PlaySound) { Input[] inputs = timeLineItem.InputItemViewModel.InputItem.Inputs; if (inputs.Intersect(Directions).Count() == 0 && inputs.Intersect(Buttons).Count() == 0) { Roadie.Instance.PlaySound(Roadie.WAIT_SOUND); } else { if (inputs.Intersect(Buttons).Count() > 0) { Roadie.Instance.PlaySound(Roadie.PRESS_BUTTON_SOUND); } if (inputs.Intersect(Directions).Count() > 0) { Roadie.Instance.PlaySound(Roadie.PRESS_DIRECTION_SOUND); } } } // After sound has played we wait the remainder of the frame duration if (timeLineItem.WaitFrames > 1) { WaitForFrames(timeLineItem.WaitFrames - 1); } }
/// <summary> /// Handles the <see cref="AddTimeLineItemMessage"/> /// </summary> /// <param name="message">The add time line message.</param> public void Handle(AddTimeLineItemMessage message) { TimeLineItemViewModel timeLineItem = message.TimeLineItemViewModel; AddTimeLineItem(timeLineItem); }
public void OldDeserialize(List <string> lines) { foreach (String line in lines) { List <Input> inputsOnHold = new List <Input>(); String[] tokens = line.Split('#'); InputItemModel item = new InputItemModel(); int numInputs; Input[] inputs; string inputType = tokens[0].ToString().ToUpper(); switch (inputType) { case "WAIT": // Only hold inputs needed item = new InputItemModel(); item.Inputs = inputsOnHold.ToArray(); break; case "PRESS": // Add hold inputs to given inputs numInputs = int.Parse(tokens[2]); inputs = new Input[numInputs]; for (int i = 0; i < numInputs; i++) { inputs[i] = InputItemModel.ParseInput(tokens[3 + i]); } item = new InputItemModel(); item.Inputs = inputsOnHold.Concat(inputs.ToList()).Distinct().ToArray(); break; case "HOLD": numInputs = int.Parse(tokens[2]); for (int i = 0; i < numInputs; i++) { inputsOnHold.Add(InputItemModel.ParseInput(tokens[3 + i])); } item = new InputItemModel(); item.Inputs = inputsOnHold.Distinct().ToArray(); break; case "RELEASE": // First remove released inputs from on hold list numInputs = int.Parse(tokens[2]); inputs = new Input[numInputs]; for (int i = 0; i < numInputs; i++) { inputsOnHold.RemoveAll((x) => x == InputItemModel.ParseInput(tokens[3 + i])); } // Add remaining holds item = new InputItemModel(); item.Inputs = inputsOnHold.ToArray(); break; default: throw new FormatException("Failed to deserialize TimelineItem, wrong string format: " + line); } item.PlaySound = Boolean.Parse(tokens[1]); item.Frames = int.Parse(tokens[2].ToString()); //Setup TimeLineItemViewModel InputItemViewModel result = new InputItemViewModel(); result.InputItem = item; result.Index = -1; TimeLineItemViewModel timeLineItemViewModel = new TimeLineItemViewModel(this); timeLineItemViewModel.PlaySound = result.PlaySound; timeLineItemViewModel.WaitFrames = result.WaitFrames; timeLineItemViewModel.Direction = result.Direction; timeLineItemViewModel.Light_Punch = result.Light_Punch; timeLineItemViewModel.Medium_Punch = result.Medium_Punch; timeLineItemViewModel.Hard_Punch = result.Hard_Punch; timeLineItemViewModel.Light_Kick = result.Light_Kick; timeLineItemViewModel.Medium_Kick = result.Medium_Kick; timeLineItemViewModel.Hard_Kick = result.Hard_Kick; TimeLineItems.Add(timeLineItemViewModel); } }
/// <summary> /// Adds a time line item to the end of the time line. /// </summary> public void AddTimeLineItem() { TimeLineItemViewModel newTimeLineItemViewModel = new TimeLineItemViewModel(this); AddTimeLineItem(newTimeLineItemViewModel); }
/// <summary> /// Add command to time line. /// </summary> /// <param name="moveViewModel">The move view model containing the moves.</param> public void AddCommandToTimeline(MoveViewModel moveViewModel, int player) { foreach (InputItemViewModel inputItemViewModel in moveViewModel.Command.Commands) { TimeLineItemViewModel timeLineItemViewModel = new TimeLineItemViewModel(); timeLineItemViewModel.InputItemViewModel = inputItemViewModel; _events.Publish(new AddTimeLineItemMessage(timeLineItemViewModel, player)); } }
/// <summary> /// Performs all presses and releases for a time line item. /// </summary> /// <param name="playerOneTimeLine"> /// </param> /// <param name="playerTwoTimeLine"> /// </param> private void TwoPlayerAction(TimeLineViewModel playerOneTimeLine, TimeLineViewModel playerTwoTimeLine) { // These queues will contain the actual time line items and dequeue them as they are consumed by their frame counter Queue <TimeLineItemViewModel> playerOneQueue = new Queue <TimeLineItemViewModel>(); Queue <TimeLineItemViewModel> playerTwoQueue = new Queue <TimeLineItemViewModel>(); playerOneTimeLine.TimeLineItems.Apply(o => playerOneQueue.Enqueue(o)); playerTwoTimeLine.TimeLineItems.Apply(o => playerTwoQueue.Enqueue(o)); // QueueFrames is the overall frames in each time line. int playerOneQueueFrames = playerOneQueue.Sum <TimeLineItemViewModel>(t => t.WaitFrames); int playerTwoQueueFrames = playerTwoQueue.Sum <TimeLineItemViewModel>(t => t.WaitFrames); int longestQueueTime = Math.Max(playerOneQueueFrames, playerTwoQueueFrames); if (playerOneQueueFrames != playerTwoQueueFrames) { if (playerOneQueueFrames > playerTwoQueueFrames) { playerTwoQueue.Enqueue( new TimeLineItemViewModel() { WaitFrames = playerOneQueueFrames - playerTwoQueueFrames }); } else { playerOneQueue.Enqueue( new TimeLineItemViewModel() { WaitFrames = playerTwoQueueFrames - playerOneQueueFrames }); } } // The cache for the player individual time line items. TimeLineItemViewModel playerOneCurrentItem = playerOneQueue.Dequeue(); TimeLineItemViewModel playerTwoCurrentItem = playerTwoQueue.Dequeue(); // Highlight item in time line new Action(() => playerOneTimeLine.SelectedTimeLineItem = playerOneCurrentItem).BeginOnUIThread(); new Action(() => playerTwoTimeLine.SelectedTimeLineItem = playerTwoCurrentItem).BeginOnUIThread(); // This counts down each players frames for individual time line items. int playerOneCountdown = playerOneCurrentItem.WaitFrames; int playerTwoCountdown = playerTwoCurrentItem.WaitFrames; for (int x = 0; x < longestQueueTime; x++) { if (playerOneCountdown == 0) { playerOneCurrentItem = playerOneQueue.Dequeue(); new Action(() => playerOneTimeLine.SelectedTimeLineItem = playerOneCurrentItem).BeginOnUIThread(); playerOneCountdown = playerOneCurrentItem.WaitFrames; } if (playerTwoCountdown == 0) { playerTwoCurrentItem = playerTwoQueue.Dequeue(); new Action(() => playerTwoTimeLine.SelectedTimeLineItem = playerTwoCurrentItem).BeginOnUIThread(); playerTwoCountdown = playerTwoCurrentItem.WaitFrames; } if (playerOneTimeLine.SendInputs) { SendPlayerInput(1, playerOneCurrentItem); } if (playerTwoTimeLine.SendInputs) { SendPlayerInput(2, playerTwoCurrentItem); } if (playerOneCurrentItem.InputItemViewModel.PlaySound && playerOneCurrentItem.WaitFrames == playerOneCountdown) { Input[] inputs = playerOneCurrentItem.InputItemViewModel.InputItem.Inputs; if (!inputs.Intersect(Directions).Any() && !inputs.Intersect(Buttons).Any()) { Roadie.Instance.PlaySound(Roadie.WAIT_SOUND); } else { if (inputs.Intersect(Buttons).Any()) { Roadie.Instance.PlaySound(Roadie.PRESS_BUTTON_SOUND); } if (inputs.Intersect(Directions).Any()) { Roadie.Instance.PlaySound(Roadie.PRESS_DIRECTION_SOUND); } } } playerOneCountdown--; playerTwoCountdown--; WaitForFrames(1); } }
public AddTimeLineItemMessage(TimeLineItemViewModel timeLineItemViewModel) { TimeLineItemViewModel = timeLineItemViewModel; }
public void AddCommandToTimeline(object moveViewModel) { foreach (InputItemViewModel inputItem in Command.Commands) { TimeLineItemViewModel timeLineItemViewModel = new TimeLineItemViewModel(); timeLineItemViewModel.InputItemViewModel = inputItem; _events.Publish(new AddTimeLineItemMessage(timeLineItemViewModel)); } }
public AddTimeLineItemMessage(TimeLineItemViewModel timeLineItemViewModel, int player) { TimeLineItemViewModel = timeLineItemViewModel; Player = player; }