├── App.ico
├── BabySmash_TemporaryKey.pfx
├── Resources
├── Sounds
│ ├── falling.wav
│ ├── giggle.wav
│ ├── rising.wav
│ ├── scooby2.wav
│ ├── babygigl2.wav
│ ├── babylaugh.wav
│ ├── ccgiggle.wav
│ ├── laughingmice.wav
│ ├── smallbumblebee.wav
│ └── EditedJackPlaysBabySmash.wav
└── Strings
│ ├── en-EN.json
│ └── ru-RU.json
├── packages.config
├── Shapes
├── Figure.cs
├── BabySmashShape.cs
├── FunCursor1.xaml.cs
├── FunCursor2.xaml.cs
├── CoolOval.xaml.cs
├── CoolStar.xaml.cs
├── CoolHeart.xaml.cs
├── CoolCircle.xaml.cs
├── CoolSquare.xaml.cs
├── CoolHexagon.xaml.cs
├── CoolTriangle.xaml.cs
├── CoolRectangle.xaml.cs
├── CoolTrapezoid.xaml.cs
├── CoolLetter.xaml
├── FunCursor1.xaml
├── CoolLetter.xaml.cs
├── FunCursor2.xaml
├── CoolRectangle.xaml
├── CoolSquare.xaml
├── CoolStar.xaml
├── CoolTrapezoid.xaml
├── CoolHexagon.xaml
├── CoolTriangle.xaml
├── CoolCircle.xaml
├── CoolHeart.xaml
├── CoolOval.xaml
├── FigureGenerator.cs
├── Animation.cs
└── allShapes.xaml
├── App.xaml
├── Settings.cs
├── BabySmash.sln
├── LICENSE
├── Properties
├── AssemblyInfo.cs
├── Settings.settings
├── Resources.Designer.cs
├── Resources.resx
└── Settings.Designer.cs
├── KeyboardHook.cs
├── Options.xaml.cs
├── README.md
├── Audio.cs
├── app.config
├── .gitignore
├── Extensions
└── ObjectExtensions.cs
├── MainWindow.xaml.cs
├── Utils.cs
├── Tweening
├── TransitionType.cs
└── Tween.cs
├── App.xaml.cs
├── MainWindow.xaml
├── BuildProcessTemplates
└── UpgradeTemplate.xaml
├── WordFinder.cs
├── BabySmash.csproj
└── Words.txt
/App.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/App.ico
--------------------------------------------------------------------------------
/BabySmash_TemporaryKey.pfx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/BabySmash_TemporaryKey.pfx
--------------------------------------------------------------------------------
/Resources/Sounds/falling.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/falling.wav
--------------------------------------------------------------------------------
/Resources/Sounds/giggle.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/giggle.wav
--------------------------------------------------------------------------------
/Resources/Sounds/rising.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/rising.wav
--------------------------------------------------------------------------------
/Resources/Sounds/scooby2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/scooby2.wav
--------------------------------------------------------------------------------
/Resources/Sounds/babygigl2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/babygigl2.wav
--------------------------------------------------------------------------------
/Resources/Sounds/babylaugh.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/babylaugh.wav
--------------------------------------------------------------------------------
/Resources/Sounds/ccgiggle.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/ccgiggle.wav
--------------------------------------------------------------------------------
/Resources/Sounds/laughingmice.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/laughingmice.wav
--------------------------------------------------------------------------------
/Resources/Sounds/smallbumblebee.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/smallbumblebee.wav
--------------------------------------------------------------------------------
/Resources/Sounds/EditedJackPlaysBabySmash.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanselman/babysmash/main/Resources/Sounds/EditedJackPlaysBabySmash.wav
--------------------------------------------------------------------------------
/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Shapes/Figure.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 |
3 | namespace BabySmash
4 | {
5 | public interface IHasFace
6 | {
7 | Visibility FaceVisible { get; set; }
8 | }
9 | }
--------------------------------------------------------------------------------
/Shapes/BabySmashShape.cs:
--------------------------------------------------------------------------------
1 | namespace BabySmash.Shapes
2 | {
3 | public enum BabySmashShape
4 | {
5 | Circle,
6 | Oval,
7 | Rectangle,
8 | Hexagon,
9 | Trapezoid,
10 | Star,
11 | Square,
12 | Triangle,
13 | Heart
14 | }
15 | }
--------------------------------------------------------------------------------
/Shapes/FunCursor1.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace BabySmash
4 | {
5 | ///
6 | /// Interaction logic for FunCursor1.xaml
7 | ///
8 | public partial class FunCursor1
9 | {
10 | public FunCursor1()
11 | {
12 | this.InitializeComponent();
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/Shapes/FunCursor2.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace BabySmash
4 | {
5 | ///
6 | /// Interaction logic for FunCursor2.xaml
7 | ///
8 | public partial class FunCursor2
9 | {
10 | public FunCursor2()
11 | {
12 | this.InitializeComponent();
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/App.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/Resources/Strings/en-EN.json:
--------------------------------------------------------------------------------
1 | {
2 | "Circle": "Circle",
3 | "Oval": "Oval",
4 | "Rectangle": "Rectangle",
5 | "Hexagon": "Hexagon",
6 | "Trapezoid": "Trapezoid",
7 | "Star": "Star",
8 | "Square": "Square",
9 | "Triangle": "Triangle",
10 | "Heart": "Heart",
11 |
12 | "Red": "Red",
13 | "Blue": "Blue",
14 | "Yellow": "Yellow",
15 | "Green": "Green",
16 | "Purple": "Purple",
17 | "Pink": "Pink",
18 | "Orange": "Orange",
19 | "Tan": "Tan",
20 | "Gray": "Gray"
21 | }
--------------------------------------------------------------------------------
/Resources/Strings/ru-RU.json:
--------------------------------------------------------------------------------
1 | {
2 | "Circle": "Круг",
3 | "Oval": "Овал",
4 | "Rectangle": "Прямоугольник",
5 | "Hexagon": "Шестиугольник",
6 | "Trapezoid": "Трапеция",
7 | "Star": "Звезда",
8 | "Square": "Квадрат",
9 | "Triangle": "Треугольник",
10 | "Heart": "Сердце",
11 |
12 | "Red": "красный",
13 | "Blue": "синий",
14 | "Yellow": "желтый",
15 | "Green": "зеленый",
16 | "Purple": "фиолетовый",
17 | "Pink": "розовый",
18 | "Orange": "оранжевый",
19 | "Tan": "желтовато-коричневый",
20 | "Gray": "серый"
21 | }
--------------------------------------------------------------------------------
/Shapes/CoolOval.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace BabySmash
2 | {
3 | using System;
4 | using System.Windows;
5 | using System.Windows.Media;
6 |
7 | ///
8 | /// Interaction logic for CoolOval.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolOval : IHasFace
12 | {
13 | public CoolOval(Brush x) : this()
14 | {
15 | this.Body.Fill = x;
16 | }
17 |
18 | public CoolOval()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolStar.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolStar.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolStar : IHasFace
12 | {
13 | public CoolStar(Brush x) : this()
14 | {
15 | Body.Fill = x;
16 | }
17 |
18 | public CoolStar()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolHeart.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolHeart.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolHeart : IHasFace
12 | {
13 | public CoolHeart(Brush x) : this()
14 | {
15 | this.Body.Fill = x;
16 | }
17 |
18 | public CoolHeart()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolCircle.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolCircle.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolCircle : IHasFace
12 | {
13 | public CoolCircle(Brush x) : this()
14 | {
15 | this.Body.Fill = x;
16 | }
17 |
18 | public CoolCircle()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolSquare.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolSquare.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolSquare : IHasFace
12 | {
13 | public CoolSquare(Brush x) : this()
14 | {
15 | this.Body.Fill = x;
16 | }
17 |
18 | public CoolSquare()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolHexagon.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolHexagon.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolHexagon : IHasFace
12 | {
13 | public CoolHexagon(Brush x) : this()
14 | {
15 | this.Body.Fill = x;
16 | }
17 |
18 | public CoolHexagon()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolTriangle.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolTriangle.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolTriangle : IHasFace
12 | {
13 | public CoolTriangle(Brush x) : this()
14 | {
15 | Body.Fill = x;
16 | }
17 |
18 | public CoolTriangle()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolRectangle.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolSquare.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolRectangle : IHasFace
12 | {
13 | public CoolRectangle(Brush x) : this()
14 | {
15 | this.Body.Fill = x;
16 | }
17 |
18 | public CoolRectangle()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Shapes/CoolTrapezoid.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Media;
4 |
5 | namespace BabySmash
6 | {
7 | ///
8 | /// Interaction logic for CoolTrapezoid.xaml
9 | ///
10 | [Serializable]
11 | public partial class CoolTrapezoid : IHasFace
12 | {
13 | public CoolTrapezoid(Brush x) : this()
14 | {
15 | Body.Fill = x;
16 | }
17 |
18 | public CoolTrapezoid()
19 | {
20 | this.InitializeComponent();
21 | }
22 |
23 | public Visibility FaceVisible
24 | {
25 | get
26 | {
27 | return Face.Visibility;
28 | }
29 | set
30 | {
31 | Face.Visibility = value;
32 | }
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/Settings.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 | using System.Configuration;
3 |
4 | namespace BabySmash.Properties
5 | {
6 | // This class allows you to handle specific events on the settings class:
7 | // The SettingChanging event is raised before a setting's value is changed.
8 | // The PropertyChanged event is raised after a setting's value is changed.
9 | // The SettingsLoaded event is raised after the setting values are loaded.
10 | // The SettingsSaving event is raised before the setting values are saved.
11 | internal sealed partial class Settings
12 | {
13 | private void SettingChangingEventHandler(object sender, SettingChangingEventArgs e)
14 | {
15 | // Add code to handle the SettingChangingEvent event here.
16 | }
17 |
18 | private void SettingsSavingEventHandler(object sender, CancelEventArgs e)
19 | {
20 | // Add code to handle the SettingsSaving event here.
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/BabySmash.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 14
4 | VisualStudioVersion = 14.0.24720.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BabySmash", "BabySmash.csproj", "{FB378E07-FDE4-4FC7-9210-68F80B561164}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {FB378E07-FDE4-4FC7-9210-68F80B561164}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {FB378E07-FDE4-4FC7-9210-68F80B561164}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {FB378E07-FDE4-4FC7-9210-68F80B561164}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {FB378E07-FDE4-4FC7-9210-68F80B561164}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/Shapes/CoolLetter.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
25 |
26 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Scott Hanselman
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.InteropServices;
3 | using System.Windows;
4 |
5 | [assembly: AssemblyTitle("BabySmash")]
6 | [assembly: AssemblyDescription("")]
7 | [assembly: AssemblyConfiguration("")]
8 | [assembly: AssemblyCompany("Scott Hanselman")]
9 | [assembly: AssemblyProduct("BabySmash")]
10 | [assembly: AssemblyCopyright("Copyright ©2008 Scott Hanselman")]
11 | [assembly: AssemblyTrademark("")]
12 | [assembly: AssemblyCulture("")]
13 | [assembly: ComVisible(false)]
14 | [assembly: AssemblyVersion("1.0.2.0")]
15 |
16 | //In order to begin building localizable applications, set
17 | //CultureYouAreCodingWith in your .csproj file
18 | //inside a . For example, if you are using US english
19 | //in your source files, set the to en-US. Then uncomment
20 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
21 | //the line below to match the UICulture setting in the project file.
22 |
23 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
24 |
25 | [assembly: ThemeInfo(
26 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
27 | //(used if a resource is not found in the page,
28 | // or application resource dictionaries)
29 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
30 | //(used if a resource is not found in the page,
31 | // app, or any theme specific resource dictionaries)
32 | )]
33 |
--------------------------------------------------------------------------------
/KeyboardHook.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Runtime.InteropServices;
4 |
5 | namespace BabySmash
6 | {
7 | internal class InterceptKeys
8 | {
9 | #region Delegates
10 |
11 | public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
12 |
13 | #endregion
14 |
15 | private const int WH_KEYBOARD_LL = 13;
16 | private const int WM_KEYDOWN = 0x0100;
17 |
18 | public static IntPtr SetHook(LowLevelKeyboardProc proc)
19 | {
20 | using (Process curProcess = Process.GetCurrentProcess())
21 | using (ProcessModule curModule = curProcess.MainModule)
22 | {
23 | return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
24 | }
25 | }
26 |
27 | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
28 | private static extern IntPtr SetWindowsHookEx(int idHook,
29 | LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
30 |
31 | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
32 | [return: MarshalAs(UnmanagedType.Bool)]
33 | public static extern bool UnhookWindowsHookEx(IntPtr hhk);
34 |
35 | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
36 | public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
37 | IntPtr wParam, IntPtr lParam);
38 |
39 | [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
40 | private static extern IntPtr GetModuleHandle(string lpModuleName);
41 | }
42 | }
--------------------------------------------------------------------------------
/Shapes/FunCursor1.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | True
7 |
8 |
9 | True
10 |
11 |
12 | False
13 |
14 |
15 | 35
16 |
17 |
18 | False
19 |
20 |
21 | 20
22 |
23 |
24 | True
25 |
26 |
27 | Speech
28 |
29 |
30 | Hand
31 |
32 |
33 | Arial
34 |
35 |
36 | False
37 |
38 |
39 |
--------------------------------------------------------------------------------
/Options.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Deployment.Application;
3 | using System.Diagnostics;
4 | using System.Windows;
5 | using System.Windows.Input;
6 | using BabySmash.Properties;
7 |
8 | namespace BabySmash
9 | {
10 | public partial class Options : Window
11 | {
12 | public Options()
13 | {
14 | InitializeComponent();
15 | }
16 |
17 | private void OK_Click(object sender, RoutedEventArgs e)
18 | {
19 | Settings.Default.Save();
20 | Close();
21 | }
22 |
23 | private void Cancel_Click(object sender, RoutedEventArgs e)
24 | {
25 | Settings.Default.Reload();
26 | Close();
27 | }
28 |
29 | protected override void OnActivated(EventArgs e)
30 | {
31 | base.OnActivated(e);
32 | Mouse.Capture(this, CaptureMode.SubTree);
33 | if (ApplicationDeployment.IsNetworkDeployed)
34 | {
35 | versionLabel.Text = "Version " + ApplicationDeployment.CurrentDeployment.CurrentVersion;
36 | }
37 | else
38 | versionLabel.Text = "Version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
39 | }
40 |
41 | protected override void OnDeactivated(EventArgs e)
42 | {
43 | base.OnDeactivated(e);
44 | Mouse.Capture(null);
45 | }
46 | protected override void OnMouseMove(MouseEventArgs e)
47 | {
48 | //Mouse.Capture(null);
49 | base.OnMouseMove(e);
50 | }
51 |
52 | protected override void OnKeyUp(System.Windows.Input.KeyEventArgs e)
53 | {
54 | if (e.Key == Key.Escape)
55 | {
56 | // hitting "escape" is the new cancel button
57 | Settings.Default.Reload();
58 | Close();
59 | }
60 | else
61 | {
62 | base.OnKeyUp(e);
63 | }
64 | }
65 |
66 | private void FeedbackLink_Click(object sender, RoutedEventArgs e)
67 | {
68 | Process.Start("http://feedback.babysmash.com");
69 | }
70 | }
71 | }
--------------------------------------------------------------------------------
/Shapes/CoolLetter.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Globalization;
4 | using System.Windows;
5 | using System.Windows.Media;
6 | using BabySmash.Properties;
7 |
8 | namespace BabySmash
9 | {
10 | ///
11 | /// Interaction logic for CoolLetter.xaml
12 | ///
13 | [Serializable]
14 | public partial class CoolLetter
15 | {
16 | public CoolLetter()
17 | {
18 | this.InitializeComponent();
19 | }
20 |
21 | public CoolLetter(Brush x, char letter) : this()
22 | {
23 | this.Character = letter;
24 | this.letterPath.Fill = x;
25 |
26 | this.letterPath.Data = MakeCharacterGeometry(GetLetterCharacter(letter));
27 | this.Width = this.letterPath.Data.Bounds.Width + this.letterPath.Data.Bounds.X + this.letterPath.StrokeThickness / 2;
28 | this.Height = this.letterPath.Data.Bounds.Height + this.letterPath.Data.Bounds.Y + this.letterPath.StrokeThickness / 2;
29 | }
30 |
31 | public char Character { get; private set; }
32 |
33 | private static Geometry MakeCharacterGeometry(char character)
34 | {
35 | var fontFamily = new FontFamily(Settings.Default.FontFamily);
36 | var typeface = new Typeface(fontFamily, FontStyles.Normal, FontWeights.Heavy, FontStretches.Normal);
37 | var formattedText = new FormattedText(
38 | character.ToString(),
39 | CultureInfo.CurrentCulture,
40 | FlowDirection.LeftToRight,
41 | typeface,
42 | 300,
43 | Brushes.Black);
44 | return formattedText.BuildGeometry(new Point(0, 0)).GetAsFrozen() as Geometry;
45 | }
46 |
47 | private static char GetLetterCharacter(char name)
48 | {
49 | Debug.Assert(name == char.ToUpperInvariant(name), "Always provide uppercase character names to this method.");
50 |
51 | if (Settings.Default.ForceUppercase)
52 | {
53 | return name;
54 | }
55 |
56 | // Return a random uppercase or lowercase letter.
57 | return Utils.GetRandomBoolean() ? name : char.ToLowerInvariant(name);
58 | }
59 | }
60 | }
--------------------------------------------------------------------------------
/Shapes/FunCursor2.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | BabySmash
2 | =========
3 |
4 | ## Overview
5 | The BabySmash game for small kids.
6 |
7 | As babies or children smash on the keyboard, colored shapes, letters and numbers appear on the screen and are voiced to help breed familiarization.
8 |
9 | Baby Smash will lock out the Windows Key, as well as Ctrl-Esc and Alt-Tab so your baby won't likely exit the application, rotate your monitor display, and so on. Pressing ALT-F4 will exit the application and Shift-Ctrl-Alt-O brings up the options dialog.
10 |
11 | Originally developed by Scott Hanselman, based on AlphaBaby. The version here contains some enhancements, but the original version is also available: http://www.hanselman.com/babysmash/
12 |
13 | ## Enhancements
14 | This version of BabySmash includes at least the following enhancements over the original:
15 | * Keypad typing now register as numbers typed, just like the number row.
16 | * Bug fixes, including cleaner shutdown.
17 | * Improved sound handling.
18 | * Ovals are added to the roster of shapes (including Circle, Heart, Hexagon, Rectangle, Square, Star, Trapezoid, Triangle), letters, and numbers.
19 |
20 | ## AutoHotkey
21 | Used in conjunction with a tool like AutoHotkey, you can essentially create a "baby lock hotkey" so you can baby-proof your PC inputs at a moment's notice, with this immersive application instead of just the boring Windows Lock Screen. To set up:
22 | * Download and install, if you don't already have it. Available for free at: http://www.autohotkey.com/
23 | * Run AutoHotkey; for the first time, it will prompt if you want to edit the script. You do.
24 | * If the script is not open, right-click the AutoHotkey taskbar icon (an 'H' icon) and select 'Edit This Script'.
25 | * Choose a hotkey. Avoid relying on the Windows key, as it will be held while BabySmash starts and may be buggy when you exit BabySmash due to the way the key is intercepted. I like to use Control+Shift+Z.
26 | * Code the hotkey. If you're using Control+Shift+Z, you can add "^+z::Run D:\GIT\babysmash\bin\Release\BabySmash.exe" right after the line "#z::Run www.autohotkey.com" (without quotes); Obviously your path to BabySmash.exe will vary depending on where you installed or built the code.
27 | * Save the file and close your text editor.
28 | * Right-click the AutoHotkey taskbar, and select 'Reload This Script'.
29 | * Try out your new hotkey to make sure it works. If not, go back to 'Edit This Script' and try again.
30 |
31 | For more advanced customization, see also: http://ahkscript.org/docs/Tutorial.htm
32 |
--------------------------------------------------------------------------------
/Audio.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Reflection;
5 | using System.Runtime.InteropServices;
6 |
7 | namespace BabySmash
8 | {
9 | public static class Win32Audio
10 | {
11 | ///
12 | /// Collection of soundname->WAV bytes mappings
13 | ///
14 | private static Dictionary cachedWavs = new Dictionary();
15 |
16 | ///
17 | /// Lock this object to protect against concurrent writes to the cachedWavs collection.
18 | ///
19 | private static object cachedWavsLock = new object();
20 |
21 | #region NativeAPI
22 | private const UInt32 SND_ASYNC = 0x0001;
23 | private const UInt32 SND_MEMORY = 0x004;
24 | private const UInt32 SND_LOOP = 0x0008;
25 | private const UInt32 SND_NOSTOP = 0x0010;
26 |
27 | [DllImport("winmm.dll")]
28 | private static extern bool PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);
29 |
30 | #endregion NativeAPI
31 |
32 | public static void PlayWavResource(string wav)
33 | {
34 | byte[] arrWav = GetWavResource(wav);
35 | PlaySound(arrWav, IntPtr.Zero, SND_ASYNC | SND_MEMORY);
36 | }
37 |
38 | public static void PlayWavResourceYield(string wav)
39 | {
40 | byte[] arrWav = GetWavResource(wav);
41 | PlaySound(arrWav, IntPtr.Zero, SND_ASYNC | SND_NOSTOP | SND_MEMORY);
42 | }
43 |
44 | private static byte[] GetWavResource(string wav)
45 | {
46 | wav = ".Resources.Sounds." + wav;
47 |
48 | if (cachedWavs.ContainsKey(wav))
49 | {
50 | return cachedWavs[wav];
51 | }
52 |
53 | lock (cachedWavsLock)
54 | {
55 | // Recheck inside the lock.
56 | if (cachedWavs.ContainsKey(wav))
57 | {
58 | return cachedWavs[wav];
59 | }
60 |
61 | string strName = Assembly.GetExecutingAssembly().GetName().Name + wav;
62 |
63 | // get the resource into a stream
64 | using (Stream strm = Assembly.GetExecutingAssembly().GetManifestResourceStream(strName))
65 | {
66 | var arrWav = new Byte[strm.Length];
67 | strm.Read(arrWav, 0, (int)strm.Length);
68 | cachedWavs.Add(wav, arrWav);
69 | return arrWav;
70 | }
71 | }
72 | }
73 | }
74 | }
--------------------------------------------------------------------------------
/app.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | True
28 |
29 |
30 | True
31 |
32 |
33 | False
34 |
35 |
36 | 35
37 |
38 |
39 | False
40 |
41 |
42 | 20
43 |
44 |
45 | True
46 |
47 |
48 | Speech
49 |
50 |
51 | Hand
52 |
53 |
54 | Arial
55 |
56 |
57 | False
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace BabySmash.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BabySmash.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/Shapes/CoolRectangle.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
48 |
49 |
--------------------------------------------------------------------------------
/Shapes/CoolSquare.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/Shapes/CoolStar.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/Shapes/CoolTrapezoid.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.sln.docstates
8 |
9 | # Build results
10 | [Dd]ebug/
11 | [Dd]ebugPublic/
12 | [Rr]elease/
13 | [Rr]eleases/
14 | x64/
15 | x86/
16 | build/
17 | bld/
18 | [Bb]in/
19 | [Oo]bj/
20 |
21 | # Roslyn cache directories
22 | *.ide/
23 |
24 | # MSTest test Results
25 | [Tt]est[Rr]esult*/
26 | [Bb]uild[Ll]og.*
27 |
28 | #NUNIT
29 | *.VisualState.xml
30 | TestResult.xml
31 |
32 | # Build Results of an ATL Project
33 | [Dd]ebugPS/
34 | [Rr]eleasePS/
35 | dlldata.c
36 |
37 | *_i.c
38 | *_p.c
39 | *_i.h
40 | *.ilk
41 | *.meta
42 | *.obj
43 | *.pch
44 | *.pdb
45 | *.pgc
46 | *.pgd
47 | *.rsp
48 | *.sbr
49 | *.tlb
50 | *.tli
51 | *.tlh
52 | *.tmp
53 | *.tmp_proj
54 | *.log
55 | *.vspscc
56 | *.vssscc
57 | .builds
58 | *.pidb
59 | *.svclog
60 | *.scc
61 |
62 | # Chutzpah Test files
63 | _Chutzpah*
64 |
65 | # Visual C++ cache files
66 | ipch/
67 | *.aps
68 | *.ncb
69 | *.opensdf
70 | *.sdf
71 | *.cachefile
72 |
73 | # Visual Studio profiler
74 | *.psess
75 | *.vsp
76 | *.vspx
77 |
78 | # TFS 2012 Local Workspace
79 | $tf/
80 |
81 | # Guidance Automation Toolkit
82 | *.gpState
83 |
84 | # ReSharper is a .NET coding add-in
85 | _ReSharper*/
86 | *.[Rr]e[Ss]harper
87 | *.DotSettings.user
88 |
89 | # JustCode is a .NET coding addin-in
90 | .JustCode
91 |
92 | # TeamCity is a build add-in
93 | _TeamCity*
94 |
95 | # DotCover is a Code Coverage Tool
96 | *.dotCover
97 |
98 | # NCrunch
99 | _NCrunch_*
100 | .*crunch*.local.xml
101 |
102 | # MightyMoose
103 | *.mm.*
104 | AutoTest.Net/
105 |
106 | # Web workbench (sass)
107 | .sass-cache/
108 |
109 | # Installshield output folder
110 | [Ee]xpress/
111 |
112 | # DocProject is a documentation generator add-in
113 | DocProject/buildhelp/
114 | DocProject/Help/*.HxT
115 | DocProject/Help/*.HxC
116 | DocProject/Help/*.hhc
117 | DocProject/Help/*.hhk
118 | DocProject/Help/*.hhp
119 | DocProject/Help/Html2
120 | DocProject/Help/html
121 |
122 | # Click-Once directory
123 | publish/
124 |
125 | # Publish Web Output
126 | *.[Pp]ublish.xml
127 | *.azurePubxml
128 | # TODO: Comment the next line if you want to checkin your web deploy settings
129 | # but database connection strings (with potential passwords) will be unencrypted
130 | *.pubxml
131 | *.publishproj
132 |
133 | # NuGet Packages
134 | *.nupkg
135 | # The packages folder can be ignored because of Package Restore
136 | **/packages/*
137 | # except build/, which is used as an MSBuild target.
138 | !**/packages/build/
139 | # If using the old MSBuild-Integrated Package Restore, uncomment this:
140 | #!**/packages/repositories.config
141 |
142 | # Windows Azure Build Output
143 | csx/
144 | *.build.csdef
145 |
146 | # Windows Store app package directory
147 | AppPackages/
148 |
149 | # Others
150 | sql/
151 | *.Cache
152 | ClientBin/
153 | [Ss]tyle[Cc]op.*
154 | ~$*
155 | *~
156 | *.dbmdl
157 | *.dbproj.schemaview
158 | *.pfx
159 | *.publishsettings
160 | node_modules/
161 |
162 | # RIA/Silverlight projects
163 | Generated_Code/
164 |
165 | # Backup & report files from converting an old project file
166 | # to a newer Visual Studio version. Backup files are not needed,
167 | # because we have git ;-)
168 | _UpgradeReport_Files/
169 | Backup*/
170 | UpgradeLog*.XML
171 | UpgradeLog*.htm
172 |
173 | # SQL Server files
174 | *.mdf
175 | *.ldf
176 |
177 | # Business Intelligence projects
178 | *.rdl.data
179 | *.bim.layout
180 | *.bim_*.settings
181 |
182 | # Microsoft Fakes
183 | FakesAssemblies/
184 |
--------------------------------------------------------------------------------
/Shapes/CoolHexagon.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/Shapes/CoolTriangle.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/Extensions/ObjectExtensions.cs:
--------------------------------------------------------------------------------
1 | namespace BabySmash.Extensions
2 | {
3 | using System;
4 | using System.Diagnostics.CodeAnalysis;
5 | using System.Reflection;
6 |
7 | ///
8 | /// Contains extension methods for objects
9 | ///
10 | public static class ObjectExtensions
11 | {
12 | ///
13 | /// Uses reflection to find a private field and validate its type.
14 | ///
15 | /// The type that declares the field. FlattenHierarchy doesn't work for private fields, so you have to pass the base type that declares the field.
16 | /// Expected field type.
17 | /// Name of the field to read.
18 | /// Field information.
19 | ///
20 | /// When field is not found or it is of incorrect type.
21 |
22 | public static FieldInfo GetField(this Type ownerType, Type valueType, string fieldName)
23 | {
24 | FieldInfo field = ownerType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
25 | if (field == null)
26 | {
27 | throw new ArgumentException($"Failed to find field '{fieldName}' on type {ownerType.FullName}.");
28 | }
29 |
30 | if (!valueType.IsAssignableFrom(field.FieldType))
31 | {
32 | throw new ArgumentException($"Field '{fieldName}' on type {ownerType.FullName} is {field.FieldType.FullName}, but expected {valueType.FullName}.");
33 | }
34 |
35 | return field;
36 | }
37 |
38 | ///
39 | /// Uses reflection to read a value of a private field.
40 | ///
41 | /// The type that declares the field. FlattenHierarchy doesn't work for private fields, so you have to pass the base type that declares the field.
42 | /// Expected field type.
43 | /// The instance to read the field value from.
44 | /// Name of the field to read.
45 | /// Field value.
46 | ///
47 | /// When field is not found or it is of incorrect type.
48 | [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "ReadField", Justification = "'Read' is a clear verb and 'field value' is the subject.")]
49 | public static TValue ReadFieldValue(this TOwner owner, string fieldName)
50 | {
51 | FieldInfo field = GetField(typeof(TOwner), typeof(TValue), fieldName);
52 | return (TValue)field.GetValue(owner);
53 | }
54 |
55 | ///
56 | /// Uses reflection to set a value of a private field.
57 | ///
58 | /// The type that declares the field. FlattenHierarchy doesn't work for private fields, so you have to pass the base type that declares the field.
59 | /// Expected field type.
60 | /// The instance to write the field value to.
61 | /// Name of the field to write.
62 | /// The value to set.
63 | ///
64 | /// When field is not found or it is of incorrect type.
65 | public static void WriteFieldValue(this TOwner owner, string fieldName, TValue value)
66 | {
67 | FieldInfo field = GetField(typeof(TOwner), typeof(TValue), fieldName);
68 | field.SetValue(owner, value);
69 | }
70 | }
71 | }
--------------------------------------------------------------------------------
/Shapes/CoolCircle.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/Shapes/CoolHeart.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 | using System.Windows.Controls;
3 | using System.Windows.Input;
4 | using System.Windows.Media;
5 |
6 | namespace BabySmash
7 | {
8 | public partial class MainWindow : Window
9 | {
10 | private readonly Controller controller;
11 | public Controller Controller { get { return controller; } }
12 |
13 | private UserControl customCursor;
14 | public UserControl CustomCursor { get { return customCursor; } set { customCursor = value; } }
15 |
16 | public void AddFigure(UserControl c)
17 | {
18 | this.figuresCanvas.Children.Add(c);
19 | }
20 |
21 | public void RemoveFigure(UserControl c)
22 | {
23 | this.figuresCanvas.Children.Remove(c);
24 | }
25 |
26 | public MainWindow(Controller c)
27 | {
28 | this.controller = c;
29 | this.DataContext = controller;
30 | InitializeComponent();
31 |
32 | //ResetCanvas();
33 | }
34 |
35 | protected override void OnMouseWheel(MouseWheelEventArgs e)
36 | {
37 | base.OnMouseWheel(e);
38 | controller.MouseWheel(this, e);
39 | }
40 |
41 | protected override void OnMouseUp(MouseButtonEventArgs e)
42 | {
43 | base.OnMouseUp(e);
44 | controller.MouseUp(this, e);
45 | }
46 |
47 | protected override void OnMouseDown(MouseButtonEventArgs e)
48 | {
49 | base.OnMouseDown(e);
50 | controller.MouseDown(this, e);
51 | }
52 |
53 | protected override void OnMouseEnter(MouseEventArgs e)
54 | {
55 | base.OnMouseEnter(e);
56 | AssertCursor();
57 | CustomCursor.Visibility = Visibility.Visible;
58 | }
59 |
60 | protected override void OnMouseLeave(MouseEventArgs e)
61 | {
62 | base.OnMouseLeave(e);
63 | CustomCursor.Visibility = Visibility.Hidden;
64 | }
65 |
66 | protected override void OnMouseMove(MouseEventArgs e)
67 | {
68 | base.OnMouseMove(e);
69 | if (controller.isOptionsDialogShown == false)
70 | {
71 | CustomCursor.Visibility = Visibility.Visible;
72 | Point p = e.GetPosition(mouseDragCanvas);
73 | double pX = p.X;
74 | double pY = p.Y;
75 | Cursor = Cursors.None;
76 | Canvas.SetTop(CustomCursor, pY);
77 | Canvas.SetLeft(CustomCursor, pX);
78 | Canvas.SetZIndex(CustomCursor, int.MaxValue);
79 | }
80 | controller.MouseMove(this, e);
81 | }
82 |
83 | protected override void OnKeyUp(KeyEventArgs e)
84 | {
85 | base.OnKeyUp(e);
86 | e.Handled = true;
87 | controller.ProcessKey(this, e);
88 | }
89 |
90 | protected override void OnLostMouseCapture(MouseEventArgs e)
91 | {
92 | base.OnLostMouseCapture(e);
93 | controller.LostMouseCapture(this, e);
94 | }
95 |
96 | internal void AssertCursor()
97 | {
98 | try
99 | {
100 | mouseCursorCanvas.Children.Clear();
101 | CustomCursor = Utils.GetCursor();
102 | if (CustomCursor.Parent != null)
103 | {
104 | ((Canvas)CustomCursor.Parent).Children.Remove(CustomCursor);
105 | }
106 | CustomCursor.RenderTransform = new ScaleTransform(0.5, 0.5);
107 | CustomCursor.Name = "customCursor";
108 | mouseCursorCanvas.Children.Insert(0, CustomCursor); //in front!
109 | CustomCursor.Visibility = Visibility.Hidden;
110 | }
111 | catch (System.NotSupportedException)
112 | {
113 | //we can die here if we ALT-F4 while in the Options Dialog
114 | }
115 | }
116 |
117 | private void Properties_Executed(object sender, ExecutedRoutedEventArgs e)
118 | {
119 | controller.ShowOptionsDialog();
120 | }
121 | }
122 | }
--------------------------------------------------------------------------------
/Utils.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Windows;
4 | using System.Windows.Media;
5 |
6 | namespace BabySmash
7 | {
8 | internal static class Utils
9 | {
10 | private static readonly Dictionary brushToString;
11 |
12 | private static readonly Random lRandom = new Random(); // BUG BUG: Believe it or not, Random is NOT THREAD SAFE!
13 |
14 | private static readonly FunCursor1 fun1 = new FunCursor1();
15 | private static readonly FunCursor2 fun2 = new FunCursor2();
16 |
17 | private static readonly Color[] someColors;
18 |
19 | private static readonly string[] sounds = {
20 | "giggle.wav",
21 | "babylaugh.wav",
22 | "babygigl2.wav",
23 | "ccgiggle.wav",
24 | "laughingmice.wav",
25 | "scooby2.wav",
26 | };
27 |
28 | static Utils()
29 | {
30 | brushToString = new Dictionary
31 | {
32 | {Colors.Red, "Red"},
33 | {Colors.Blue, "Blue"},
34 | {Colors.Yellow, "Yellow"},
35 | {Colors.Green, "Green"},
36 | {Colors.Purple, "Purple"},
37 | {Colors.Pink, "Pink"},
38 | {Colors.Orange, "Orange"},
39 | {Colors.Tan, "Tan"},
40 | {Colors.Gray, "Gray"}
41 | };
42 |
43 | someColors = new Color[brushToString.Count];
44 | brushToString.Keys.CopyTo(someColors, 0);
45 | }
46 |
47 | public static Color GetRandomColor()
48 | {
49 | Color color = someColors[lRandom.Next(0, someColors.Length)];
50 | return color;
51 | }
52 |
53 | public static Brush GetGradientBrush(Color color)
54 | {
55 | RadialGradientBrush myBrush = new RadialGradientBrush();
56 | myBrush.GradientOrigin = new Point(0.75, 0.25);
57 | myBrush.GradientStops.Add(new GradientStop(color.LightenOrDarken(50), 0.0));
58 | myBrush.GradientStops.Add(new GradientStop(color, 0.5));
59 | myBrush.GradientStops.Add(new GradientStop(color.LightenOrDarken(-50), 1.0));
60 | return myBrush;
61 | }
62 |
63 | public static Color LightenOrDarken(this Color src, sbyte degree)
64 | {
65 | Color ret = new Color();
66 | ret.A = src.A;
67 | ret.R = (byte)Math.Max(Math.Min(src.R + degree, 255), 0);
68 | ret.G = (byte)Math.Max(Math.Min(src.G + degree, 255), 0);
69 | ret.B = (byte)Math.Max(Math.Min(src.B + degree, 255), 0);
70 | return ret;
71 | }
72 |
73 |
74 | public static string ColorToString(Color b)
75 | {
76 | return brushToString[b];
77 | }
78 |
79 | public static string GetRandomSoundFile()
80 | {
81 | return sounds[lRandom.Next(0, sounds.Length)];
82 | }
83 |
84 | public static bool GetRandomBoolean()
85 | {
86 | if (lRandom.Next(0, 2) == 0)
87 | return false;
88 | return true;
89 | }
90 |
91 | public static int RandomBetweenTwoNumbers(int min, int max)
92 | {
93 | return lRandom.Next(min, max + 1);
94 | }
95 |
96 | internal static System.Windows.Controls.UserControl GetCursor()
97 | {
98 | switch (Properties.Settings.Default.CursorType)
99 | {
100 | case "Hand":
101 | return fun2;
102 | case "Arrow":
103 | return fun1;
104 | }
105 | return fun1;
106 | }
107 | }
108 | }
--------------------------------------------------------------------------------
/Tweening/TransitionType.cs:
--------------------------------------------------------------------------------
1 | namespace Tweener
2 | {
3 | ///
4 | /// Defines the set of equation types.
5 | ///
6 | public enum TransitionType
7 | {
8 | ///
9 | ///
10 | ///
11 | EaseNone,
12 | ///
13 | ///
14 | ///
15 | EaseInQuad,
16 | ///
17 | ///
18 | ///
19 | EaseOutQuad,
20 | ///
21 | ///
22 | ///
23 | EaseInOutQuad,
24 | ///
25 | ///
26 | ///
27 | EaseOutInQuad,
28 | ///
29 | ///
30 | ///
31 | EaseInCubic,
32 | ///
33 | ///
34 | ///
35 | EaseOutCubic,
36 | ///
37 | ///
38 | ///
39 | EaseInOutCubic,
40 | ///
41 | ///
42 | ///
43 | EaseOutInCubic,
44 | ///
45 | ///
46 | ///
47 | EaseInQuart,
48 | ///
49 | ///
50 | ///
51 | EaseOutQuart,
52 | ///
53 | ///
54 | ///
55 | EaseInOutQuart,
56 | ///
57 | ///
58 | ///
59 | EaseOutInQuart,
60 | ///
61 | ///
62 | ///
63 | EaseInQuint,
64 | ///
65 | ///
66 | ///
67 | EaseOutQuint,
68 | ///
69 | ///
70 | ///
71 | EaseInOutQuint,
72 | ///
73 | ///
74 | ///
75 | EaseOutInQuint,
76 | ///
77 | ///
78 | ///
79 | EaseInSine,
80 | ///
81 | ///
82 | ///
83 | EaseOutSine,
84 | ///
85 | ///
86 | ///
87 | EaseInOutSine,
88 | ///
89 | ///
90 | ///
91 | EaseOutInSine,
92 | ///
93 | ///
94 | ///
95 | EaseInCirc,
96 | ///
97 | ///
98 | ///
99 | EaseOutCirc,
100 | ///
101 | ///
102 | ///
103 | EaseInOutCirc,
104 | ///
105 | ///
106 | ///
107 | EaseOutInCirc,
108 | ///
109 | ///
110 | ///
111 | EaseInExpo,
112 | ///
113 | ///
114 | ///
115 | EaseOutExpo,
116 | ///
117 | ///
118 | ///
119 | EaseInOutExpo,
120 | ///
121 | ///
122 | ///
123 | EaseOutInExpo,
124 | ///
125 | ///
126 | ///
127 | EaseInElastic,
128 | ///
129 | ///
130 | ///
131 | EaseOutElastic,
132 | ///
133 | ///
134 | ///
135 | EaseInOutElastic,
136 | ///
137 | ///
138 | ///
139 | EaseOutInElastic,
140 | ///
141 | ///
142 | ///
143 | EaseInBack,
144 | ///
145 | ///
146 | ///
147 | EaseOutBack,
148 | ///
149 | ///
150 | ///
151 | EaseInOutBack,
152 | ///
153 | ///
154 | ///
155 | EaseOutInBack,
156 | ///
157 | ///
158 | ///
159 | EaseInBounce,
160 | ///
161 | ///
162 | ///
163 | EaseOutBounce,
164 | ///
165 | ///
166 | ///
167 | EaseInOutBounce,
168 | ///
169 | ///
170 | ///
171 | EaseOutInBounce
172 | }
173 | }
--------------------------------------------------------------------------------
/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Runtime.InteropServices;
4 | using System.Windows;
5 | using System.Windows.Forms;
6 | using Application = System.Windows.Application;
7 | using WinForms = System.Windows.Forms;
8 |
9 | namespace BabySmash
10 | {
11 | public partial class App : Application
12 | {
13 | private static readonly InterceptKeys.LowLevelKeyboardProc _proc = HookCallback;
14 | private static IntPtr _hookID = IntPtr.Zero;
15 |
16 | private void Application_Startup(object sender, StartupEventArgs e)
17 | {
18 | Controller.Instance.Launch();
19 | }
20 |
21 | public App()
22 | {
23 | ShutdownMode = ShutdownMode.OnExplicitShutdown;
24 | Application.Current.Exit += new ExitEventHandler(Current_Exit);
25 | try
26 | {
27 | _hookID = InterceptKeys.SetHook(_proc);
28 | }
29 | catch
30 | {
31 | DetachKeyboardHook();
32 | }
33 | }
34 |
35 | void Current_Exit(object sender, ExitEventArgs e)
36 | {
37 | DetachKeyboardHook();
38 | }
39 |
40 | ///
41 | /// Detach the keyboard hook; call during shutdown to prevent calls as we unload
42 | ///
43 | private static void DetachKeyboardHook()
44 | {
45 | if (_hookID != IntPtr.Zero)
46 | InterceptKeys.UnhookWindowsHookEx(_hookID);
47 | }
48 |
49 | public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
50 | {
51 | if (nCode >= 0)
52 | {
53 | bool alt = (WinForms.Control.ModifierKeys & Keys.Alt) != 0;
54 | bool control = (WinForms.Control.ModifierKeys & Keys.Control) != 0;
55 |
56 | int vkCode = Marshal.ReadInt32(lParam);
57 | Keys key = (Keys)vkCode;
58 |
59 | if (alt && key == Keys.F4)
60 | {
61 | Application.Current.Shutdown();
62 | return (IntPtr)1; // Handled.
63 | }
64 |
65 | if (!AllowKeyboardInput(alt, control, key))
66 | {
67 | return (IntPtr)1; // Handled.
68 | }
69 | }
70 |
71 | return InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam);
72 | }
73 |
74 | /// Determines whether the specified keyboard input should be allowed to be processed by the system.
75 | /// Helps block unwanted keys and key combinations that could exit the app, make system changes, etc.
76 | public static bool AllowKeyboardInput(bool alt, bool control, Keys key)
77 | {
78 | // Disallow various special keys.
79 | if (key <= Keys.Back || key == Keys.None ||
80 | key == Keys.Menu || key == Keys.Pause ||
81 | key == Keys.Help)
82 | {
83 | return false;
84 | }
85 |
86 | // Disallow ranges of special keys.
87 | // Currently leaves volume controls enabled; consider if this makes sense.
88 | // Disables non-existing Keys up to 65534, to err on the side of caution for future keyboard expansion.
89 | if ((key >= Keys.LWin && key <= Keys.Sleep) ||
90 | (key >= Keys.KanaMode && key <= Keys.HanjaMode) ||
91 | (key >= Keys.IMEConvert && key <= Keys.IMEModeChange) ||
92 | (key >= Keys.BrowserBack && key <= Keys.BrowserHome) ||
93 | (key >= Keys.MediaNextTrack && key <= Keys.LaunchApplication2) ||
94 | (key >= Keys.ProcessKey && key <= (Keys)65534))
95 | {
96 | return false;
97 | }
98 |
99 | // Disallow specific key combinations. (These component keys would be OK on their own.)
100 | if ((alt && key == Keys.Tab) ||
101 | (alt && key == Keys.Space) ||
102 | (control && key == Keys.Escape))
103 | {
104 | return false;
105 | }
106 |
107 | // Allow anything else (like letters, numbers, spacebar, braces, and so on).
108 | return true;
109 | }
110 | }
111 | }
--------------------------------------------------------------------------------
/Shapes/CoolOval.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/Shapes/FigureGenerator.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Windows;
4 | using System.Windows.Controls;
5 | using System.Windows.Media;
6 | using System.Windows.Media.Effects;
7 | using BrushControlFunc = System.Func;
8 | using BabySmash.Properties;
9 | using BabySmash.Shapes;
10 |
11 | namespace BabySmash
12 | {
13 | public class FigureTemplate
14 | {
15 | public Brush Fill { get; set; }
16 | public Color Color { get; set; }
17 | public BrushControlFunc GeneratorFunc { get; set; }
18 | public Effect Effect { get; set; }
19 | public string Name { get; set; }
20 | public string Letter { get; set; }
21 | }
22 |
23 | public class FigureGenerator
24 | {
25 | private static readonly List> hashTableOfFigureGenerators = new List>
26 | {
27 | new KeyValuePair(BabySmashShape.Circle, x => new CoolCircle(x) ),
28 | new KeyValuePair(BabySmashShape.Oval, x => new CoolOval(x) ),
29 | new KeyValuePair(BabySmashShape.Rectangle, x => new CoolRectangle(x) ),
30 | new KeyValuePair(BabySmashShape.Hexagon, x => new CoolHexagon(x) ),
31 | new KeyValuePair(BabySmashShape.Trapezoid, x => new CoolTrapezoid(x) ),
32 | new KeyValuePair(BabySmashShape.Star, x => new CoolStar(x) ),
33 | new KeyValuePair(BabySmashShape.Square, x => new CoolSquare(x) ),
34 | new KeyValuePair(BabySmashShape.Triangle, x => new CoolTriangle(x) ),
35 | new KeyValuePair(BabySmashShape.Heart, x => new CoolHeart(x) )
36 | };
37 |
38 | public static UserControl NewUserControlFrom(FigureTemplate template)
39 | {
40 | UserControl retVal = null;
41 |
42 | if (template.Letter.Length == 1 && Char.IsLetterOrDigit(template.Letter[0]))
43 | {
44 | retVal = new CoolLetter(template.Fill.Clone(), template.Letter[0]);
45 | }
46 | else
47 | {
48 | retVal = template.GeneratorFunc(template.Fill.Clone());
49 | }
50 |
51 | var randomTransition1 = (Tweener.TransitionType)Utils.RandomBetweenTwoNumbers(1, (int)Tweener.TransitionType.EaseOutInBounce);
52 | var ani1 = Tweener.Tween.CreateAnimation(randomTransition1, 0, 1, new TimeSpan(0, 0, 0, 1), 30);
53 | var randomTransition2 = (Tweener.TransitionType)Utils.RandomBetweenTwoNumbers(1, (int)Tweener.TransitionType.EaseOutInBounce);
54 | var ani2 = Tweener.Tween.CreateAnimation(randomTransition2, 360, 0, new TimeSpan(0, 0, 0, 1), 30);
55 | retVal.RenderTransformOrigin = new Point(0.5, 0.5);
56 | var group = new TransformGroup();
57 | group.Children.Add(new ScaleTransform());
58 | group.Children.Add(new RotateTransform());
59 | retVal.RenderTransform = group;
60 | group.Children[0].BeginAnimation(ScaleTransform.ScaleXProperty, ani1);
61 | group.Children[0].BeginAnimation(ScaleTransform.ScaleYProperty, ani1);
62 | group.Children[1].BeginAnimation(RotateTransform.AngleProperty, ani2);
63 |
64 | if (Settings.Default.BitmapEffects)
65 | {
66 | retVal.Effect = template.Effect.Clone();
67 | }
68 |
69 | return retVal;
70 | }
71 |
72 | //TODO: Should this be in XAML? Would that make it better?
73 | //TODO: Should I change the height, width and stroke to be relative to the screen size?
74 | //TODO: Where can I get REALLY complex shapes like animal vectors or custom pics? Where do I store them?
75 |
76 | public static FigureTemplate GenerateFigureTemplate(char displayChar)
77 | {
78 | Color c = Utils.GetRandomColor();
79 |
80 | string name = null;
81 | KeyValuePair nameFunc = hashTableOfFigureGenerators[Utils.RandomBetweenTwoNumbers(0, hashTableOfFigureGenerators.Count - 1)];
82 | if (Char.IsLetterOrDigit(displayChar))
83 | {
84 | name = displayChar.ToString();
85 | }
86 | else
87 | {
88 | name = Controller.GetLocalizedString(nameFunc.Key.ToString());
89 | }
90 |
91 | return new FigureTemplate
92 | {
93 | Color = c,
94 | Name = name,
95 | GeneratorFunc = nameFunc.Value,
96 | Fill = Utils.GetGradientBrush(c),
97 | Letter = displayChar.ToString(),
98 | Effect = Animation.GetRandomBitmapEffect()
99 | };
100 | }
101 | }
102 | }
--------------------------------------------------------------------------------
/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | BabySmash! by Scott Hanselman with community contributions! - http://www.babysmash.com
89 |
90 | Ctrl-Shift-Alt-O for options, ALT-F4 to exit
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | Updating BabySmash in the background...
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace BabySmash.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 |
26 | [global::System.Configuration.UserScopedSettingAttribute()]
27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
28 | [global::System.Configuration.DefaultSettingValueAttribute("True")]
29 | public bool ForceUppercase {
30 | get {
31 | return ((bool)(this["ForceUppercase"]));
32 | }
33 | set {
34 | this["ForceUppercase"] = value;
35 | }
36 | }
37 |
38 | [global::System.Configuration.UserScopedSettingAttribute()]
39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
40 | [global::System.Configuration.DefaultSettingValueAttribute("True")]
41 | public bool FadeAway {
42 | get {
43 | return ((bool)(this["FadeAway"]));
44 | }
45 | set {
46 | this["FadeAway"] = value;
47 | }
48 | }
49 |
50 | [global::System.Configuration.UserScopedSettingAttribute()]
51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
52 | [global::System.Configuration.DefaultSettingValueAttribute("False")]
53 | public bool BitmapEffects {
54 | get {
55 | return ((bool)(this["BitmapEffects"]));
56 | }
57 | set {
58 | this["BitmapEffects"] = value;
59 | }
60 | }
61 |
62 | [global::System.Configuration.UserScopedSettingAttribute()]
63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
64 | [global::System.Configuration.DefaultSettingValueAttribute("35")]
65 | public int ClearAfter {
66 | get {
67 | return ((int)(this["ClearAfter"]));
68 | }
69 | set {
70 | this["ClearAfter"] = value;
71 | }
72 | }
73 |
74 | [global::System.Configuration.UserScopedSettingAttribute()]
75 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
76 | [global::System.Configuration.DefaultSettingValueAttribute("False")]
77 | public bool MouseDraw {
78 | get {
79 | return ((bool)(this["MouseDraw"]));
80 | }
81 | set {
82 | this["MouseDraw"] = value;
83 | }
84 | }
85 |
86 | [global::System.Configuration.UserScopedSettingAttribute()]
87 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
88 | [global::System.Configuration.DefaultSettingValueAttribute("20")]
89 | public int FadeAfter {
90 | get {
91 | return ((int)(this["FadeAfter"]));
92 | }
93 | set {
94 | this["FadeAfter"] = value;
95 | }
96 | }
97 |
98 | [global::System.Configuration.UserScopedSettingAttribute()]
99 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
100 | [global::System.Configuration.DefaultSettingValueAttribute("True")]
101 | public bool FacesOnShapes {
102 | get {
103 | return ((bool)(this["FacesOnShapes"]));
104 | }
105 | set {
106 | this["FacesOnShapes"] = value;
107 | }
108 | }
109 |
110 | [global::System.Configuration.UserScopedSettingAttribute()]
111 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
112 | [global::System.Configuration.DefaultSettingValueAttribute("Speech")]
113 | public string Sounds {
114 | get {
115 | return ((string)(this["Sounds"]));
116 | }
117 | set {
118 | this["Sounds"] = value;
119 | }
120 | }
121 |
122 | [global::System.Configuration.UserScopedSettingAttribute()]
123 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
124 | [global::System.Configuration.DefaultSettingValueAttribute("Hand")]
125 | public string CursorType {
126 | get {
127 | return ((string)(this["CursorType"]));
128 | }
129 | set {
130 | this["CursorType"] = value;
131 | }
132 | }
133 |
134 | [global::System.Configuration.UserScopedSettingAttribute()]
135 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
136 | [global::System.Configuration.DefaultSettingValueAttribute("Arial")]
137 | public string FontFamily {
138 | get {
139 | return ((string)(this["FontFamily"]));
140 | }
141 | set {
142 | this["FontFamily"] = value;
143 | }
144 | }
145 |
146 | [global::System.Configuration.UserScopedSettingAttribute()]
147 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
148 | [global::System.Configuration.DefaultSettingValueAttribute("False")]
149 | public bool TransparentBackground {
150 | get {
151 | return ((bool)(this["TransparentBackground"]));
152 | }
153 | set {
154 | this["TransparentBackground"] = value;
155 | }
156 | }
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/BuildProcessTemplates/UpgradeTemplate.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | [New Microsoft.TeamFoundation.Build.Workflow.Activities.AgentSettings() With {.MaxWaitTime = New System.TimeSpan(4, 0, 0), .MaxExecutionTime = New System.TimeSpan(0, 0, 0), .TagComparison = Microsoft.TeamFoundation.Build.Workflow.Activities.TagComparison.MatchExactly }]
21 |
22 |
23 |
24 | [Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.Auto]
25 | [False]
26 | [False]
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | [Microsoft.TeamFoundation.VersionControl.Client.RecursionType.OneLevel]
37 | [Microsoft.TeamFoundation.Build.Workflow.BuildVerbosity.Normal]
38 |
39 |
40 |
41 | All
42 | Assembly references and imported namespaces serialized as XML namespaces
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/Tweening/Tween.cs:
--------------------------------------------------------------------------------
1 | namespace Tweener
2 | {
3 | using System;
4 | using System.Windows;
5 | using System.Windows.Media.Animation;
6 |
7 | ///
8 | /// Provides the implementation of tween attached properties.
9 | ///
10 | public static class Tween
11 | {
12 | ///
13 | /// The default number of keyframes to generate per second.
14 | ///
15 | public const int DefaultFps = 20;
16 |
17 | ///
18 | /// Defines the tween transition type.
19 | ///
20 | public static readonly DependencyProperty TransitionTypeProperty =
21 | DependencyProperty.RegisterAttached("TransitionType", typeof(TransitionType), typeof(Tween), new PropertyMetadata(OnTweenChanged));
22 |
23 | ///
24 | /// Defines the source value of a tween double animation.
25 | ///
26 | public static readonly DependencyProperty FromProperty =
27 | DependencyProperty.RegisterAttached("From", typeof(double), typeof(Tween), new PropertyMetadata(OnTweenChanged));
28 |
29 | ///
30 | /// Defines the target value of a tween double animation.
31 | ///
32 | public static readonly DependencyProperty ToProperty =
33 | DependencyProperty.RegisterAttached("To", typeof(double), typeof(Tween), new PropertyMetadata(OnTweenChanged));
34 |
35 | ///
36 | /// The frames-per-second attached property.
37 | ///
38 | /// The FPS attached property defines the number of keyframes to generate per second.
39 | public static readonly DependencyProperty FpsProperty =
40 | DependencyProperty.RegisterAttached("Fps", typeof(double), typeof(Tween), new PropertyMetadata(OnTweenChanged));
41 |
42 | private delegate double Equation(params double[] args);
43 |
44 | private static void OnTweenChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
45 | {
46 | DoubleAnimationUsingKeyFrames animation = o as DoubleAnimationUsingKeyFrames;
47 |
48 | if (animation != null && animation.Duration.HasTimeSpan)
49 | {
50 | TransitionType type = GetTransitionType(animation);
51 | double from = GetFrom(animation);
52 | double to = GetTo(animation);
53 | double fps = GetFps(animation);
54 |
55 | if (fps <= 0)
56 | {
57 | fps = DefaultFps;
58 | }
59 |
60 | FillAnimation(animation, type, from, to, animation.Duration.TimeSpan, fps);
61 | }
62 | }
63 |
64 | private static void FillAnimation(DoubleAnimationUsingKeyFrames animation, TransitionType type, double from, double to, TimeSpan duration, double fps)
65 | {
66 | Equation equation = (Equation)Delegate.CreateDelegate(typeof(Equation), typeof(Equations).GetMethod(type.ToString()));
67 |
68 | double total = duration.TotalMilliseconds;
69 | double step = 1000D / (double)fps;
70 |
71 | // clear animation
72 | animation.KeyFrames.Clear();
73 |
74 | for (double i = 0; i < total; i += step)
75 | {
76 | LinearDoubleKeyFrame frame = new LinearDoubleKeyFrame();
77 | frame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(i));
78 | frame.Value = equation(i, from, to - from, total);
79 |
80 | animation.KeyFrames.Add(frame);
81 | }
82 |
83 | // always add exact final key frame
84 | LinearDoubleKeyFrame finalFrame = new LinearDoubleKeyFrame();
85 | finalFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(total));
86 | finalFrame.Value = to;
87 | animation.KeyFrames.Add(finalFrame);
88 | }
89 |
90 | ///
91 | /// Creates a tween animation with a default number of frames per second..
92 | ///
93 | /// The type.
94 | /// From.
95 | /// To.
96 | /// The duration.
97 | ///
98 | public static DoubleAnimationUsingKeyFrames CreateAnimation(TransitionType type, double from, double to, TimeSpan duration)
99 | {
100 | return CreateAnimation(type, from, to, duration, DefaultFps);
101 | }
102 |
103 | ///
104 | /// Creates a tween animation.
105 | ///
106 | /// The type.
107 | /// From.
108 | /// To.
109 | /// The duration.
110 | /// The number of keyframes to generate per second.
111 | ///
112 | public static DoubleAnimationUsingKeyFrames CreateAnimation(TransitionType type, double from, double to, TimeSpan duration, double fps)
113 | {
114 | DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames();
115 | FillAnimation(animation, type, from, to, duration, fps);
116 | return animation;
117 | }
118 |
119 | ///
120 | /// Gets the tween transition type.
121 | ///
122 | /// The o.
123 | ///
124 | public static TransitionType GetTransitionType(DependencyObject o)
125 | {
126 | return (TransitionType)o.GetValue(TransitionTypeProperty);
127 | }
128 |
129 | ///
130 | /// Sets the tween transition type.
131 | ///
132 | /// The o.
133 | /// The value.
134 | public static void SetTransitionType(DependencyObject o, TransitionType value)
135 | {
136 | o.SetValue(TransitionTypeProperty, value);
137 | }
138 |
139 | ///
140 | /// Gets the tween's starting value.
141 | ///
142 | /// The o.
143 | ///
144 | public static double GetFrom(DependencyObject o)
145 | {
146 | return (double)o.GetValue(FromProperty);
147 | }
148 |
149 | ///
150 | /// Sets the tween's starting value.
151 | ///
152 | /// The o.
153 | /// The value.
154 | public static void SetFrom(DependencyObject o, double value)
155 | {
156 | o.SetValue(FromProperty, value);
157 | }
158 |
159 | ///
160 | /// Gets the tween's ending value.
161 | ///
162 | /// The o.
163 | ///
164 | public static double GetTo(DependencyObject o)
165 | {
166 | return (double)o.GetValue(ToProperty);
167 | }
168 |
169 | ///
170 | /// Sets the tween's ending value.
171 | ///
172 | /// The o.
173 | /// The value.
174 | public static void SetTo(DependencyObject o, double value)
175 | {
176 | o.SetValue(ToProperty, value);
177 | }
178 |
179 | ///
180 | /// Gets the number of keyframes to generate per second.
181 | ///
182 | /// The o.
183 | public static double GetFps(DependencyObject o)
184 | {
185 | return (double)o.GetValue(FpsProperty);
186 | }
187 |
188 | ///
189 | /// Sets the number of keyframes to generate per second.
190 | ///
191 | /// The o.
192 | /// The value.
193 | public static void SetFps(DependencyObject o, double value)
194 | {
195 | o.SetValue(FpsProperty, value);
196 | }
197 | }
198 | }
--------------------------------------------------------------------------------
/Shapes/Animation.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 | using System.Windows.Media;
3 | using System.Windows.Media.Animation;
4 | using System.Windows.Media.Effects;
5 |
6 | namespace BabySmash
7 | {
8 | class Animation
9 | {
10 | public static Effect GetRandomBitmapEffect()
11 | {
12 | int e = Utils.RandomBetweenTwoNumbers(0, 3);
13 | switch (e)
14 | {
15 | case 0:
16 | // Just makes the figure blurry; maybe do this one less frequently?
17 | return new BlurEffect
18 | {
19 | Radius = Utils.RandomBetweenTwoNumbers(5, 20),
20 | RenderingBias = RenderingBias.Performance,
21 | };
22 | case 1:
23 | // TODO: Maybe add a replacement for the deprecated EmbossBitmapEffect? For now, just fallthrough.
24 | case 2:
25 | // TODO: Maybe add a replacement for the deprecated BevelBitmapEffect? For now, just fallthrough.
26 | case 3:
27 | return new DropShadowEffect
28 | {
29 | ShadowDepth = 0,
30 | Color = Utils.GetRandomColor(),
31 | BlurRadius = Utils.RandomBetweenTwoNumbers(10, 50),
32 | RenderingBias = RenderingBias.Performance,
33 | };
34 | }
35 |
36 | return new DropShadowEffect();
37 | }
38 |
39 | public static void ApplyRandomAnimationEffect(FrameworkElement fe, Duration duration)
40 | {
41 | int e = Utils.RandomBetweenTwoNumbers(0, 3);
42 | switch (e)
43 | {
44 | case 0:
45 | ApplyJiggle(fe, duration);
46 | break;
47 | case 1:
48 | ApplySnap(fe, duration);
49 | break;
50 | case 2:
51 | ApplyThrob(fe, duration);
52 | break;
53 | case 3:
54 | ApplyRotate(fe, duration);
55 | break;
56 | }
57 | }
58 |
59 | public static Storyboard CreateDPAnimation(FrameworkElement container, UIElement shape,
60 | DependencyProperty dp, Duration duration, double from, double to)
61 | {
62 | var st = new Storyboard();
63 | NameScope.SetNameScope(container, new NameScope());
64 | container.RegisterName("shape", shape);
65 |
66 | var d = new DoubleAnimation
67 | {
68 | From = from,
69 | To = to,
70 | Duration = duration,
71 | AutoReverse = false
72 | };
73 |
74 | st.Children.Add(d);
75 | Storyboard.SetTargetName(d, "shape");
76 | Storyboard.SetTargetProperty(d, new PropertyPath(dp));
77 | return st;
78 | }
79 |
80 | public static void ApplyJiggle(FrameworkElement fe, Duration duration)
81 | {
82 | DoubleAnimationUsingKeyFrames da = new DoubleAnimationUsingKeyFrames();
83 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
84 | da.KeyFrames.Add(new LinearDoubleKeyFrame(10, KeyTime.Paced));
85 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
86 | da.KeyFrames.Add(new LinearDoubleKeyFrame(-10, KeyTime.Paced));
87 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
88 | da.KeyFrames.Add(new LinearDoubleKeyFrame(5, KeyTime.Paced));
89 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
90 | da.KeyFrames.Add(new LinearDoubleKeyFrame(-5, KeyTime.Paced));
91 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
92 |
93 | da.Duration = duration;
94 | da.AccelerationRatio = da.DecelerationRatio = 0.2;
95 |
96 | fe.RenderTransformOrigin = new Point(0.5, 0.5);
97 | fe.RenderTransform = new RotateTransform(0);
98 | fe.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, da);
99 | }
100 |
101 | public static void ApplyThrob(FrameworkElement fe, Duration duration)
102 | {
103 | DoubleAnimationUsingKeyFrames da = new DoubleAnimationUsingKeyFrames();
104 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.Paced));
105 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1.1, KeyTime.Paced));
106 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.Paced));
107 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0.9, KeyTime.Paced));
108 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.Paced));
109 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1.05, KeyTime.Paced));
110 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.Paced));
111 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0.95, KeyTime.Paced));
112 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.Paced));
113 |
114 | da.Duration = duration;
115 | da.AccelerationRatio = da.DecelerationRatio = 0.2;
116 |
117 | fe.RenderTransformOrigin = new Point(0.5, 0.5);
118 | fe.RenderTransform = new ScaleTransform(1, 1);
119 | fe.RenderTransform.BeginAnimation(ScaleTransform.ScaleXProperty, da);
120 | fe.RenderTransform.BeginAnimation(ScaleTransform.ScaleYProperty, da);
121 | }
122 |
123 | public static Timeline ApplyZoom(FrameworkElement fe, Duration duration, double scale)
124 | {
125 | var da = new DoubleAnimation
126 | {
127 | From = 1,
128 | To = scale,
129 | Duration = duration,
130 | AutoReverse = true
131 | };
132 |
133 | da.AccelerationRatio = da.DecelerationRatio = 0.2;
134 |
135 | fe.RenderTransformOrigin = new Point(0.5, 0.5);
136 | fe.RenderTransform = new ScaleTransform(scale, scale);
137 | fe.RenderTransform.BeginAnimation(ScaleTransform.ScaleXProperty, da);
138 | fe.RenderTransform.BeginAnimation(ScaleTransform.ScaleYProperty, da);
139 | return da;
140 | }
141 |
142 | public static void ApplyRotate(FrameworkElement fe, Duration duration)
143 | {
144 | DoubleAnimationUsingKeyFrames da = new DoubleAnimationUsingKeyFrames();
145 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
146 | da.KeyFrames.Add(new LinearDoubleKeyFrame(-5, KeyTime.Paced));
147 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
148 | da.KeyFrames.Add(new LinearDoubleKeyFrame(90, KeyTime.Paced));
149 | da.KeyFrames.Add(new LinearDoubleKeyFrame(180, KeyTime.Paced));
150 | da.KeyFrames.Add(new LinearDoubleKeyFrame(270, KeyTime.Paced));
151 | da.KeyFrames.Add(new LinearDoubleKeyFrame(360, KeyTime.Paced));
152 | da.KeyFrames.Add(new LinearDoubleKeyFrame(365, KeyTime.Paced));
153 | da.KeyFrames.Add(new LinearDoubleKeyFrame(360, KeyTime.Paced));
154 |
155 | da.Duration = duration;
156 | da.AccelerationRatio = da.DecelerationRatio = 0.2;
157 |
158 | fe.RenderTransformOrigin = new Point(0.5, 0.5);
159 | fe.RenderTransform = new RotateTransform(0);
160 | fe.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, da);
161 | }
162 |
163 | public static void ApplySnap(FrameworkElement fe, Duration duration)
164 | {
165 | DoubleAnimationUsingKeyFrames da = new DoubleAnimationUsingKeyFrames();
166 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.Paced));
167 | da.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.Paced));
168 | da.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.Paced));
169 |
170 | da.Duration = duration;
171 | da.AccelerationRatio = da.DecelerationRatio = 0.2;
172 |
173 | fe.RenderTransformOrigin = new Point(0.5, 0.5);
174 | fe.RenderTransform = new ScaleTransform(1, 1);
175 | fe.RenderTransform.BeginAnimation(ScaleTransform.ScaleYProperty, da);
176 | }
177 | }
178 | }
--------------------------------------------------------------------------------
/WordFinder.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Reflection;
6 | using System.Text;
7 | using System.Threading;
8 | using System.Windows;
9 | using System.Windows.Controls;
10 | using System.Windows.Media;
11 | using System.Windows.Media.Animation;
12 |
13 | namespace BabySmash
14 | {
15 | public class WordFinder
16 | {
17 | private const int MinimumWordLength = 2, MaximumWordLength = 15;
18 |
19 | private bool wordsReady;
20 |
21 | private HashSet words = new HashSet();
22 |
23 | public WordFinder(string wordsFilePath)
24 | {
25 | // File path provided should be relative to our running location, so combine for full path safety.
26 | string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
27 | wordsFilePath = Path.Combine(dir, wordsFilePath);
28 |
29 | // Bail if the source word file is not found.
30 | if (!File.Exists(wordsFilePath))
31 | {
32 | // Source word file was not found; place a 'words.txt' file next to BabySmash.exe to enable combining
33 | // letters into typed words. Some common names may work too (but successful OS speech synth may vary).
34 | return;
35 | }
36 |
37 | // Load up the string dictionary in the background.
38 | Thread t = new Thread(() =>
39 | {
40 | // Read through the word file and create a hashtable entry for each one with some
41 | // further parsed word data (such as various game scores, etc)
42 | StreamReader sr = new StreamReader(wordsFilePath);
43 | string s = sr.ReadLine();
44 | while (s != null)
45 | {
46 | // Ignore invalid lines, comment lines, or words which are too short or too long.
47 | if (!s.Contains(";") && !s.Contains("/") && !s.Contains("\\") &&
48 | s.Length >= MinimumWordLength && s.Length <= MaximumWordLength)
49 | {
50 | this.words.Add(s.ToUpper());
51 | }
52 |
53 | s = sr.ReadLine();
54 | }
55 |
56 | // Store all words into separate buckets based on the last letter for faster compares.
57 |
58 | // Mark that we're done loading so we can speak words instead of just letters.
59 | wordsReady = true;
60 | });
61 | t.IsBackground = true;
62 | t.Start();
63 | }
64 |
65 | public string LastWord(List figuresQueue)
66 | {
67 | // If not done loading, or could not yet form a word based on queue length, just abort.
68 | int figuresPos = figuresQueue.Count - 1;
69 | if (!this.wordsReady || figuresPos < MinimumWordLength - 1)
70 | {
71 | return null;
72 | }
73 |
74 | // Loop while the most recently pressed things are still letters; loop proceeds from the
75 | // most recent letter, back towards the beginning, as we only care about the longest word
76 | // that we JUST now finished typing.
77 | string longestWord = null;
78 | var stringToCheck = new StringBuilder();
79 | int lowestIndexToCheck = Math.Max(0, figuresPos - MaximumWordLength);
80 | while (figuresPos >= lowestIndexToCheck)
81 | {
82 | var lastFigure = figuresQueue[figuresPos] as CoolLetter;
83 | if (lastFigure == null)
84 | {
85 | // If we encounter a non-letter, move on with the best word so far (if any).
86 | // IE typing "o [bracket] p e n" can match word "pen" but not "open" since our
87 | // intention back at [bracket] shows we don't necessarily mean to type "open".
88 | break;
89 | }
90 |
91 | // Build up the string and check to see if it is a word so far.
92 | stringToCheck.Insert(0, lastFigure.Character);
93 | string s = stringToCheck.ToString();
94 | if (this.words.Contains(stringToCheck.ToString()) && s.Length >= MinimumWordLength)
95 | {
96 | // Since we're progressively checking longer and longer letter combinations,
97 | // each time we find a word, it is our new "longest" word so far.
98 | longestWord = s;
99 | }
100 |
101 | figuresPos--;
102 | }
103 |
104 | return longestWord;
105 | }
106 |
107 | public void AnimateLettersIntoWord(List figuresQueue, string lastWord)
108 | {
109 | // Prepare to animate the letters into their respective positions, on each screen.
110 | Duration duration = new Duration(TimeSpan.FromMilliseconds(1200));
111 | int totalLetters = lastWord.Length;
112 |
113 | Point wordCenter = this.FindWordCenter(figuresQueue, totalLetters);
114 | Point wordSize = this.FindWordSize(figuresQueue, totalLetters);
115 | double wordLeftEdge = wordCenter.X - wordSize.X / 2f;
116 |
117 | // Figure out where to move each letter used in the word; find the letters used based on
118 | // the word length; they are the last several figures in the figures queue.
119 | for (int i = figuresQueue.Count - 1; i >= figuresQueue.Count - totalLetters; i--)
120 | {
121 | UserControl currentFigure = figuresQueue[i];
122 |
123 | // Find the translation animation of this element, or make one if there is not one yet.
124 | var transformGroup = currentFigure.RenderTransform as TransformGroup;
125 | var transform = FindOrAddTranslationTransform(transformGroup);
126 |
127 | // We know where we want to center the word, and the word's left edge based on figure
128 | // sizes, and now just need to figure out how far from that left edge we need to adjust
129 | // to make this letter move to the correct relative position to spell out the word.
130 | double wordOffsetX = 0d;
131 | for (int j = figuresQueue.Count - totalLetters; j < i; j++)
132 | {
133 | wordOffsetX += figuresQueue[j].Width;
134 | }
135 |
136 | // Start translating from wherever we were already translated to (or 0 if not yet
137 | // translated) and going to the new position for this letter based for the word.
138 | var wordTranslationX = wordLeftEdge - Canvas.GetLeft(currentFigure);
139 | var wordTranslationY = wordCenter.Y - Canvas.GetTop(currentFigure);
140 | var animationX = new DoubleAnimation(transform.X, wordTranslationX + wordOffsetX, duration);
141 | var animationY = new DoubleAnimation(transform.Y, wordTranslationY, duration);
142 | transform.BeginAnimation(TranslateTransform.XProperty, animationX);
143 | transform.BeginAnimation(TranslateTransform.YProperty, animationY);
144 | }
145 | }
146 |
147 | private Point FindWordCenter(List letterQueue, int letterCount)
148 | {
149 | // For now, target centering the word at the average position of all its letters.
150 | var x = (from c in letterQueue select Canvas.GetLeft(c)).Reverse().Take(letterCount).Average();
151 | var y = (from c in letterQueue select Canvas.GetTop(c)).Reverse().Take(letterCount).Average();
152 | return new Point(x, y);
153 | }
154 |
155 | private Point FindWordSize(List letterQueue, int letterCount)
156 | {
157 | var x = (from c in letterQueue select c.Width).Reverse().Take(letterCount).Sum();
158 | var y = (from c in letterQueue select c.Height).Reverse().Take(letterCount).Max();
159 | return new Point(x, y);
160 | }
161 |
162 | private TranslateTransform FindOrAddTranslationTransform(TransformGroup transformGroup)
163 | {
164 | var translationTransform = (from t in transformGroup.Children
165 | where t is TranslateTransform
166 | select t).FirstOrDefault() as TranslateTransform;
167 | if (translationTransform == null)
168 | {
169 | translationTransform = new TranslateTransform();
170 | transformGroup.Children.Add(translationTransform);
171 | }
172 |
173 | return translationTransform;
174 | }
175 | }
176 | }
--------------------------------------------------------------------------------
/BabySmash.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | 9.0.30729
7 | 2.0
8 | {FB378E07-FDE4-4FC7-9210-68F80B561164}
9 | WinExe
10 | Properties
11 | BabySmash
12 | BabySmash
13 | v3.5
14 | 512
15 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
16 | 4
17 | E4355A6B46BE61300D217B56C346651E03BEB47F
18 | private.pfx
19 | true
20 | true
21 | false
22 | App.ico
23 |
24 |
25 | 3.5
26 |
27 |
28 | C:\Users\Scott\Desktop\babysmashWithEric\
29 | true
30 | Disk
31 | true
32 | Foreground
33 | 7
34 | Days
35 | false
36 | false
37 | true
38 | http://www.hanselman.com/BabySmash/
39 | http://feedback.babysmash.com
40 | BabySmash!
41 | BabySmash
42 | publish.htm
43 | 99
44 | 1.1.0.%2a
45 | false
46 | true
47 | true
48 |
49 |
50 | true
51 | full
52 | false
53 | bin\Debug\
54 | DEBUG;TRACE
55 | prompt
56 | 4
57 | x86
58 | AllRules.ruleset
59 | false
60 |
61 |
62 | pdbonly
63 | true
64 | bin\Release\
65 | TRACE
66 | prompt
67 | 4
68 | AllRules.ruleset
69 | false
70 |
71 |
72 |
73 |
74 |
75 |
76 | packages\Newtonsoft.Json.9.0.1\lib\net35\Newtonsoft.Json.dll
77 | True
78 |
79 |
80 | 3.0
81 |
82 |
83 |
84 | 3.5
85 |
86 |
87 |
88 |
89 |
90 |
91 | 3.5
92 |
93 |
94 | 3.5
95 |
96 |
97 |
98 |
99 | 3.0
100 |
101 |
102 | 3.0
103 |
104 |
105 | 3.0
106 |
107 |
108 | 3.0
109 |
110 |
111 | MSBuild:Compile
112 | Designer
113 |
114 |
115 | MSBuild:Compile
116 | Designer
117 |
118 |
119 | MSBuild:Compile
120 | Designer
121 |
122 |
123 | MSBuild:Compile
124 | Designer
125 |
126 |
127 | MSBuild:Compile
128 | Designer
129 |
130 |
131 | MSBuild:Compile
132 | Designer
133 |
134 |
135 | MSBuild:Compile
136 | Designer
137 |
138 |
139 | MSBuild:Compile
140 | Designer
141 |
142 |
143 | MSBuild:Compile
144 | Designer
145 |
146 |
147 | CoolCircle.xaml
148 |
149 |
150 | CoolHeart.xaml
151 |
152 |
153 | CoolHexagon.xaml
154 |
155 |
156 | CoolOval.xaml
157 |
158 |
159 | CoolSquare.xaml
160 |
161 |
162 | CoolStar.xaml
163 |
164 |
165 | CoolTrapezoid.xaml
166 |
167 |
168 | FunCursor1.xaml
169 |
170 |
171 |
172 |
173 | MSBuild:Compile
174 | Designer
175 |
176 |
177 | MSBuild:Compile
178 | Designer
179 |
180 |
181 | MSBuild:Compile
182 | Designer
183 |
184 |
185 | MSBuild:Compile
186 | Designer
187 |
188 |
189 | MSBuild:Compile
190 | Designer
191 |
192 |
193 | MSBuild:Compile
194 | Designer
195 |
196 |
197 | MSBuild:Compile
198 | Designer
199 |
200 |
201 | App.xaml
202 | Code
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 | CoolTriangle.xaml
211 |
212 |
213 | CoolLetter.xaml
214 |
215 |
216 |
217 | MainWindow.xaml
218 |
219 |
220 | Options.xaml
221 |
222 |
223 | Code
224 |
225 |
226 | True
227 | True
228 | Resources.resx
229 |
230 |
231 | True
232 | Settings.settings
233 | True
234 |
235 |
236 |
237 |
238 | CoolRectangle.xaml
239 |
240 |
241 | FunCursor2.xaml
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 | ResXFileCodeGenerator
251 | Resources.Designer.cs
252 | Designer
253 |
254 |
255 |
256 |
257 |
258 |
259 | SettingsSingleFileGenerator
260 | Settings.Designer.cs
261 |
262 |
263 |
264 | Always
265 |
266 |
267 | Always
268 |
269 |
270 |
271 |
272 | False
273 | .NET Framework Client Profile
274 | false
275 |
276 |
277 | False
278 | .NET Framework 2.0 %28x86%29
279 | false
280 |
281 |
282 | False
283 | .NET Framework 3.0 %28x86%29
284 | false
285 |
286 |
287 | False
288 | .NET Framework 3.5
289 | false
290 |
291 |
292 | False
293 | .NET Framework 3.5 SP1
294 | true
295 |
296 |
297 | False
298 | Windows Installer 4.5
299 | true
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 | PreserveNewest
336 |
337 |
338 |
339 |
346 |
347 |
350 |
--------------------------------------------------------------------------------
/Shapes/allShapes.xaml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
--------------------------------------------------------------------------------
/Words.txt:
--------------------------------------------------------------------------------
1 | AARAV
2 | AARON
3 | ABIGAIL
4 | ABLE
5 | ABOUT
6 | ABOVE
7 | ABRAHAM
8 | ACCEPT
9 | ACCEPTED
10 | ACCEPTING
11 | ACCEPTS
12 | ACORN
13 | ACORNS
14 | ACROSS
15 | ACT
16 | ACTED
17 | ACTING
18 | ACTOR
19 | ACTORS
20 | ACTS
21 | ADAM
22 | ADD
23 | ADDED
24 | ADDER
25 | ADDERS
26 | ADDING
27 | ADDS
28 | ADJECTIVE
29 | ADJECTIVES
30 | AFTER
31 | AGAIN
32 | AGAINST
33 | AGO
34 | AIDEN
35 | AIR
36 | AIRED
37 | AIRING
38 | AIRPLANE
39 | AIRPLANES
40 | AIRS
41 | ALEX
42 | ALEXIS
43 | ALFIE
44 | ALI
45 | ALICE
46 | ALL
47 | ALONG
48 | ALSO
49 | ALWAYS
50 | ALYSSA
51 | AM
52 | AMBER
53 | AMELIA
54 | AMELIE
55 | AMERICA
56 | AMONG
57 | AMY
58 | AN
59 | AND
60 | ANDREW
61 | ANIMAL
62 | ANIMALS
63 | ANNA
64 | ANOTHER
65 | ANSWER
66 | ANSWERED
67 | ANSWERING
68 | ANSWERS
69 | ANT
70 | ANTS
71 | ANY
72 | APPEAR
73 | APPEARED
74 | APPEARING
75 | APPEARS
76 | APPLE
77 | APPLES
78 | ARE
79 | AREA
80 | ARIA
81 | ARIANA
82 | AROUND
83 | ARTHUR
84 | AS
85 | ASK
86 | ASKED
87 | ASKING
88 | AT
89 | ATE
90 | AUDIO
91 | AUNT
92 | AUNTS
93 | AUSTIN
94 | AVA
95 | AVERY
96 | AWAY
97 | BABIES
98 | BABY
99 | BABYSMASH
100 | BACK
101 | BACKS
102 | BAD
103 | BALD
104 | BALL
105 | BAN
106 | BANANA
107 | BANANAS
108 | BANG
109 | BANNED
110 | BANNING
111 | BANS
112 | BAR
113 | BARD
114 | BARRED
115 | BARRING
116 | BARS
117 | BASE
118 | BASED
119 | BASES
120 | BASING
121 | BATTERIES
122 | BATTERY
123 | BE
124 | BEAR
125 | BEARING
126 | BEARS
127 | BEAUTIFUL
128 | BEAUTY
129 | BECAME
130 | BECAUSE
131 | BECOME
132 | BED
133 | BEDS
134 | BEE
135 | BEEN
136 | BEES
137 | BEFORE
138 | BEGAN
139 | BEGIN
140 | BEGUN
141 | BEHIND
142 | BELINDA
143 | BELL
144 | BELLA
145 | BELLS
146 | BEN
147 | BENEATH
148 | BENJAMIN
149 | BEST
150 | BETHANY
151 | BETTER
152 | BETWEEN
153 | BIG
154 | BIGGER
155 | BIGGEST
156 | BILL
157 | BILLED
158 | BILLING
159 | BILLS
160 | BIRD
161 | BIRDS
162 | BIRTH
163 | BIRTHDAY
164 | BIRTHDAYS
165 | BIRTHS
166 | BIRTS
167 | BLACK
168 | BLAKE
169 | BLUE
170 | BLUES
171 | BOAT
172 | BOATS
173 | BODIES
174 | BODY
175 | BOLT
176 | BOLTS
177 | BOOK
178 | BOOKED
179 | BOOKING
180 | BOOKS
181 | BOTH
182 | BOUGHT
183 | BOWL
184 | BOWLS
185 | BOX
186 | BOXED
187 | BOXES
188 | BOXING
189 | BOY
190 | BOYS
191 | BRANCH
192 | BRANCHED
193 | BRANCHES
194 | BRANCHING
195 | BREAD
196 | BREADED
197 | BREADS
198 | BRING
199 | BRINGS
200 | BROAD
201 | BROTHER
202 | BROTHERS
203 | BROUGHT
204 | BROWN
205 | BUILD
206 | BUILDING
207 | BUILDINGS
208 | BUILDS
209 | BUILT
210 | BUSIER
211 | BUSIEST
212 | BUSY
213 | BUT
214 | BUY
215 | BUYER
216 | BUYING
217 | BUYS
218 | BY
219 | BYE
220 | CAB
221 | CABLE
222 | CABLES
223 | CABS
224 | CAKE
225 | CAKED
226 | CAKES
227 | CALEB
228 | CALL
229 | CALLED
230 | CALLING
231 | CALLS
232 | CALLUM
233 | CAME
234 | CAMERON
235 | CAMP
236 | CAMPED
237 | CAMPER
238 | CAMPERS
239 | CAMPING
240 | CAN
241 | CANNOT
242 | CAR
243 | CARE
244 | CARED
245 | CAREFUL
246 | CAREFULLY
247 | CARES
248 | CARING
249 | CARRIES
250 | CARROT
251 | CARROTS
252 | CARRY
253 | CARS
254 | CARSON
255 | CASE
256 | CASTLE
257 | CASTLES
258 | CAT
259 | CATS
260 | CAUSE
261 | CAYLEE
262 | CELL
263 | CELLAR
264 | CELLARS
265 | CELLS
266 | CENT
267 | CENTER
268 | CENTS
269 | CENTURIES
270 | CENTURY
271 | CERTAIN
272 | CHAIR
273 | CHAIRS
274 | CHANGE
275 | CHANGES
276 | CHARLIE
277 | CHECK
278 | CHECKS
279 | CHEER
280 | CHEERED
281 | CHEERING
282 | CHEERS
283 | CHICKEN
284 | CHICKENS
285 | CHILD
286 | CHILDREN
287 | CHLOE
288 | CIRCLE
289 | CIRCLES
290 | CITIES
291 | CITY
292 | CLARA
293 | CLASS
294 | CLASSES
295 | CLEAN
296 | CLEAR
297 | CLEARED
298 | CLEARING
299 | CLEARS
300 | CLOSE
301 | CLOSED
302 | CLOSER
303 | CLOSES
304 | CLOSING
305 | CLOTHES
306 | COAT
307 | COATS
308 | CODE
309 | CODED
310 | CODER
311 | CODERS
312 | CODES
313 | CODING
314 | COLD
315 | COLDER
316 | COLDEST
317 | COLDS
318 | COLOR
319 | COLORED
320 | COLORFUL
321 | COLORING
322 | COLORS
323 | COME
324 | COMING
325 | COMMON
326 | COMPANY
327 | COMPLETE
328 | COMPLETED
329 | COMPLETING
330 | COMPUTED
331 | COMPUTER
332 | COMPUTERS
333 | COMPUTING
334 | CONNOR
335 | CONTAIN
336 | CONTAINS
337 | COOL
338 | COOLED
339 | COOLER
340 | COOLERS
341 | COOLING
342 | CORD
343 | CORDS
344 | CORN
345 | CORNS
346 | CORRECT
347 | CORRECTED
348 | CORRECTS
349 | COULD
350 | COUNTRIES
351 | COUNTRY
352 | COURSE
353 | COURSES
354 | COVER
355 | COVERED
356 | COVERS
357 | COW
358 | COWS
359 | CRAB
360 | CRABS
361 | CREEPY
362 | CRIED
363 | CRIER
364 | CRIES
365 | CROSS
366 | CROSSED
367 | CROSSING
368 | CRY
369 | CURSOR
370 | CURSORS
371 | CURSORY
372 | CURTAIN
373 | CURTAINS
374 | CUT
375 | CUTE
376 | CUTER
377 | CUTEST
378 | CUTS
379 | DAD
380 | DADDY
381 | DADS
382 | DAISY
383 | DANIEL
384 | DARK
385 | DAUGHTER
386 | DAUGHTERS
387 | DAVID
388 | DAY
389 | DAYS
390 | DECIDE
391 | DECIDED
392 | DECIDING
393 | DEEP
394 | DEEPER
395 | DENISE
396 | DESK
397 | DESKS
398 | DEVELOP
399 | DEVELOPER
400 | DEVELOPING
401 | DEVELOPS
402 | DEXTER
403 | DID
404 | DIFFER
405 | DIFFERENT
406 | DIRECT
407 | DISTANCE
408 | DISTANT
409 | DO
410 | DOES
411 | DOG
412 | DOGS
413 | DOLL
414 | DOLLAR
415 | DOLLARS
416 | DOLLS
417 | DONE
418 | DOOR
419 | DOORS
420 | DORA
421 | DOWN
422 | DRAGON
423 | DRAGONS
424 | DRAIN
425 | DRAINED
426 | DRAINING
427 | DRAINS
428 | DRANK
429 | DRAW
430 | DRAWS
431 | DRINK
432 | DRINKS
433 | DRIVE
434 | DRIVER
435 | DRIVES
436 | DRIVING
437 | DROVE
438 | DRY
439 | DUCK
440 | DUCKED
441 | DUCKING
442 | DUCKS
443 | DURING
444 | DYLAN
445 | EACH
446 | EARLY
447 | EARTH
448 | EASE
449 | EASES
450 | EASIER
451 | EASIEST
452 | EAST
453 | EASY
454 | EAT
455 | ED
456 | EDWARD
457 | EGG
458 | EGGS
459 | EIGHT
460 | EIGHTEEN
461 | EIGHTEENTH
462 | EIGHTH
463 | EIGHTY
464 | ELBOW
465 | ELBOWS
466 | ELEANOR
467 | ELEMENT
468 | ELEMENTS
469 | ELENA
470 | ELEVEN
471 | ELEVENTH
472 | ELI
473 | ELIJAH
474 | ELIOT
475 | ELIZA
476 | ELLA
477 | ELLIE
478 | ELLIS
479 | ELSA
480 | ELSIE
481 | EMILIA
482 | EMILY
483 | EMMA
484 | END
485 | ENDS
486 | ENGLISH
487 | ENOUGH
488 | EQUATE
489 | EQUATION
490 | ERIN
491 | ESME
492 | ETHAN
493 | EVA
494 | EVAN
495 | EVELYN
496 | EVEN
497 | EVER
498 | EVERY
499 | EVIE
500 | EXAMPLE
501 | EXPLAIN
502 | EYE
503 | EYES
504 | FACE
505 | FACES
506 | FACT
507 | FACTS
508 | FAITH
509 | FALL
510 | FAMILIAR
511 | FAMILIES
512 | FAMILY
513 | FAR
514 | FARM
515 | FARMER
516 | FARMERS
517 | FARMS
518 | FAST
519 | FASTER
520 | FASTEST
521 | FATHER
522 | FATHERS
523 | FEEL
524 | FEELING
525 | FEELINGS
526 | FEET
527 | FELIX
528 | FELL
529 | FELT
530 | FEW
531 | FIELD
532 | FIELDS
533 | FIFTEEN
534 | FIFTEENTH
535 | FIFTH
536 | FIFTY
537 | FIGURE
538 | FIGURED
539 | FIGURES
540 | FIGURING
541 | FILE
542 | FILED
543 | FILING
544 | FILL
545 | FILLED
546 | FILLER
547 | FILLERS
548 | FILLING
549 | FILLS
550 | FINAL
551 | FINALLY
552 | FIND
553 | FINDER
554 | FINDING
555 | FINDINGS
556 | FINE
557 | FINES
558 | FINGER
559 | FINGERS
560 | FINLEY
561 | FINN
562 | FIRE
563 | FIRES
564 | FIRST
565 | FISH
566 | FISHER
567 | FISHERY
568 | FISHES
569 | FIVE
570 | FLED
571 | FLEE
572 | FLIER
573 | FLIES
574 | FLIGHT
575 | FLIGHTS
576 | FLOOR
577 | FLOORS
578 | FLOPPY
579 | FLORENCE
580 | FLOW
581 | FLOWER
582 | FLOWERS
583 | FLOWS
584 | FLU
585 | FLUFF
586 | FLUFFY
587 | FLY
588 | FOLLOW
589 | FOLLOWED
590 | FOLLOWER
591 | FOLLOWERS
592 | FOLLOWING
593 | FOLLOWS
594 | FOOD
595 | FOODS
596 | FOOT
597 | FOR
598 | FORCE
599 | FORCED
600 | FORCES
601 | FORCING
602 | FORK
603 | FORKS
604 | FORM
605 | FORMS
606 | FORTY
607 | FOUND
608 | FOUR
609 | FOURTEEN
610 | FOURTEENTH
611 | FOURTH
612 | FRAME
613 | FRAMES
614 | FREDDIE
615 | FREE
616 | FREED
617 | FREEING
618 | FREES
619 | FREYA
620 | FRIDAY
621 | FRIEND
622 | FRIENDS
623 | FROM
624 | FRONT
625 | FULL
626 | FUN
627 | FUNNIER
628 | FUNNIEST
629 | FUNNY
630 | GABRIEL
631 | GAME
632 | GAMER
633 | GAMES
634 | GAMING
635 | GARDEN
636 | GARDENS
637 | GAVE
638 | GEORGE
639 | GEORGIA
640 | GET
641 | GIANT
642 | GIFT
643 | GIFTED
644 | GIFTING
645 | GIFTS
646 | GIRL
647 | GIRLS
648 | GIVE
649 | GIVER
650 | GIVING
651 | GO
652 | GOES
653 | GOLD
654 | GONE
655 | GOOD
656 | GOODS
657 | GOT
658 | GOVERN
659 | GOVERNMENT
660 | GRACE
661 | GRACIE
662 | GRAN
663 | GRANDDAD
664 | GRASS
665 | GREAT
666 | GREEN
667 | GROUND
668 | GROUNDS
669 | GROUP
670 | GROW
671 | GROWING
672 | GROWN
673 | GROWS
674 | GUARD
675 | GUARDED
676 | GUARDING
677 | GUARDS
678 | HAD
679 | HALF
680 | HAND
681 | HANDED
682 | HANDING
683 | HANDS
684 | HANDY
685 | HANNAH
686 | HAPPEN
687 | HAPPENED
688 | HAPPENING
689 | HAPPENS
690 | HAPPY
691 | HARD
692 | HARP
693 | HARPER
694 | HARPS
695 | HARRIET
696 | HARRISON
697 | HARRY
698 | HARVEY
699 | HAS
700 | HAT
701 | HATS
702 | HAVE
703 | HE
704 | HEAD
705 | HEADS
706 | HEAR
707 | HEARD
708 | HEARING
709 | HEARS
710 | HEART
711 | HEARTS
712 | HEAT
713 | HEATED
714 | HEATER
715 | HEATING
716 | HEATS
717 | HEAVY
718 | HELP
719 | HELPED
720 | HELPER
721 | HELPING
722 | HELPS
723 | HENRY
724 | HER
725 | HERE
726 | HERS
727 | HEXAGON
728 | HEXAGONS
729 | HIGH
730 | HILL
731 | HILLS
732 | HIM
733 | HIMSELF
734 | HIS
735 | HISTORY
736 | HOLD
737 | HOLLY
738 | HOME
739 | HOMES
740 | HORSE
741 | HORSES
742 | HOT
743 | HOTTER
744 | HOTTEST
745 | HOUR
746 | HOURS
747 | HOUSE
748 | HOUSES
749 | HOUSING
750 | HOUSINGS
751 | HOW
752 | HOWEVER
753 | HUDNRED
754 | HUGO
755 | HUNDRED
756 | HUNDREDS
757 | HUNTER
758 | HURT
759 | IBRAHIM
760 | IDEA
761 | IDEAS
762 | IF
763 | ILL
764 | IMOGEN
765 | IMPORTANT
766 | IN
767 | INCH
768 | INCHES
769 | INCLUDE
770 | INFINITY
771 | INSIDE
772 | INSIDER
773 | INSIDES
774 | INTEREST
775 | INTERESTED
776 | INTERESTING
777 | INTERESTS
778 | INTO
779 | IRIS
780 | IS
781 | ISAAC
782 | ISABELLA
783 | ISABELLE
784 | ISLA
785 | ISLAND
786 | ISLANDS
787 | ISSUE
788 | ISSUES
789 | IT
790 | ITS
791 | IVY
792 | JACK
793 | JACKSON
794 | JACOB
795 | JAKE
796 | JAMES
797 | JAMIE
798 | JASMINE
799 | JASON
800 | JASPER
801 | JAYDEN
802 | JAZZ
803 | JESSICA
804 | JILL
805 | JOANA
806 | JODI
807 | JOHN
808 | JOKE
809 | JOKED
810 | JOKER
811 | JOKERS
812 | JOKES
813 | JOKING
814 | JONATHAN
815 | JOSEPH
816 | JOSHUA
817 | JUDE
818 | JUMP
819 | JUMPED
820 | JUMPER
821 | JUMPING
822 | JUMPS
823 | JUST
824 | KAI
825 | KATIE
826 | KATY
827 | KAY
828 | KAYAK
829 | KAYAKS
830 | KAYLA
831 | KEEP
832 | KEPT
833 | KEY
834 | KEYBOARD
835 | KEYBOARDS
836 | KEYS
837 | KIAN
838 | KIND
839 | KINDS
840 | KING
841 | KINGS
842 | KITE
843 | KITES
844 | KITTY
845 | KNEW
846 | KNIFE
847 | KNIVES
848 | KNOW
849 | KNOWING
850 | KNOWN
851 | KNOWS
852 | KYLE
853 | LACEY
854 | LAND
855 | LANDED
856 | LANDING
857 | LANDS
858 | LANGUAGE
859 | LANGUAGES
860 | LARA
861 | LARGE
862 | LARGER
863 | LARGEST
864 | LAST
865 | LATE
866 | LATER
867 | LATEST
868 | LAUGH
869 | LAUGHED
870 | LAUGHING
871 | LAUGHS
872 | LAY
873 | LAYLA
874 | LEAD
875 | LEADS
876 | LEAH
877 | LEARN
878 | LEAVE
879 | LEAVES
880 | LEFT
881 | LEG
882 | LEGS
883 | LEO
884 | LEON
885 | LESS
886 | LET
887 | LETS
888 | LETTER
889 | LETTERS
890 | LEWIS
891 | LEXI
892 | LIAM
893 | LIFE
894 | LIFT
895 | LIFTED
896 | LIFTING
897 | LIFTS
898 | LIGHT
899 | LIKE
900 | LIKED
901 | LILY
902 | LINE
903 | LINED
904 | LINES
905 | LINING
906 | LININGS
907 | LIST
908 | LISTEN
909 | LISTENED
910 | LISTENER
911 | LISTENING
912 | LISTENS
913 | LITTLE
914 | LITTLER
915 | LITTLEST
916 | LIVE
917 | LIVED
918 | LIVES
919 | LIVING
920 | LNE
921 | LOGAN
922 | LOLA
923 | LONG
924 | LOOK
925 | LOOKED
926 | LOOKING
927 | LOOKS
928 | LOTTIE
929 | LOVE
930 | LOVED
931 | LOVES
932 | LOVING
933 | LOW
934 | LOWS
935 | LUCA
936 | LUCAS
937 | LUCY
938 | MACHINE
939 | MACHINES
940 | MADE
941 | MADISON
942 | MAIN
943 | MAISIE
944 | MAKE
945 | MAKES
946 | MAKING
947 | MAN
948 | MANY
949 | MAP
950 | MAPS
951 | MARCUS
952 | MARIA
953 | MARK
954 | MARKS
955 | MARYAM
956 | MASON
957 | MATERIAL
958 | MATILDA
959 | MATTHEW
960 | MAX
961 | MAY
962 | MAYA
963 | ME
964 | MEAN
965 | MEANS
966 | MEASURE
967 | MEASURED
968 | MEASURES
969 | MEASURING
970 | MEAT
971 | MEATS
972 | MEET
973 | MEETS
974 | MEGAN
975 | MEN
976 | METAL
977 | METALS
978 | MIA
979 | MICHAEL
980 | MIGHT
981 | MILA
982 | MILE
983 | MILK
984 | MILLIE
985 | MILO
986 | MIND
987 | MINDS
988 | MINUTE
989 | MINUTES
990 | MISS
991 | MISSED
992 | MISSES
993 | MISSING
994 | MOLLY
995 | MOM
996 | MOMMY
997 | MOMS
998 | MONDAY
999 | MONEY
1000 | MONTH
1001 | MONTHS
1002 | MOON
1003 | MOONS
1004 | MORE
1005 | MORNING
1006 | MOST
1007 | MOTHER
1008 | MOTHERS
1009 | MOUNTAIN
1010 | MOUNTAINS
1011 | MOVE
1012 | MOVED
1013 | MOVER
1014 | MOVES
1015 | MOVING
1016 | MUCH
1017 | MULTIPLY
1018 | MUM
1019 | MUSIC
1020 | MUST
1021 | MY
1022 | MYSELF
1023 | NAIL
1024 | NAILS
1025 | NAME
1026 | NAMES
1027 | NANA
1028 | NAOMI
1029 | NATHAN
1030 | NEAR
1031 | NECK
1032 | NECKLACE
1033 | NECKLACES
1034 | NECKS
1035 | NEED
1036 | NEEDED
1037 | NEEDING
1038 | NEEDS
1039 | NEST
1040 | NESTS
1041 | NEVER
1042 | NEW
1043 | NEWS
1044 | NEXT
1045 | NIAMH
1046 | NIGHT
1047 | NIGHTS
1048 | NINE
1049 | NINETEEN
1050 | NINETEENTH
1051 | NINETY
1052 | NINTH
1053 | NO
1054 | NOAH
1055 | NORTH
1056 | NOT
1057 | NOTE
1058 | NOTES
1059 | NOTHING
1060 | NOTICE
1061 | NOUN
1062 | NOUNS
1063 | NOW
1064 | NUMBER
1065 | NUMBERS
1066 | NUMERAL
1067 | OBJECT
1068 | OCEAN
1069 | OF
1070 | OFF
1071 | OFFICE
1072 | OFFICES
1073 | OFFICIAL
1074 | OFFICIALS
1075 | OFTEN
1076 | OH
1077 | OIL
1078 | OILS
1079 | OKAY
1080 | OLD
1081 | OLIVER
1082 | OLIVIA
1083 | OLLIE
1084 | OMAR
1085 | ON
1086 | ONCE
1087 | ONE
1088 | ONLY
1089 | OPEN
1090 | OPENED
1091 | OPENING
1092 | OPENS
1093 | OR
1094 | ORANGE
1095 | ORANGES
1096 | ORB
1097 | ORBIT
1098 | ORBITS
1099 | ORBS
1100 | ORDER
1101 | ORDERED
1102 | ORDERING
1103 | ORDERS
1104 | OSCAR
1105 | OTHER
1106 | OTHERS
1107 | OUR
1108 | OURS
1109 | OUT
1110 | OUTSIDE
1111 | OVAL
1112 | OVALS
1113 | OVER
1114 | OVERNMENT
1115 | OWEN
1116 | OWN
1117 | PAGE
1118 | PAGED
1119 | PAGER
1120 | PAGES
1121 | PAGING
1122 | PAINT
1123 | PAINTED
1124 | PAINTER
1125 | PAINTERS
1126 | PAINTING
1127 | PAINTINGS
1128 | PAINTS
1129 | PAIR
1130 | PAIRS
1131 | PALACE
1132 | PALACES
1133 | PANT
1134 | PANTS
1135 | PAPA
1136 | PAPER
1137 | PAPERS
1138 | PAPERWORK
1139 | PARK
1140 | PARKED
1141 | PARKER
1142 | PARKING
1143 | PARKS
1144 | PART
1145 | PARTED
1146 | PARTING
1147 | PARTS
1148 | PARTY
1149 | PASS
1150 | PASSED
1151 | PASSES
1152 | PASSING
1153 | PATTERN
1154 | PEN
1155 | PENCIL
1156 | PENCILS
1157 | PENNED
1158 | PENS
1159 | PEOPLE
1160 | PERSON
1161 | PHOEBE
1162 | PICK
1163 | PICKED
1164 | PICKER
1165 | PICKING
1166 | PICKS
1167 | PICTURE
1168 | PICTURED
1169 | PICTURES
1170 | PICTURING
1171 | PIECE
1172 | PIECED
1173 | PIECES
1174 | PIECING
1175 | PIG
1176 | PIGS
1177 | PIPE
1178 | PIPES
1179 | PLACE
1180 | PLACES
1181 | PLAIN
1182 | PLAINS
1183 | PLAN
1184 | PLANE
1185 | PLANES
1186 | PLANNED
1187 | PLANNER
1188 | PLANNING
1189 | PLANS
1190 | PLANT
1191 | PLANTED
1192 | PLANTER
1193 | PLANTERS
1194 | PLANTING
1195 | PLANTS
1196 | PLASTIC
1197 | PLASTICS
1198 | PLATE
1199 | PLATES
1200 | PLAY
1201 | PLAYED
1202 | PLAYER
1203 | PLAYING
1204 | PLAYS
1205 | PLEASE
1206 | POINT
1207 | POINTS
1208 | POPPY
1209 | PORT
1210 | PORTAGE
1211 | PORTING
1212 | PORTS
1213 | POSE
1214 | POSED
1215 | POSES
1216 | POSING
1217 | POSSIBLE
1218 | POUND
1219 | POUNDING
1220 | POUNDS
1221 | POWER
1222 | PREPOSITION
1223 | PREPOSITIONS
1224 | PRESENT
1225 | PRESENTS
1226 | PRESS
1227 | PRESSED
1228 | PRESSES
1229 | PRESSING
1230 | PRETTY
1231 | PROBLEM
1232 | PROBLEMS
1233 | PRODUCE
1234 | PRODUCED
1235 | PRODUCER
1236 | PRODUCES
1237 | PRODUCING
1238 | PRODUCT
1239 | PRODUCTS
1240 | PUBLIC
1241 | PUDDING
1242 | PUDDINGS
1243 | PULL
1244 | PULLED
1245 | PULLEY
1246 | PULLEYS
1247 | PULLS
1248 | PUT
1249 | PUTS
1250 | PUTTER
1251 | PUTTERS
1252 | PUTTING
1253 | QUEEN
1254 | QUEENS
1255 | QUESTION
1256 | QUESTIONED
1257 | QUESTIONING
1258 | QUESTIONS
1259 | QUICK
1260 | QUICKLY
1261 | QUIET
1262 | QUIETER
1263 | QUIETLY
1264 | QUIETS
1265 | RABBIT
1266 | RABBITS
1267 | RADIO
1268 | RADIOS
1269 | RAIL
1270 | RAILS
1271 | RAIN
1272 | RAINS
1273 | RAN
1274 | RANDY
1275 | REACH
1276 | REACHED
1277 | REACHES
1278 | REACHING
1279 | READ
1280 | READY
1281 | REALLY
1282 | REBECCA
1283 | RECORD
1284 | RECORDED
1285 | RECORDING
1286 | RECORDS
1287 | RECTANGLE
1288 | RECTANGLES
1289 | RED
1290 | REMEMBER
1291 | REMEMBERED
1292 | REMEMBERING
1293 | REMEMBERS
1294 | REMOVE
1295 | REMOVED
1296 | REMOVES
1297 | REMOVING
1298 | REST
1299 | RESTED
1300 | RESTING
1301 | RESTS
1302 | REUBEN
1303 | RIDE
1304 | RIDES
1305 | RIGHT
1306 | RIGHTS
1307 | RILEY
1308 | RING
1309 | RINGS
1310 | RIVER
1311 | RIVERS
1312 | ROAD
1313 | ROADS
1314 | ROBIN
1315 | ROBINS
1316 | ROBYN
1317 | ROCK
1318 | ROCKED
1319 | ROCKING
1320 | ROCKS
1321 | RODE
1322 | ROLL
1323 | ROLLS
1324 | RONDA
1325 | ROOM
1326 | ROOMS
1327 | RORY
1328 | ROSE
1329 | ROSIE
1330 | ROUND
1331 | RUBY
1332 | RULE
1333 | RULED
1334 | RULER
1335 | RULERS
1336 | RULES
1337 | RULING
1338 | RUN
1339 | RYAN
1340 | SAFE
1341 | SAFEST
1342 | SAFETY
1343 | SAID
1344 | SALE
1345 | SALES
1346 | SALON
1347 | SAM
1348 | SAME
1349 | SAMUEL
1350 | SANG
1351 | SARAH
1352 | SAT
1353 | SATURDAY
1354 | SAVE
1355 | SAVED
1356 | SAVES
1357 | SAVING
1358 | SAVINGS
1359 | SAW
1360 | SAWS
1361 | SAY
1362 | SCARLETT
1363 | SCHOOL
1364 | SCHOOLS
1365 | SCIENCE
1366 | SCIENCES
1367 | SCIENTISTS
1368 | SCOTT
1369 | SEA
1370 | SECOND
1371 | SECONDS
1372 | SEE
1373 | SEED
1374 | SEEDS
1375 | SEEING
1376 | SEEM
1377 | SEEN
1378 | SELF
1379 | SELL
1380 | SELLER
1381 | SELLING
1382 | SELVES
1383 | SENTENCE
1384 | SERVE
1385 | SET
1386 | SETH
1387 | SEVEN
1388 | SEVENTEEN
1389 | SEVENTEENTH
1390 | SEVENTH
1391 | SEVENTY
1392 | SEVERAL
1393 | SHALL
1394 | SHAPE
1395 | SHAPES
1396 | SHE
1397 | SHEEP
1398 | SHEPHERD
1399 | SHIP
1400 | SHIPPED
1401 | SHIPPING
1402 | SHIPS
1403 | SHIRT
1404 | SHIRTS
1405 | SHOE
1406 | SHOES
1407 | SHOP
1408 | SHOPPED
1409 | SHOPPER
1410 | SHOPPING
1411 | SHOPS
1412 | SHORT
1413 | SHORTS
1414 | SHOULD
1415 | SHOULDER
1416 | SHOULDERS
1417 | SHOW
1418 | SHOWN
1419 | SHUTTLE
1420 | SHUTTLES
1421 | SIDE
1422 | SIDED
1423 | SIDES
1424 | SIDING
1425 | SIENNA
1426 | SIGN
1427 | SILLIER
1428 | SILLIEST
1429 | SILLY
1430 | SIMON
1431 | SINCE
1432 | SING
1433 | SISTER
1434 | SISTERS
1435 | SIT
1436 | SIX
1437 | SIXTEEN
1438 | SIXTEENTH
1439 | SIXTH
1440 | SIXTY
1441 | SIZE
1442 | SKIRT
1443 | SKIRTS
1444 | SKYE
1445 | SLEEP
1446 | SLOW
1447 | SLOWER
1448 | SLOWEST
1449 | SLOWLY
1450 | SMALL
1451 | SMALLER
1452 | SMALLEST
1453 | SMASH
1454 | SMASHED
1455 | SMASHES
1456 | SMASHING
1457 | SNAKE
1458 | SNAKES
1459 | SNOW
1460 | SNOWS
1461 | SO
1462 | SOCK
1463 | SOCKS
1464 | SOME
1465 | SON
1466 | SONG
1467 | SONGS
1468 | SONS
1469 | SOON
1470 | SOPHIA
1471 | SOPHIE
1472 | SOUND
1473 | SOUNDS
1474 | SOUTH
1475 | SPACE
1476 | SPACES
1477 | SPACING
1478 | SPECIAL
1479 | SPEED
1480 | SPEEDS
1481 | SPELL
1482 | SPELLED
1483 | SPELLING
1484 | SPELLS
1485 | SPOON
1486 | SPOONS
1487 | SPORK
1488 | SPORT
1489 | SPORTING
1490 | SPORTS
1491 | SQUARE
1492 | SQUARES
1493 | SQUIRREL
1494 | SQUIRRELS
1495 | STAND
1496 | STANLEY
1497 | STAR
1498 | STARS
1499 | START
1500 | STARTS
1501 | STATE
1502 | STATED
1503 | STATES
1504 | STATING
1505 | STAY
1506 | STAYED
1507 | STAYING
1508 | STAYS
1509 | STEAD
1510 | STEP
1511 | STEPPED
1512 | STEPPING
1513 | STEPS
1514 | STICK
1515 | STICKS
1516 | STILL
1517 | STING
1518 | STINGS
1519 | STOOD
1520 | STOP
1521 | STOPPED
1522 | STOPPER
1523 | STOPPING
1524 | STOPS
1525 | STORIES
1526 | STORY
1527 | STREET
1528 | STREETS
1529 | STRING
1530 | STRINGS
1531 | STRONG
1532 | STRONGER
1533 | STRONGEST
1534 | STUDIED
1535 | STUDIES
1536 | STUDY
1537 | STUMP
1538 | STUMPS
1539 | SUCH
1540 | SUDDEN
1541 | SUDDENLY
1542 | SUMMER
1543 | SUN
1544 | SUNDAY
1545 | SURE
1546 | SURFACE
1547 | SURFACED
1548 | SURFACES
1549 | SURFACING
1550 | SYSTEM
1551 | SYSTEMS
1552 | TABLE
1553 | TABLES
1554 | TAIL
1555 | TAILS
1556 | TAKE
1557 | TALE
1558 | TALES
1559 | TALK
1560 | TALKED
1561 | TALKER
1562 | TALKING
1563 | TALKS
1564 | TAUGHT
1565 | TEA
1566 | TEACH
1567 | TEACHER
1568 | TEACHERS
1569 | TEACHES
1570 | TEACHING
1571 | TEDDY
1572 | TELEVISION
1573 | TELL
1574 | TELLER
1575 | TELLING
1576 | TELLS
1577 | TEN
1578 | TENTH
1579 | TERRI
1580 | TEST
1581 | TESTS
1582 | THAN
1583 | THANK
1584 | THANKS
1585 | THAT
1586 | THE
1587 | THEA
1588 | THEIR
1589 | THEM
1590 | THEN
1591 | THEO
1592 | THERE
1593 | THERES
1594 | THESE
1595 | THEY
1596 | THIN
1597 | THING
1598 | THINGS
1599 | THINK
1600 | THINKER
1601 | THINKING
1602 | THIRD
1603 | THIRTEEN
1604 | THIRTEENTH
1605 | THIRTY
1606 | THIS
1607 | THOMAS
1608 | THOSE
1609 | THOUGH
1610 | THOUGHT
1611 | THOUGHTS
1612 | THOUSAND
1613 | THOUSANDS
1614 | THREE
1615 | THROUGH
1616 | THURSDAY
1617 | TIME
1618 | TIMED
1619 | TIMER
1620 | TIMES
1621 | TIMING
1622 | TIRE
1623 | TIRED
1624 | TIRES
1625 | TIRING
1626 | TISSUE
1627 | TISSUES
1628 | TO
1629 | TOBY
1630 | TODAY
1631 | TOE
1632 | TOES
1633 | TOGETHER
1634 | TOLD
1635 | TOMMY
1636 | TOMORROW
1637 | TOO
1638 | TOOK
1639 | TOP
1640 | TOPS
1641 | TOUR
1642 | TOURS
1643 | TOWARD
1644 | TOWEL
1645 | TOWELS
1646 | TOWN
1647 | TOWNS
1648 | TOY
1649 | TOYS
1650 | TRAIN
1651 | TRAINS
1652 | TRAPEZOID
1653 | TRAPEZOIDS
1654 | TRAVEL
1655 | TRAVELS
1656 | TREE
1657 | TREES
1658 | TRIANGLE
1659 | TRIANGLES
1660 | TRIED
1661 | TRIES
1662 | TRIP
1663 | TRIPPED
1664 | TRIPPING
1665 | TRIPS
1666 | TRUE
1667 | TRUST
1668 | TRUSTED
1669 | TRUSTING
1670 | TRUSTS
1671 | TRY
1672 | TUESDAY
1673 | TURN
1674 | TV
1675 | TWELFTH
1676 | TWELVE
1677 | TWENTIETH
1678 | TWENTY
1679 | TWIN
1680 | TWINKLE
1681 | TWINKLES
1682 | TWINS
1683 | TWO
1684 | TYLER
1685 | UNDER
1686 | UNDERSTAND
1687 | UNDERSTANDING
1688 | UNDERSTANDS
1689 | UNDERSTOOD
1690 | UNIT
1691 | UNTIL
1692 | UP
1693 | UPON
1694 | US
1695 | USE
1696 | USED
1697 | USER
1698 | USERS
1699 | USES
1700 | USING
1701 | USUAL
1702 | USUALLY
1703 | VERB
1704 | VERBS
1705 | VERY
1706 | VIOLET
1707 | VOICE
1708 | VOWEL
1709 | VOWELS
1710 | WAIT
1711 | WAITS
1712 | WALK
1713 | WANT
1714 | WAR
1715 | WARM
1716 | WARMER
1717 | WARMERS
1718 | WARMEST
1719 | WARMS
1720 | WARS
1721 | WAS
1722 | WASH
1723 | WASHED
1724 | WASHER
1725 | WASHES
1726 | WATCH
1727 | WATCHED
1728 | WATCHES
1729 | WATCHING
1730 | WATER
1731 | WATERS
1732 | WAVE
1733 | WAVED
1734 | WAVER
1735 | WAVERS
1736 | WAVES
1737 | WAVING
1738 | WAY
1739 | WAYS
1740 | WE
1741 | WEDNESDAY
1742 | WEEK
1743 | WEEKS
1744 | WELL
1745 | WELLS
1746 | WENT
1747 | WERE
1748 | WEST
1749 | WHAT
1750 | WHEEL
1751 | WHEELS
1752 | WHEN
1753 | WHERE
1754 | WHICH
1755 | WHITE
1756 | WHO
1757 | WHOLE
1758 | WHY
1759 | WILL
1760 | WILLIAM
1761 | WILLOW
1762 | WIND
1763 | WINDOW
1764 | WINDOWS
1765 | WINDS
1766 | WISH
1767 | WISHED
1768 | WISHES
1769 | WISHING
1770 | WITH
1771 | WOMAN
1772 | WOMEN
1773 | WONDER
1774 | WONDERFUL
1775 | WONDERING
1776 | WONDERS
1777 | WOOD
1778 | WOODS
1779 | WORD
1780 | WORDS
1781 | WORM
1782 | WORMS
1783 | WORK
1784 | WORKED
1785 | WORKER
1786 | WORKERS
1787 | WORKING
1788 | WORKS
1789 | WORLD
1790 | WORLDS
1791 | WOULD
1792 | WRITE
1793 | WRITES
1794 | WRITING
1795 | WRITINGS
1796 | WROTE
1797 | YEAR
1798 | YEARS
1799 | YELLOW
1800 | YES
1801 | YESTERDAY
1802 | YET
1803 | YOU
1804 | YOUNG
1805 | YOUR
1806 | ZACHARY
1807 | ZARA
1808 | ZEBRA
1809 | ZEBRAS
1810 | ZOE
--------------------------------------------------------------------------------