public Agent(string name) { InitializeComponent(); this.characterName = name; this.cachedBitmapImageDictionary = new Dictionary<string, BitmapImage>(); this.cachedMotionList = new List<Motion>(); this.fadeStoryboardDictionary = new Dictionary<Storyboard, Window>(); this.imageStoryboardDictionary = new Dictionary<Image, Storyboard>(); this.queue = new System.Collections.Queue(); this.motionQueue = new Queue<Motion>(); this.ContextMenu = new ContextMenu(); MenuItem opacityMenuItem = new MenuItem(); MenuItem scalingMenuItem = new MenuItem(); MenuItem refreshMenuItem = new MenuItem(); MenuItem topmostMenuItem = new MenuItem(); MenuItem showInTaskbarMenuItem = new MenuItem(); MenuItem muteMenuItem = new MenuItem(); MenuItem charactersMenuItem = new MenuItem(); MenuItem updateMenuItem = new MenuItem(); MenuItem exitMenuItem = new MenuItem(); double opacity = 1; double scale = 2; opacityMenuItem.Header = Properties.Resources.Opacity; do { MenuItem menuItem = new MenuItem(); menuItem.Header = String.Concat(((int)Math.Floor(opacity * 100)).ToString(System.Globalization.CultureInfo.CurrentCulture), Properties.Resources.Percent); menuItem.Tag = opacity; menuItem.Click += new RoutedEventHandler(delegate { foreach (Window window in Application.Current.Windows) { Agent agent = window as Agent; if (agent != null) { agent.opacity = (double)menuItem.Tag; Storyboard storyboard1 = new Storyboard(); DoubleAnimation doubleAnimation1 = new DoubleAnimation(agent.Opacity, agent.opacity, TimeSpan.FromMilliseconds(500)); foreach (KeyValuePair<Storyboard, Window> kvp in agent.fadeStoryboardDictionary) { kvp.Key.Stop(kvp.Value); } agent.fadeStoryboardDictionary.Clear(); if (agent.Opacity < agent.opacity) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseOut; doubleAnimation1.EasingFunction = sineEase; } else if (agent.Opacity > agent.opacity) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseIn; doubleAnimation1.EasingFunction = sineEase; } doubleAnimation1.CurrentStateInvalidated += new EventHandler(delegate (object s, EventArgs e) { if (((Clock)s).CurrentState == ClockState.Filling) { agent.Opacity = agent.opacity; storyboard1.Remove(agent); agent.fadeStoryboardDictionary.Remove(storyboard1); } }); storyboard1.Children.Add(doubleAnimation1); Storyboard.SetTargetProperty(doubleAnimation1, new PropertyPath(Window.OpacityProperty)); agent.fadeStoryboardDictionary.Add(storyboard1, agent); agent.BeginStoryboard(storyboard1, HandoffBehavior.SnapshotAndReplace, true); if (agent.balloon.Opacity != 1) { Storyboard storyboard2 = new Storyboard(); DoubleAnimation doubleAnimation2 = new DoubleAnimation(agent.balloon.Opacity, 1, TimeSpan.FromMilliseconds(500)); SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseOut; doubleAnimation2.EasingFunction = sineEase; doubleAnimation2.CurrentStateInvalidated += new EventHandler(delegate (object s, EventArgs e) { if (((Clock)s).CurrentState == ClockState.Filling) { agent.balloon.Opacity = 1; storyboard2.Remove(agent.balloon); agent.fadeStoryboardDictionary.Remove(storyboard2); } }); storyboard2.Children.Add(doubleAnimation2); Storyboard.SetTargetProperty(doubleAnimation2, new PropertyPath(Window.OpacityProperty)); agent.fadeStoryboardDictionary.Add(storyboard2, agent.balloon); agent.balloon.BeginStoryboard(storyboard2, HandoffBehavior.SnapshotAndReplace, true); } } } }); opacityMenuItem.Items.Add(menuItem); opacity -= 0.1; } while (Math.Floor(opacity * 100) > 0); scalingMenuItem.Header = Properties.Resources.Scaling; do { MenuItem menuItem = new MenuItem(); menuItem.Header = String.Concat(((int)Math.Floor(scale * 100)).ToString(System.Globalization.CultureInfo.CurrentCulture), Properties.Resources.Percent); menuItem.Tag = scale; menuItem.Click += new RoutedEventHandler(delegate { foreach (Window window in Application.Current.Windows) { Agent agent = window as Agent; if (agent != null) { agent.scale = (double)menuItem.Tag; foreach (Character character in from character in Script.Instance.Characters where character.Name.Equals(agent.characterName) select character) { Storyboard storyboard = new Storyboard(); DoubleAnimation doubleAnimation1 = new DoubleAnimation(agent.ZoomScaleTransform.ScaleX, agent.scale, TimeSpan.FromMilliseconds(500)); DoubleAnimation doubleAnimation2 = new DoubleAnimation(agent.ZoomScaleTransform.ScaleY, agent.scale, TimeSpan.FromMilliseconds(500)); DoubleAnimation doubleAnimation3 = new DoubleAnimation(agent.LayoutRoot.Width, character.Size.Width * agent.scale, TimeSpan.FromMilliseconds(500)); DoubleAnimation doubleAnimation4 = new DoubleAnimation(agent.LayoutRoot.Height, character.Size.Height * agent.scale, TimeSpan.FromMilliseconds(500)); if (agent.scaleStoryboard != null) { agent.scaleStoryboard.Stop(agent.LayoutRoot); } if (agent.ZoomScaleTransform.ScaleX < agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseOut; doubleAnimation1.EasingFunction = sineEase; } else if (agent.ZoomScaleTransform.ScaleX > agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseIn; doubleAnimation1.EasingFunction = sineEase; } if (agent.ZoomScaleTransform.ScaleY < agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseOut; doubleAnimation2.EasingFunction = sineEase; } else if (agent.ZoomScaleTransform.ScaleY > agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseIn; doubleAnimation2.EasingFunction = sineEase; } if (agent.LayoutRoot.Width < character.Size.Width * agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseOut; doubleAnimation3.EasingFunction = sineEase; } else if (agent.LayoutRoot.Width > character.Size.Width * agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseIn; doubleAnimation3.EasingFunction = sineEase; } if (agent.LayoutRoot.Height < character.Size.Height * agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseOut; doubleAnimation4.EasingFunction = sineEase; } else if (agent.LayoutRoot.Height > character.Size.Height * agent.scale) { SineEase sineEase = new SineEase(); sineEase.EasingMode = EasingMode.EaseIn; doubleAnimation4.EasingFunction = sineEase; } storyboard.CurrentStateInvalidated += new EventHandler(delegate (object s, EventArgs e) { if (((Clock)s).CurrentState == ClockState.Filling) { agent.ZoomScaleTransform.ScaleX = agent.scale; agent.ZoomScaleTransform.ScaleY = agent.scale; foreach (Character c in from c in Script.Instance.Characters where c.Name.Equals(agent.characterName) select c) { agent.LayoutRoot.Width = c.Size.Width * agent.scale; agent.LayoutRoot.Height = c.Size.Height * agent.scale; } storyboard.Remove(agent.LayoutRoot); agent.scaleStoryboard = null; } }); storyboard.Children.Add(doubleAnimation1); storyboard.Children.Add(doubleAnimation2); storyboard.Children.Add(doubleAnimation3); storyboard.Children.Add(doubleAnimation4); Storyboard.SetTargetProperty(doubleAnimation1, new PropertyPath("(0).(1).(2)", ContentControl.ContentProperty, Canvas.RenderTransformProperty, ScaleTransform.ScaleXProperty)); Storyboard.SetTargetProperty(doubleAnimation2, new PropertyPath("(0).(1).(2)", ContentControl.ContentProperty, Canvas.RenderTransformProperty, ScaleTransform.ScaleYProperty)); Storyboard.SetTargetProperty(doubleAnimation3, new PropertyPath(ContentControl.WidthProperty)); Storyboard.SetTargetProperty(doubleAnimation4, new PropertyPath(ContentControl.HeightProperty)); agent.scaleStoryboard = storyboard; agent.LayoutRoot.BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, true); } } } }); scalingMenuItem.Items.Add(menuItem); scale -= 0.25; } while (Math.Floor(scale * 100) > 0); refreshMenuItem.Header = Properties.Resources.Refresh; refreshMenuItem.Click += new RoutedEventHandler(delegate { foreach (Window window in Application.Current.Windows) { Agent agent = window as Agent; if (agent != null) { agent.Render(); } } }); topmostMenuItem.Header = Properties.Resources.Topmost; topmostMenuItem.IsCheckable = true; topmostMenuItem.Click += new RoutedEventHandler(delegate { foreach (Window window in Application.Current.Windows) { if (window is Agent && window == Application.Current.MainWindow) { window.Topmost = topmostMenuItem.IsChecked; } } }); showInTaskbarMenuItem.Header = Properties.Resources.ShowInTaskbar; showInTaskbarMenuItem.IsCheckable = true; showInTaskbarMenuItem.Click += new RoutedEventHandler(delegate { foreach (Window window in Application.Current.Windows) { if (window is Agent) { window.ShowInTaskbar = showInTaskbarMenuItem.IsChecked; } } }); muteMenuItem.Header = Properties.Resources.Mute; muteMenuItem.IsCheckable = true; muteMenuItem.Click += new RoutedEventHandler(delegate { foreach (Window window in Application.Current.Windows) { Agent agent = window as Agent; if (agent != null) { agent.isMute = muteMenuItem.IsChecked; } } }); charactersMenuItem.Header = Properties.Resources.Characters; updateMenuItem.Header = Properties.Resources.Update; updateMenuItem.Click += new RoutedEventHandler(delegate { Script.Instance.Update(true); }); exitMenuItem.Header = Properties.Resources.Exit; exitMenuItem.Click += new RoutedEventHandler(delegate { if (Script.Instance.Enabled) { Script.Instance.Enabled = false; } }); this.ContextMenu.Items.Add(opacityMenuItem); this.ContextMenu.Items.Add(scalingMenuItem); this.ContextMenu.Items.Add(refreshMenuItem); this.ContextMenu.Items.Add(new Separator()); this.ContextMenu.Items.Add(topmostMenuItem); this.ContextMenu.Items.Add(showInTaskbarMenuItem); this.ContextMenu.Items.Add(new Separator()); this.ContextMenu.Items.Add(muteMenuItem); this.ContextMenu.Items.Add(new Separator()); this.ContextMenu.Items.Add(charactersMenuItem); this.ContextMenu.Items.Add(new Separator()); this.ContextMenu.Items.Add(updateMenuItem); this.ContextMenu.Items.Add(new Separator()); this.ContextMenu.Items.Add(exitMenuItem); this.ContextMenu.Opened += new RoutedEventHandler(delegate { Agent agent = Application.Current.MainWindow as Agent; if (agent != null) { foreach (MenuItem menuItem in opacityMenuItem.Items) { menuItem.IsChecked = Math.Floor((double)menuItem.Tag * 100) == Math.Floor(agent.Opacity * 100); } foreach (MenuItem menuItem in scalingMenuItem.Items) { menuItem.IsChecked = Math.Floor((double)menuItem.Tag * 100) == Math.Floor(agent.ZoomScaleTransform.ScaleX * 100) && Math.Floor((double)menuItem.Tag * 100) == Math.Floor(agent.ZoomScaleTransform.ScaleY * 100); } topmostMenuItem.IsChecked = agent.Topmost; showInTaskbarMenuItem.IsChecked = agent.ShowInTaskbar; muteMenuItem.IsChecked = agent.isMute; List<MenuItem> menuItemList = new List<MenuItem>(charactersMenuItem.Items.Cast<MenuItem>()); HashSet<string> pathHashSet = new HashSet<string>(); LinkedList<KeyValuePair<Character, string>> characterLinkedList = new LinkedList<KeyValuePair<Character, string>>(); foreach (Character character in Script.Instance.Characters) { string path = Path.IsPathRooted(character.Script) ? character.Script : Path.GetFullPath(character.Script); if (!pathHashSet.Contains(path)) { pathHashSet.Add(path); } characterLinkedList.AddLast(new KeyValuePair<Character, string>(character, path)); } List<KeyValuePair<string, string>> keyValuePairList = (from fileName in Directory.EnumerateFiles(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "*", SearchOption.AllDirectories) let extension = Path.GetExtension(fileName) let isZip = extension.Equals(".zip", StringComparison.OrdinalIgnoreCase) where isZip || extension.Equals(".xml", StringComparison.OrdinalIgnoreCase) select new KeyValuePair<bool, string>(isZip, fileName)).Concat(from path in pathHashSet select new KeyValuePair<bool, string>(Path.GetExtension(path).Equals(".zip", StringComparison.OrdinalIgnoreCase), path)).Aggregate<KeyValuePair<bool, string>, List<KeyValuePair<string, string>>>(new List<KeyValuePair<string, string>>(), (list, kvp1) => { if (!list.Exists(delegate (KeyValuePair<string, string> kvp2) { return kvp2.Value.Equals(kvp1.Value); })) { if (kvp1.Key) { FileStream fs = null; try { fs = new FileStream(kvp1.Value, FileMode.Open, FileAccess.Read, FileShare.Read); using (ZipArchive zipArchive = new ZipArchive(fs)) { fs = null; foreach (ZipArchiveEntry zipArchiveEntry in from zipArchiveEntry in zipArchive.Entries where zipArchiveEntry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase) select zipArchiveEntry) { Stream stream = null; try { stream = zipArchiveEntry.Open(); foreach (string attribute in from attribute in ((System.Collections.IEnumerable)XDocument.Load(stream).XPathEvaluate("/script/character/@name")).Cast<XAttribute>() select attribute.Value) { list.Add(new KeyValuePair<string, string>(attribute, kvp1.Value)); } } catch { return list; } finally { if (stream != null) { stream.Close(); } } } } } finally { if (fs != null) { fs.Close(); } } } else { FileStream fs = null; try { fs = new FileStream(kvp1.Value, FileMode.Open, FileAccess.Read, FileShare.Read); foreach (string attribute in from attribute in ((System.Collections.IEnumerable)XDocument.Load(fs).XPathEvaluate("/script/character/@name")).Cast<XAttribute>() select attribute.Value) { list.Add(new KeyValuePair<string, string>(attribute, kvp1.Value)); } } catch { return list; } finally { if (fs != null) { fs.Close(); } } } } return list; }); charactersMenuItem.Items.Clear(); keyValuePairList.Sort(delegate (KeyValuePair<string, string> kvp1, KeyValuePair<string, string> kvp2) { return String.Compare(kvp1.Key, kvp2.Key, StringComparison.CurrentCulture); }); keyValuePairList.ForEach(delegate (KeyValuePair<string, string> kvp) { for (LinkedListNode<KeyValuePair<Character, string>> nextLinkedListNode = characterLinkedList.First; nextLinkedListNode != null; nextLinkedListNode = nextLinkedListNode.Next) { if (nextLinkedListNode.Value.Key.Name.Equals(kvp.Key) && nextLinkedListNode.Value.Value.Equals(kvp.Value)) { MenuItem selectedMenuItem = menuItemList.Find(delegate (MenuItem menuItem) { return kvp.Key.Equals(menuItem.Header as string) && kvp.Value.Equals(menuItem.Tag as string) && (menuItem.IsChecked || menuItem.HasItems); }); if (selectedMenuItem == null) { selectedMenuItem = new MenuItem(); selectedMenuItem.Header = kvp.Key; selectedMenuItem.Tag = kvp.Value; } else { selectedMenuItem.Items.Clear(); menuItemList.Remove(selectedMenuItem); } charactersMenuItem.Items.Add(selectedMenuItem); List<MenuItem> childMenuItemList = new List<MenuItem>(); Dictionary<string, SortedSet<int>> dictionary = new Dictionary<string, SortedSet<int>>(); List<string> motionTypeList = new List<string>(); this.cachedMotionList.ForEach(delegate (Motion motion) { if (motion.Type != null) { SortedSet<int> sortedSet; if (dictionary.TryGetValue(motion.Type, out sortedSet)) { if (!sortedSet.Contains(motion.ZIndex)) { sortedSet.Add(motion.ZIndex); } } else { sortedSet = new SortedSet<int>(); sortedSet.Add(motion.ZIndex); dictionary.Add(motion.Type, sortedSet); motionTypeList.Add(motion.Type); } } }); motionTypeList.Sort(delegate (string s1, string s2) { return String.Compare(s1, s2, StringComparison.CurrentCulture); }); motionTypeList.ForEach(delegate (string type) { foreach (MenuItem menuItem in selectedMenuItem.Items) { if (type.Equals(menuItem.Header as string)) { if (nextLinkedListNode.Value.Key.HasTypes) { menuItem.IsChecked = nextLinkedListNode.Value.Key.Types.Contains(menuItem.Header as string); } else { menuItem.IsChecked = false; } childMenuItemList.Add(menuItem); return; } } MenuItem childMenuItem = new MenuItem(); childMenuItem.Header = type; childMenuItem.Tag = nextLinkedListNode.Value.Key.Name; childMenuItem.Click += new RoutedEventHandler(delegate { string tag = childMenuItem.Tag as string; if (tag != null) { foreach (Character c in from c in Script.Instance.Characters where c.Name.Equals(tag) select c) { foreach (Window window in Application.Current.Windows) { Agent a = window as Agent; if (a != null && c.Name.Equals(a.characterName)) { string header = childMenuItem.Header as string; a.Render(); if (c.Types.Contains(header)) { c.Types.Remove(header); } else if (header != null) { SortedSet<int> sortedSet1; if (dictionary.TryGetValue(header, out sortedSet1)) { foreach (string s in c.Types.ToArray()) { SortedSet<int> sortedSet2; if (dictionary.TryGetValue(s, out sortedSet2) && sortedSet1.SequenceEqual(sortedSet2)) { c.Types.Remove(s); } } } c.Types.Add(header); } foreach (Image image in a.Canvas.Children.Cast<Image>()) { Image i = image; Motion motion = i.Tag as Motion; if (motion != null) { List<string> typeList = null; bool isVisible; if (motion.Type == null) { typeList = new List<string>(); a.cachedMotionList.ForEach(delegate (Motion m) { if (m.ZIndex == motion.ZIndex) { typeList.Add(m.Type); } }); } if (typeList == null) { if (c.HasTypes) { typeList = new List<string>(); a.cachedMotionList.ForEach(delegate (Motion m) { if (m.ZIndex == motion.ZIndex && c.Types.Contains(m.Type)) { typeList.Add(m.Type); } }); isVisible = typeList.Count > 0 && typeList.LastIndexOf(motion.Type) == typeList.Count - 1; } else { isVisible = false; } } else if (c.HasTypes) { isVisible = !typeList.Exists(delegate (string t) { return c.Types.Contains(t); }); } else { isVisible = true; } if (isVisible && (i.Visibility != Visibility.Visible || i.OpacityMask != null)) { LinearGradientBrush linearGradientBrush = i.OpacityMask as LinearGradientBrush; if (linearGradientBrush == null) { GradientStopCollection gradientStopCollection = new GradientStopCollection(); gradientStopCollection.Add(new GradientStop(Color.FromArgb(0, 0, 0, 0), 0)); gradientStopCollection.Add(new GradientStop(Color.FromArgb(0, 0, 0, 0), 1)); i.OpacityMask = linearGradientBrush = new LinearGradientBrush(gradientStopCollection, new Point(0.5, 0), new Point(0.5, 1)); } Storyboard storyboard; ColorAnimation colorAnimation1 = new ColorAnimation(linearGradientBrush.GradientStops[0].Color, Color.FromArgb(Byte.MaxValue, 0, 0, 0), TimeSpan.FromMilliseconds(250)); ColorAnimation colorAnimation2 = new ColorAnimation(linearGradientBrush.GradientStops[1].Color, Color.FromArgb(Byte.MaxValue, 0, 0, 0), TimeSpan.FromMilliseconds(250)); SineEase sineEase1 = new SineEase(); SineEase sineEase2 = new SineEase(); if (a.imageStoryboardDictionary.TryGetValue(i, out storyboard)) { storyboard.Stop(i); a.imageStoryboardDictionary[i] = storyboard = new Storyboard(); } else { storyboard = new Storyboard(); a.imageStoryboardDictionary.Add(i, storyboard); } sineEase1.EasingMode = sineEase2.EasingMode = EasingMode.EaseInOut; colorAnimation1.EasingFunction = sineEase1; colorAnimation2.BeginTime = TimeSpan.FromMilliseconds(250); colorAnimation2.EasingFunction = sineEase2; storyboard.CurrentStateInvalidated += new EventHandler(delegate (object s, EventArgs e) { if (((Clock)s).CurrentState == ClockState.Filling) { i.OpacityMask = null; a.Render(); storyboard.Remove(i); a.imageStoryboardDictionary.Remove(i); } }); storyboard.Children.Add(colorAnimation1); storyboard.Children.Add(colorAnimation2); Storyboard.SetTargetProperty(colorAnimation1, new PropertyPath("(0).(1)[0].(2)", Image.OpacityMaskProperty, LinearGradientBrush.GradientStopsProperty, GradientStop.ColorProperty)); Storyboard.SetTargetProperty(colorAnimation2, new PropertyPath("(0).(1)[1].(2)", Image.OpacityMaskProperty, LinearGradientBrush.GradientStopsProperty, GradientStop.ColorProperty)); i.Visibility = Visibility.Visible; i.BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, true); } else if (!isVisible && (i.Visibility == Visibility.Visible || i.OpacityMask != null)) { LinearGradientBrush linearGradientBrush = i.OpacityMask as LinearGradientBrush; if (linearGradientBrush == null) { GradientStopCollection gradientStopCollection = new GradientStopCollection(); gradientStopCollection.Add(new GradientStop(Color.FromArgb(Byte.MaxValue, 0, 0, 0), 0)); gradientStopCollection.Add(new GradientStop(Color.FromArgb(Byte.MaxValue, 0, 0, 0), 1)); i.OpacityMask = linearGradientBrush = new LinearGradientBrush(gradientStopCollection, new Point(0.5, 0), new Point(0.5, 1)); } Storyboard storyboard; ColorAnimation colorAnimation1 = new ColorAnimation(linearGradientBrush.GradientStops[0].Color, Color.FromArgb(0, 0, 0, 0), TimeSpan.FromMilliseconds(250)); ColorAnimation colorAnimation2 = new ColorAnimation(linearGradientBrush.GradientStops[1].Color, Color.FromArgb(0, 0, 0, 0), TimeSpan.FromMilliseconds(250)); SineEase sineEase1 = new SineEase(); SineEase sineEase2 = new SineEase(); if (a.imageStoryboardDictionary.TryGetValue(i, out storyboard)) { storyboard.Stop(i); a.imageStoryboardDictionary[i] = storyboard = new Storyboard(); } else { storyboard = new Storyboard(); a.imageStoryboardDictionary.Add(i, storyboard); } sineEase1.EasingMode = sineEase2.EasingMode = EasingMode.EaseInOut; colorAnimation1.EasingFunction = sineEase1; colorAnimation2.BeginTime = TimeSpan.FromMilliseconds(250); colorAnimation2.EasingFunction = sineEase2; storyboard.CurrentStateInvalidated += new EventHandler(delegate (object s, EventArgs e) { if (((Clock)s).CurrentState == ClockState.Filling) { i.OpacityMask = null; a.Render(); storyboard.Remove(i); a.imageStoryboardDictionary.Remove(i); } }); storyboard.Children.Add(colorAnimation1); storyboard.Children.Add(colorAnimation2); Storyboard.SetTargetProperty(colorAnimation1, new PropertyPath("(0).(1)[0].(2)", Image.OpacityMaskProperty, LinearGradientBrush.GradientStopsProperty, GradientStop.ColorProperty)); Storyboard.SetTargetProperty(colorAnimation2, new PropertyPath("(0).(1)[1].(2)", Image.OpacityMaskProperty, LinearGradientBrush.GradientStopsProperty, GradientStop.ColorProperty)); i.BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, true); } } } } } } } }); if (nextLinkedListNode.Value.Key.HasTypes) { childMenuItem.IsChecked = nextLinkedListNode.Value.Key.Types.Contains(childMenuItem.Header as string); } else { childMenuItem.IsChecked = false; } childMenuItemList.Add(childMenuItem); }); selectedMenuItem.Items.Clear(); if (childMenuItemList.Count > 0) { selectedMenuItem.IsChecked = false; childMenuItemList.ForEach(delegate (MenuItem mi) { selectedMenuItem.Items.Add(mi); }); } else { selectedMenuItem.IsChecked = true; } characterLinkedList.Remove(nextLinkedListNode); return; } } MenuItem unselectedMenuItem = menuItemList.Find(delegate (MenuItem menuItem) { return kvp.Key.Equals(menuItem.Header as string) && kvp.Value.Equals(menuItem.Tag as string) && !menuItem.IsChecked && !menuItem.HasItems; }); if (unselectedMenuItem == null) { unselectedMenuItem = new MenuItem(); unselectedMenuItem.Header = kvp.Key; unselectedMenuItem.Tag = kvp.Value; unselectedMenuItem.Click += new RoutedEventHandler(delegate { string tag = unselectedMenuItem.Tag as string; if (tag != null) { List<Character> characterList = new List<Character>(); if (Path.GetExtension(tag).Equals(".zip", StringComparison.OrdinalIgnoreCase)) { FileStream fs = null; try { fs = new FileStream(tag, FileMode.Open, FileAccess.Read, FileShare.Read); using (ZipArchive zipArchive = new ZipArchive(fs)) { fs = null; StringBuilder stringBuilder = new StringBuilder(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); if (Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).LastIndexOf(Path.DirectorySeparatorChar) != Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).Length - 1) { stringBuilder.Append(Path.DirectorySeparatorChar); } string path = tag.StartsWith(stringBuilder.ToString(), StringComparison.Ordinal) ? tag.Remove(0, stringBuilder.Length) : tag; foreach (ZipArchiveEntry zipArchiveEntry in from zipArchiveEntry in zipArchive.Entries where zipArchiveEntry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase) select zipArchiveEntry) { Stream stream = null; try { stream = zipArchiveEntry.Open(); foreach (string a in from a in ((System.Collections.IEnumerable)XDocument.Load(stream).XPathEvaluate("/script/character/@name")).Cast<XAttribute>() select a.Value) { Character character = new Character(); character.Name = a; character.Script = path; characterList.Add(character); } } catch { return; } finally { if (stream != null) { stream.Close(); } } } } } finally { if (fs != null) { fs.Close(); } } } else { FileStream fs = null; try { fs = new FileStream(tag, FileMode.Open, FileAccess.Read, FileShare.Read); StringBuilder stringBuilder = new StringBuilder(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); if (Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).LastIndexOf(Path.DirectorySeparatorChar) != Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).Length - 1) { stringBuilder.Append(Path.DirectorySeparatorChar); } string path = tag.StartsWith(stringBuilder.ToString(), StringComparison.Ordinal) ? tag.Remove(0, stringBuilder.Length) : tag; foreach (string a in from a in ((System.Collections.IEnumerable)XDocument.Load(fs).XPathEvaluate("/script/character/@name")).Cast<XAttribute>() select a.Value) { Character character = new Character(); character.Name = a; character.Script = path; characterList.Add(character); } } catch { return; } finally { if (fs != null) { fs.Close(); } } } if (characterList.Count > 0) { Switch(characterList); } } }); } else { menuItemList.Remove(unselectedMenuItem); } charactersMenuItem.Items.Add(unselectedMenuItem); }); } }); if (this == Application.Current.MainWindow) { System.Configuration.Configuration config = null; string directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name); if (Directory.Exists(directory)) { string fileName = Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location); foreach (string s in from s in Directory.EnumerateFiles(directory, "*.config") where fileName.Equals(Path.GetFileNameWithoutExtension(s)) select s) { System.Configuration.ExeConfigurationFileMap exeConfigurationFileMap = new System.Configuration.ExeConfigurationFileMap(); exeConfigurationFileMap.ExeConfigFilename = s; config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(exeConfigurationFileMap, System.Configuration.ConfigurationUserLevel.None); } } if (config == null) { config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None); } if (config.AppSettings.Settings["Left"] != null && config.AppSettings.Settings["Top"] != null) { if (config.AppSettings.Settings["Left"].Value.Length > 0 && config.AppSettings.Settings["Top"].Value.Length > 0) { this.Left = Double.Parse(config.AppSettings.Settings["Left"].Value, System.Globalization.CultureInfo.InvariantCulture); this.Top = Double.Parse(config.AppSettings.Settings["Top"].Value, System.Globalization.CultureInfo.InvariantCulture); } } if (config.AppSettings.Settings["Opacity"] != null) { if (config.AppSettings.Settings["Opacity"].Value.Length > 0) { this.opacity = Double.Parse(config.AppSettings.Settings["Opacity"].Value, System.Globalization.CultureInfo.InvariantCulture); } } if (config.AppSettings.Settings["Scale"] != null) { if (config.AppSettings.Settings["Scale"].Value.Length > 0) { this.scale = this.ZoomScaleTransform.ScaleX = this.ZoomScaleTransform.ScaleY = Double.Parse(config.AppSettings.Settings["Scale"].Value, System.Globalization.CultureInfo.InvariantCulture); } } if (config.AppSettings.Settings["Topmost"] != null) { if (config.AppSettings.Settings["Topmost"].Value.Length > 0) { this.Topmost = Boolean.Parse(config.AppSettings.Settings["Topmost"].Value); } } if (config.AppSettings.Settings["ShowInTaskbar"] != null) { if (config.AppSettings.Settings["ShowInTaskbar"].Value.Length > 0) { this.ShowInTaskbar = Boolean.Parse(config.AppSettings.Settings["ShowInTaskbar"].Value); } } if (config.AppSettings.Settings["DropShadow"] != null) { if (config.AppSettings.Settings["DropShadow"].Value.Length > 0) { if (Boolean.Parse(config.AppSettings.Settings["DropShadow"].Value)) { DropShadowEffect dropShadowEffect = new DropShadowEffect(); dropShadowEffect.Color = Colors.Black; dropShadowEffect.BlurRadius = 10; dropShadowEffect.Direction = 270; dropShadowEffect.ShadowDepth = 0; dropShadowEffect.Opacity = 0.5; if (dropShadowEffect.CanFreeze) { dropShadowEffect.Freeze(); } this.Canvas.Effect = dropShadowEffect; } } } if (config.AppSettings.Settings["Mute"] != null) { if (config.AppSettings.Settings["Mute"].Value.Length > 0) { this.isMute = Boolean.Parse(config.AppSettings.Settings["Mute"].Value); } } if (config.AppSettings.Settings["FrameRate"] != null) { if (config.AppSettings.Settings["FrameRate"].Value.Length > 0) { this.frameRate = Double.Parse(config.AppSettings.Settings["FrameRate"].Value, System.Globalization.CultureInfo.InvariantCulture); } } } else { Agent agent = Application.Current.MainWindow as Agent; if (agent != null) { this.opacity = agent.opacity; this.scale = this.ZoomScaleTransform.ScaleX = this.ZoomScaleTransform.ScaleY = agent.scale; this.Topmost = agent.Topmost; this.ShowInTaskbar = agent.ShowInTaskbar; if (agent.Canvas.Effect != null) { DropShadowEffect dropShadowEffect = new DropShadowEffect(); dropShadowEffect.Color = Colors.Black; dropShadowEffect.BlurRadius = 10; dropShadowEffect.Direction = 270; dropShadowEffect.ShadowDepth = 0; dropShadowEffect.Opacity = 0.5; if (dropShadowEffect.CanFreeze) { dropShadowEffect.Freeze(); } this.Canvas.Effect = dropShadowEffect; } this.isMute = agent.isMute; this.frameRate = agent.frameRate; } } this.balloon = new Balloon(); this.balloon.Title = this.Title; this.balloon.SizeChanged += new SizeChangedEventHandler(delegate (object s, SizeChangedEventArgs e) { foreach (Character character in from character in Script.Instance.Characters where character.Name.Equals(this.characterName) select character) { this.balloon.Left = this.Left + (this.Width - e.NewSize.Width) / 2; this.balloon.Top = this.Top - e.NewSize.Height + character.Origin.Y * this.ZoomScaleTransform.ScaleY; } }); this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate { Run(); return null; }), null); Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(this.OnPowerModeChanged); }