[Commits] typing-turtle branch master updated.

Wade Brainerd wadetb at gmail.com
Tue Jan 6 22:14:12 EST 2009


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "/home/olpc-code/git/activities/typing-turtle".

The branch, master has been updated
       via  c16b9c84ee9848da90259c5d74a3b02d2b2395e1 (commit)
      from  c903bb07c07bde142202ce09093b7651f00928cb (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

 balloongame.py                    |  264 +++++++++++++++++++++++++++++++++++++
 lessonbuilder                     |  256 +++++++++++++++--------------------
 lessons/en_US/MAKETESTLESSONS     |    8 +
 lessons/en_US/bottomrow.lesson    |    2 +-
 lessons/en_US/homerow.lesson      |    2 +-
 lessons/en_US/intro.lesson        |    2 +-
 lessons/en_US/leftcapital.lesson  |    2 +-
 lessons/en_US/rightcapital.lesson |    2 +-
 lessons/en_US/test.lesson         |    2 +-
 lessons/en_US/toprow.lesson       |    2 +-
 lessonscreen.py                   |    4 +-
 mainscreen.py                     |    9 +-
 12 files changed, 397 insertions(+), 158 deletions(-)
 create mode 100644 balloongame.py

- Log -----------------------------------------------------------------
commit c16b9c84ee9848da90259c5d74a3b02d2b2395e1
Author: Wade Brainerd <wadetb at gmail.com>
Date:   Wed Jan 7 03:13:56 2009 +0000

    Progress toward release.

diff --git a/balloongame.py b/balloongame.py
new file mode 100644
index 0000000..a32fe0f
--- /dev/null
+++ b/balloongame.py
@@ -0,0 +1,264 @@
+# Copyright 2008 by Kate Scheppke and Wade Brainerd.  
+# This file is part of Typing Turtle.
+#
+# Typing Turtle is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# Typing Turtle is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with Typing Turtle.  If not, see <http://www.gnu.org/licenses/>.
+
+import random
+from gettext import gettext as _
+
+import gobject, pygtk, gtk, pango
+
+# Each 'stage' contains a certain number of balloons as well as
+# parameters about them.
+BALLOON_STAGES = [
+    { 'count': 10, 'delay': 80 },
+#    { 'count': 20, 'delay': 40 },
+#    { 'count': 80, 'delay': 20 },
+#    { 'count': 100, 'delay': 10 },
+]
+
+class Balloon:
+    def __init__(self, x, y, vx, vy, word):
+        self.x = x
+        self.y = y
+        self.vx = vx
+        self.vy = vy
+        self.word = word
+    
+class BalloonGame(gtk.VBox):
+    def __init__(self, lesson, activity):
+        gtk.VBox.__init__(self)
+        
+        self.lesson = lesson
+        self.activity = activity
+        
+        # Build title bar.
+        title = gtk.Label()
+        title.set_markup("<span size='20000'><b>" + lesson['name'] + "</b></span>")
+        title.set_alignment(1.0, 0.0)
+        
+        stoplabel = gtk.Label(_('Go Back'))
+        stopbtn =  gtk.Button()
+        stopbtn.add(stoplabel)
+        stopbtn.connect('clicked', self.stop_cb)
+        
+        hbox = gtk.HBox()
+        hbox.pack_start(stopbtn, False, False, 10)
+        hbox.pack_end(title, False, False, 10)
+        
+        # Build the game drawing area.
+        self.area = gtk.DrawingArea()
+        self.area.modify_bg(gtk.STATE_NORMAL, self.get_colormap().alloc_color('#ffffff'))
+        self.area.connect("expose-event", self.expose_cb)
+
+        # Connect keyboard grabbing and releasing callbacks.        
+        self.area.connect('realize', self.realize_cb)
+        self.area.connect('unrealize', self.unrealize_cb)
+
+        self.pack_start(hbox, False, False, 10)
+        self.pack_start(self.area, True, True)
+        
+        self.show_all()
+        
+        # Initialize the game data.
+        self.balloons = []
+
+        self.score = 0
+        self.spawn_delay = 10
+
+        self.stage_idx = 0
+        self.stage = BALLOON_STAGES[self.stage_idx]
+        self.count_left = self.stage['count']
+
+        self.finished = False
+
+        # Start the animation loop running.        
+        self.update_timer = gobject.timeout_add(20, self.tick)
+    
+    def realize_cb(self, widget):
+        self.activity.add_events(gtk.gdk.KEY_PRESS_MASK)
+        self.key_press_cb_id = self.activity.connect('key-press-event', self.key_cb)
+
+        # Clear the mouse cursor. 
+        #pixmap = gtk.gdk.Pixmap(self.activity.window, 1, 1)
+        #color = gtk.gdk.Color()
+        #cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
+        #self.area.window.set_cursor(cursor)
+        
+    def unrealize_cb(self, widget):
+        self.activity.disconnect(self.key_press_cb_id)
+    
+    def stop_cb(self, widget):
+        # Stop the animation loop.
+        if self.update_timer:
+            gobject.source_remove(self.update_timer)
+        
+        self.activity.pop_screen()
+
+    def key_cb(self, widget, event):
+        # Ignore hotkeys.
+        if event.state & (gtk.gdk.CONTROL_MASK | gtk.gdk.MOD1_MASK):
+            return False
+
+        # Extract information about the key pressed.
+        key = gtk.gdk.keyval_to_unicode(event.keyval)
+        if key != 0: key = unichr(key)
+
+        if self.finished:
+            key_name = gtk.gdk.keyval_name(event.keyval)
+            if key_name == 'Return':
+                self.activity.pop_screen()
+
+        else:
+            for b in self.balloons:
+                if b.word[0] == key:
+                    b.word = b.word[1:]
+                    self.score += 10
+
+                    # Pop the balloon if it's been typed.
+                    if len(b.word) == 0:
+                        self.balloons.remove(b)
+                        self.score += 100
+        
+        return False
+    
+    def update_balloon(self, b):
+        b.x += b.vx
+        b.y += b.vy 
+
+        if b.x < 100 or b.x >= self.bounds.width - 100:
+            b.vx = -b.vx
+
+        if b.y < -100:
+            self.balloons.remove(b)
+    
+    def tick(self):
+        if self.finished:
+            return
+
+        self.bounds = self.area.get_allocation()
+            
+        for b in self.balloons:
+            self.update_balloon(b)
+
+        self.spawn_delay -= 1
+        if self.spawn_delay <= 0:
+            self.count_left -= 1
+
+            if self.count_left <= 0:
+                self.stage_idx += 1
+
+                if self.stage_idx < len(BALLOON_STAGES):
+                    self.stage = BALLOON_STAGES[self.stage_idx]
+                    self.count_left = self.stage['count']
+
+            else:
+                word = random.choice(self.lesson['words'])
+
+                x = random.randint(100, self.bounds.width - 100)
+                y = self.bounds.height + 100
+
+                vx = random.uniform(-2, 2)
+                vy = random.uniform(-5, -3)
+
+                b = Balloon(x, y, vx, vy, word)
+                self.balloons.append(b)
+
+                delay = self.stage['delay']
+                self.spawn_delay = random.randint(delay-20, delay+20)
+
+        if len(self.balloons) == 0 and self.stage_idx >= len(BALLOON_STAGES):
+            self.finished = True
+ 
+        self.queue_draw()
+
+        return True
+
+    def draw_results(self, gc):
+        # Draw background.
+        w = self.bounds.width - 400
+        h = self.bounds.height - 200
+        x = self.bounds.width/2 - w/2
+        y = self.bounds.height/2 - h/2
+
+        gc.foreground = self.area.get_colormap().alloc_color(50000,50000,50000)
+        self.area.window.draw_rectangle(gc, True, x, y, w, h)
+        gc.foreground = self.area.get_colormap().alloc_color(0,0,0)
+        self.area.window.draw_rectangle(gc, False, x, y, w, h)
+
+        # Draw text
+        report = _('You finished!\n\nYour score was %(score)d.') % \
+            { 'score': self.score }
+    
+        gc.foreground = self.area.get_colormap().alloc_color(0,0,0)
+        layout = self.area.create_pango_layout(report)
+        layout.set_font_description(pango.FontDescription('Times 14'))    
+        size = layout.get_size()
+        tx = x+w/2-(size[0]/pango.SCALE)/2
+        ty = y+h/2-(size[1]/pango.SCALE)/2
+        self.area.window.draw_layout(gc, tx, ty, layout)
+
+    def draw_balloon(self, gc, b):
+        x = int(b.x)
+        y = int(b.y)
+        
+        # Draw the balloon.
+        gc.foreground = self.area.get_colormap().alloc_color(65535,0,0)
+        self.area.window.draw_arc(gc, True, x-50, y-50, 100, 100, 0, 360*64)
+    
+        # Draw the text.
+        gc.foreground = self.area.get_colormap().alloc_color(0,0,0)
+        layout = self.area.create_pango_layout(b.word)
+        size = layout.get_size()
+        tx = x-(size[0]/pango.SCALE)/2
+        ty = y-(size[1]/pango.SCALE)/2
+        self.area.window.draw_layout(gc, tx, ty, layout)
+
+    def draw(self):
+        self.bounds = self.area.get_allocation()
+
+        gc = self.area.window.new_gc()
+        
+        # Draw background.
+        #gc.foreground = self.area.get_colormap().alloc_color(65535,65535,65535)
+        #self.area.window.draw_rectangle(gc, True, 0, 0, bounds.width, bounds.height)
+
+        # Draw the balloons.
+        for b in self.balloons:
+            self.draw_balloon(gc, b)
+
+        if self.finished:
+            self.draw_results(gc)
+
+        else:
+            # Draw instructions.
+            gc.foreground = self.area.get_colormap().alloc_color(0,0,0)
+
+            layout = self.area.create_pango_layout(_('Type the words to pop the balloons!'))
+            layout.set_font_description(pango.FontDescription('Times 14'))    
+            size = layout.get_size()
+            x = (self.bounds.width - size[0]/pango.SCALE)/2
+            y = self.bounds.height-20 - size[1]/pango.SCALE 
+            self.area.window.draw_layout(gc, x, y, layout)
+
+            # Draw score.
+            layout = self.area.create_pango_layout(_('SCORE: %d') % self.score)
+            layout.set_font_description(pango.FontDescription('Times 14'))    
+            size = layout.get_size()
+            x = self.bounds.width-20-size[0]/pango.SCALE
+            y = 20
+            self.area.window.draw_layout(gc, x, y, layout)
+
+    def expose_cb(self, area, event):
+        self.draw()
diff --git a/lessonbuilder b/lessonbuilder
index 678c61f..7530e79 100755
--- a/lessonbuilder
+++ b/lessonbuilder
@@ -269,22 +269,31 @@ def make_random_words(words, required_keys, keys, count):
         text += random.choice(words) + ' '
     return text.strip()
 
-def add_step(lesson, instructions, mode, text):
+def make_step(instructions, mode, text):
     print instructions
     print text
     step = {}
     step['instructions'] = instructions
     step['text'] = text
     step['mode'] = mode
-    lesson['steps'].append(step)
+    return step
 
-def build_lesson(
-    name, description, 
-    order,
+def build_game_words(
     new_keys, base_keys, 
     words, bad_words):
 
-    print "Building lesson '%s'..." % name
+    all_keys = new_keys + base_keys
+
+    good_words = filter_wordlist(words=words, 
+        all_keys=all_keys, req_keys=new_keys, 
+        minlen=2, maxlen=8, 
+        bad_words=bad_words)
+    
+    return good_words 
+
+def build_key_steps(
+    new_keys, base_keys, 
+    words, bad_words):
 
     all_keys = new_keys + base_keys
 
@@ -295,16 +304,7 @@ def build_lesson(
     
     pairs = get_pairs_from_wordlist(words)
         
-    lesson = {}
-    lesson['name'] = name
-    lesson['description'] = description
-    lesson['order'] = order
-    lesson['medals'] = [
-        { 'name': 'bronze', 'wpm': 5,  'accuracy': 60 },
-        { 'name': 'silver', 'wpm': 10, 'accuracy': 75 },
-        { 'name': 'gold',   'wpm': 20, 'accuracy': 90 }
-    ]
-    lesson['steps'] = []
+    steps = []
 
     kb = keyboard.KeyboardData()
     kb.set_layout(keyboard.DEFAULT_LAYOUT)
@@ -317,10 +317,10 @@ def build_lesson(
     else:
         keynames += _(' key')
 
-    add_step(lesson,
-        _('Welcome to the %(name)s lesson!\n\nIn this lesson, you will learn the %(keynames)s.  Press the ENTER key when you are ready to begin!') \
-            % { 'name': name, 'keynames': keynames },
-        'key', '\n')
+    steps.append(make_step(
+        _('In this lesson, you will learn the %(keynames)s.\n\nPress the ENTER key when you are ready to begin!') \
+            % { 'keynames': keynames },
+        'key', '\n'))
 
     for letter in new_keys:
         key, state, group = kb.get_key_state_group_for_letter(letter)
@@ -348,87 +348,72 @@ def build_lesson(
         else:
             instructions = _('Press the %(letter)s key with your %(finger)s finger.') % { 'letter': letter, 'finger': finger }
 
-        add_step(lesson, instructions, 'key', letter)
+        steps.append(make_step(instructions, 'key', letter))
 
-    add_step(lesson,
+    steps.append(make_step(
         get_congrats() + _('Practice typing the keys you just learned.'),
-        'text', make_random_doubles(new_keys, count=40))
+        'text', make_random_doubles(new_keys, count=40)))
     
-    add_step(lesson,
+    steps.append(make_step(
         _('Keep practicing the new keys.'),
-        'text', make_random_doubles(new_keys, count=40))
+        'text', make_random_doubles(new_keys, count=40)))
     
-    add_step(lesson,
+    steps.append(make_step(
         get_congrats() + _('Now put the keys together into pairs.'),
-        'text', make_weighted_wordlist_pairs(pairs, new_keys, new_keys, count=50))
+        'text', make_weighted_wordlist_pairs(pairs, new_keys, new_keys, count=50)))
     
-    add_step(lesson,
+    steps.append(make_step(
         _('Keep practicing key pairs.'),
-        'text', make_weighted_wordlist_pairs(pairs, new_keys, new_keys, count=50))
+        'text', make_weighted_wordlist_pairs(pairs, new_keys, new_keys, count=50)))
     
     if base_keys != '':
-        add_step(lesson,
+        steps.append(make_step(
             get_congrats() + _('Now practice all the keys you know.'),
-            'text', make_weighted_wordlist_pairs(pairs, new_keys, all_keys, count=50))
+            'text', make_weighted_wordlist_pairs(pairs, new_keys, all_keys, count=50)))
     
-        add_step(lesson,
+        steps.append(make_step(
             _('Almost done.  Keep practicing all the keys you know.'),
-            'text', make_weighted_wordlist_pairs(pairs, new_keys, all_keys, count=50))
+            'text', make_weighted_wordlist_pairs(pairs, new_keys, all_keys, count=50)))
 
     else:
-        add_step(lesson,
+        steps.append(make_step(
             _('Almost done.  Keep practicing key pairs.'),
-            'text', make_weighted_wordlist_pairs(pairs, new_keys, new_keys, count=100))
+            'text', make_weighted_wordlist_pairs(pairs, new_keys, new_keys, count=100)))
 
     if len(good_words) == 0:
-        add_step(lesson,
+        steps.append(make_step(
             get_congrats() + _('Time to type jumbles.'),
-            'text', make_jumbles(new_keys, all_keys, 100, 5))
+            'text', make_jumbles(new_keys, all_keys, 100, 5)))
         
-        add_step(lesson,
+        steps.append(make_step(
             _('Keep practicing these jumbles.'),
-            'text', make_jumbles(new_keys, all_keys, 100, 5))
+            'text', make_jumbles(new_keys, all_keys, 100, 5)))
         
-        add_step(lesson,
+        steps.append(make_step(
             _('Almost finished. Try to type as quickly and accurately as you can!'),
-            'text', make_jumbles(new_keys, all_keys, 100, 5))
+            'text', make_jumbles(new_keys, all_keys, 100, 5)))
     
     else:
-        add_step(lesson,
+        steps.append(make_step(
             get_congrats() + _('Time to type real words.'),
-            'text', make_random_words(good_words, new_keys, all_keys, count=100))
+            'text', make_random_words(good_words, new_keys, all_keys, count=100)))
         
-        add_step(lesson,
+        steps.append(make_step(
             _('Keep practicing these words.'),
-            'text', make_random_words(good_words, new_keys, all_keys, count=100))
+            'text', make_random_words(good_words, new_keys, all_keys, count=100)))
         
-        add_step(lesson,
+        steps.append(make_step(
             _('Almost finished. Try to type as quickly and accurately as you can!'),
-            'text', make_random_words(good_words, new_keys, all_keys, count=200))
+            'text', make_random_words(good_words, new_keys, all_keys, count=200)))
     
     text = '$report'
-    add_step(lesson, text, 'key', '\n')
+    steps.append(make_step(text, 'key', ' '))
 
-    return lesson
+    return steps 
 
-def write_lesson(filename, lesson):
-    code = locale.getlocale(locale.LC_ALL)[0]
-    text = json.write(lesson)
-    open(os.path.join('lessons', code, filename), 'w').write(text)   
+def build_intro_steps():
+    steps = []
 
-def build_intro_lesson():
-    lesson = {}
-    lesson['name'] = _('Welcome') 
-    lesson['description'] = _('Click here to begin your typing adventure.') 
-    lesson['order'] = 0
-    lesson['report'] = 'simple'
-    lesson['medals'] = [
-        { 'name': 'bronze', 'wpm': 0, 'accuracy': 10 },
-        { 'name': 'silver', 'wpm': 0, 'accuracy': 70 },
-        { 'name': 'gold', 'wpm': 0, 'accuracy': 100 }
-    ]
-    lesson['steps'] = []
-    
     text = ''
     text += _('Hi, welcome to Typing Turtle!  My name is Max the turtle, ')
     text += _('and I\'ll to teach you how to type.\n\n')
@@ -437,25 +422,25 @@ def build_intro_lesson():
     text += _('If you learn which finger presses each key, and keep practicing, you will be typing like a pro before you know it!\n\n')
     text += _('Now, place your hands on the keyboard just like the picture below.\n')
     text += _('When you\'re ready, press the SPACE bar with your thumb!')
-    add_step(lesson, text, 'key', ' ')
+    steps.append(make_step(text, 'key', ' '))
 
     text = ''
     text += _('Good job!  You correctly typed your first key.  When typing, the SPACE bar is ')
     text += _('used to insert blank spaces between words.\n\n')
     text += _('Press the SPACE bar again with your thumb.')
-    add_step(lesson, text, 'key', ' ')
+    steps.append(make_step(text, 'key', ' '))
     
     text = ''
     text += _('Now I\'ll teach you the second key, ENTER.  ')
     text += _('That\'s the big square key near your right little finger.\n\n')
     text += _('Without moving any other fingers, reach your little finger over and press ')
     text += _('ENTER.\nCheck the picture below if you need a hint!')
-    add_step(lesson, text, 'key', '\n')
+    steps.append(make_step(text, 'key', '\n'))
     
     text = ''
     text += _('Great!  When typing, the ENTER key is used to begin a new line.\n\n')
     text += _('Press the ENTER key again with your right little finger.')
-    add_step(lesson, text, 'key', '\n')
+    steps.append(make_step(text, 'key', '\n'))
     
     text = ''
     text += _('Wonderful!  Now I\'m going to tell you a little more about Typing Turtle.\n\n')
@@ -465,87 +450,56 @@ def build_intro_lesson():
     text += _('When you see a big picture of a key like this one, you are supposed to ')
     text += _('press that key on the keyboard.\nRemember, always use the correct finger to ')
     text += _('type each key!')
-    add_step(lesson, text, 'key', ' ')
+    steps.append(make_step(text, 'key', ' '))
 
     text = '$report'
-    add_step(lesson, text, 'key', '\n')
+    steps.append(make_step(text, 'key', '\n'))
 
-    return lesson
+    return steps 
 
-# Note to myself.
-#
-# From looking at the real keyboard layouts, this path (--make-all-lessons) is foolish.
-# Differrent languages invoke different sets of keys with different sets of shifts, so one
-# algorithm will not be able to determine an effective learning order.
-#
-# The correct approach is to create a script for each language which repeatedly calls
-# lessonbuilder.py with different options to create the various lessons.
-#
-
-#TOPROW_SCANCODES = [ 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21 ]
-#HOMEROW_SCANCODES = [ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33 ]
-#BOTTOMROW_SCANCODES = [ 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a ]
-
-def make_default_lesson_set(words, bad_words):
-    write_lesson(
-        'intro.lesson',
-        build_intro_lesson())
-
-    lesson = build_lesson(
-        name=_('The Home Row'),
-        description=_('This lesson teaches you the first a, s, d, f, g, h, j, k and l keys \nin the middle of the keyboard.\nThese keys are called the Home Row.'), 
-        order=2, 
-        new_keys=_('asdfghjkl'), base_keys='', 
-        words=words, bad_words=bad_words)
-    write_lesson('homerow.lesson', lesson)
-    
-    lesson = build_lesson(
-        name=_('The Top Row'),
-        description=_('This lesson teaches you the q, w, e, r, t, y, u, i, o and p keys \non the top row of the keyboard.'), 
-        order=3, 
-        new_keys='qwertyuiop', base_keys='asdfghjkl', 
-        words=words, bad_words=bad_words)
-    write_lesson('toprow.lesson', lesson)
-
-    lesson = build_lesson(
-        name=_('The Bottom Row'),
-        description=_('This lesson teaches you the z, x, c, v, b, n and m keys \non the bottom row of the keyboard.'), 
-        order=4, 
-        new_keys='zxcvbnm', base_keys='asdfghjklqwertyuiop', 
-        words=words, bad_words=bad_words)
-    write_lesson('bottomrow.lesson', lesson)
-    
 if __name__ == "__main__":
     import optparse
     parser = optparse.OptionParser("usage: %prog [options]")
-    parser.add_option("--make-all-lessons", dest="make_all_lessons", action="store_true",
-                      help="Automatically generate a complete lesson set.")
-    parser.add_option("--make-intro-lesson", dest="make_intro_lesson", action="store_true",
-                      help="Generate the introductory lesson.")
-    parser.add_option("--make-key-lesson", dest="make_key_lesson", action="store_true",
-                      help="Generate a lesson to teach a specific set of keys.")
-    parser.add_option("--output", dest="output", metavar="FILE",
-                      help="Output file.")
-    parser.add_option("--keys", dest="keys", metavar="KEYS", default='',
-                      help="Keys to teach.")
-    parser.add_option("--base-keys", dest="base_keys", metavar="KEYS", default='',
-                      help="Keys already taught prior to this lesson.")
+
     parser.add_option("--title", dest="name", default="Generated",
-                      help="Lesson name.")
+                      help="Lesson title.")
     parser.add_option("--desc", dest="desc", default="Default description.",
-                      help="Lesson description.")
+                      help="Lesson description.  Use \\n to break lines.")
     parser.add_option("--order", dest="order", type="int", metavar="N", default=0,
                       help="Order of this lesson in the index.")
+    parser.add_option("--seed", dest="seed", type="int", metavar="N", default=0x12345678,
+                      help="Random seed.")
+    parser.add_option("--keys", dest="keys", metavar="KEYS", default='',
+                      help="Keys to teach.")
+    parser.add_option("--base-keys", dest="base_keys", metavar="KEYS", default='',
+                      help="Keys already taught prior to this lesson.")
     parser.add_option("--wordlist", dest="wordlist", metavar="FILE",
                       help="Text file containing words to use.")
     parser.add_option("--badwordlist", dest="badwordlist", metavar="FILE",
                       help="Text file containing words *not* to use.")
-    parser.add_option("--seed", dest="seed", type="int", metavar="N", default=0x12345678,
-                      help="Random seed.")
-    
+    parser.add_option("--game-type", dest="game-type", metavar="TYPE", default='balloon',
+                      help="Type of game to use.  Currently just 'balloon'.")
+    parser.add_option("--output", dest="output", metavar="FILE",
+                      help="Output file.")
+
+    type_group = optparse.OptionGroup(parser, 
+        'Lesson Types', 
+        'Specify one of these to control the kind of lesson created.')
+    type_group.add_option("--make-intro-lesson", dest="make_intro_lesson", action="store_true",
+                      help="Generate the introductory lesson.")
+    type_group.add_option("--make-key-lesson", dest="make_key_lesson", action="store_true",
+                      help="Generate a lesson to teach a specific set of keys.")
+    type_group.add_option("--make-game-lesson", dest="make_game_lesson", action="store_true",
+                      help="Generate a lesson which plays a game.")
+    #type_group.add_option("--make-capital-lesson", dest="make_capital_lesson", action="store_true",
+    #                  help="Generate a lesson which teaches CAPITAL letters (might not be appropriate for some languages).")
+    #type_group.add_option("--make-punctuation-lesson", dest="make_punctuation_lesson", action="store_true",
+    #                  help="Generate a lesson which teaches punctuation (might not be appropriate for some languages).")
+    parser.add_option_group(type_group)
+
     (options, args) = parser.parse_args()
-    
-    if not options.make_all_lessons and not options.make_key_lesson and not options.make_intro_lesson:
+
+    if not (options.make_intro_lesson or options.make_key_lesson or options.make_game_lesson):
         parser.error('no lesson type given')
 
     if not options.output:
@@ -565,27 +519,35 @@ if __name__ == "__main__":
     
     random.seed(options.seed)
 
+    print "Building lesson '%s'..." % options.name
+
+    lesson = {}
+    lesson['name'] = options.name
+    lesson['description'] = options.desc
+    lesson['order'] = options.order
+
     if options.make_intro_lesson:
-        lesson = build_intro_lesson()
-        open(options.output, 'w').write(json.write(lesson))
-        sys.exit()
+        lesson['name'] = _('Welcome') 
+        lesson['type'] = 'normal' 
+        lesson['description'] = _('Click here to begin your typing adventure.') 
+        lesson['steps'] = build_intro_steps()
     
-    if options.make_key_lesson:        
+    elif options.make_key_lesson:        
         if not options.wordlist:
             parser.error('no wordlist file given')
         
-        lesson = build_lesson(
-            name=options.name, description=options.desc, 
-            order=options.order,
+        lesson['type'] = 'normal' 
+        lesson['steps'] = build_key_steps(
             new_keys=options.keys, base_keys=options.base_keys, 
             words=words, bad_words=bad_words)
-        open(options.output, 'w').write(json.write(lesson))
-        sys.exit()
 
-    if options.make_all_lessons:
+    elif options.make_game_lesson:
         if not options.wordlist:
             parser.error('no wordlist file given')
         
-        make_default_lesson_set(words=words, bad_words=bad_words)
-        sys.exit()
+        lesson['type'] = 'balloon' 
+        lesson['words'] = build_game_words(
+            new_keys=options.keys, base_keys=options.base_keys, 
+            words=words, bad_words=bad_words)
 
+    open(options.output, 'w').write(json.write(lesson))
diff --git a/lessons/en_US/MAKETESTLESSONS b/lessons/en_US/MAKETESTLESSONS
index 1d16761..432617f 100755
--- a/lessons/en_US/MAKETESTLESSONS
+++ b/lessons/en_US/MAKETESTLESSONS
@@ -1,3 +1,11 @@
+../../lessonbuilder --make-game-lesson \
+    --title="Balloon game test" \
+    --desc="." \
+    --keys="asdfghjkl" \
+    --wordlist=2of12.txt \
+    --order=-2 \
+    --output=balloon-test.lesson
+
 ../../lessonbuilder --make-key-lesson \
     --title="Test lesson" \
     --desc="This lesson exists to test out obscure Typing Turtle features.\nPlease skip it by pressing the arrow button to the right." \
diff --git a/lessons/en_US/bottomrow.lesson b/lessons/en_US/bottomrow.lesson
index 5df080d..e19a53c 100644
--- a/lessons/en_US/bottomrow.lesson
+++ b/lessons/en_US/bottomrow.lesson
@@ -1 +1 @@
-{"order":3,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Bottom Row lesson!\n\nIn this lesson, you will learn the z, x, c, v, b, n and m keys.  Press the ENTER key when you are ready to begin!"},{"text":"z","mode":"key","instructions":"Press the z key with your left little finger."},{"text":"x","mode":"key","instructions":"Press the x key with your left ring finger."},{"text":"c","mode":"key","instructions":"Press the c key with your left middle finger."},{"text":"v","mode":"key","instructions":"Press the v key with your left index finger."},{"text":"b","mode":"key","instructions":"Press the b key with your left index finger."},{"text":"n","mode":"key","instructions":"Press the n key with your right index finger."},{"text":"m","mode":"key","instructions":"Press the m key with your right index finger."},{"text":"xx nn nn cc nn mm mm mm nn zz bb cc xx mm vv zz cc xx xx zz vv vv mm vv cc cc cc xx zz zz vv xx bb nn vv cc mm cc zz zz","mode":"text","instru
 ctions":"You did it! Practice typing the keys you just learned."},{"text":"mm bb vv nn cc bb zz nn nn bb vv xx vv vv mm cc vv vv mm vv nn nn bb xx mm cc nn vv mm zz mm nn nn mm cc vv xx zz zz bb","mode":"text","instructions":"Keep practicing the new keys."},{"text":"mb mb cm bv xn cc bz bc zz vv bv mv bb nc cn nx xb bm nm nm vv cz cc vv mc zv bb mm nb vv zv xn zz nc zm bb bb bz cn zv nv cm nv nv bv bm zv bv nx cn","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"cm nz nb mv cz zv bv nz mm cn bz mb cm cc nv nb nv xb vv bb xb bn zz zz bc nm nx nc mm mn bb mm bz nx cz vv mn bn cz mm nm bm nv vv bm zz bm zz bb bc","mode":"text","instructions":"Keep practicing key pairs."},{"text":"wn rc bj tm gz kb xf nf by vu dv um ic cy xg ac pm rb bb kc av wc xl be bm av xp bm cy ny nq rb nu vu im bg zv mc ib cl zp on nh yz nx bt vv gb xy ix","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"cr bw kv ve xc yz xw ux 
 xh vv bj un pm sv fc bo nd bi om mp rz pc zm dv cl lm hb ub vi cs nx ub yx hm wm nq xc cu rc be iz vo bc bc xy zl xs bz xq bh","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"kielbasi pretax toweling contrary basalt urbanity loner gasoline bite cancer unease dormant but meekness glisten tomahawk syllabus zillion cliquish disgrace refract dominate behind whereon introit craftily popgun abs elixir badger foible nitty wiz rousing creased inertia bemire divvy circus devilry derby asphyxia dedicate mutt zone buyer ecstatic politic incense posting napalm knowable lecture heading baseness pitchman winner vice pontoon corpora recesses tramper bulky lick angular link clownish unisex abscissa moccasin forgive deliver moxie granule bidder telegram byroad ceramic hooves catheter wend lived steamer giving wallaby mamma assemble bigness affix banking nowhere affect rung niece viking unhorse therm beside fatness botch","mode":"text","instructio
 ns":"You did it! Time to type real words."},{"text":"pinky town strewn gabfest resown gelding scribe humane doings prophecy mah tokenism alderman coating ordinal closing rumbling inkwell unripe bridal pippin taxicab murk keno beguiler medical coward expel reattach reengage loch engross millrace sect eggnog snore cadence tatami mache destruct alum varsity cynic searing midyear abuser frantic unpeeled braise curious abject trisect swoon fetlock prospect beating analyze broaden winery mindedly insigne helium hound infield auxin moment nutria terbium mod tonsure deafness synapse pompon gaunt trauma scrawl burning untiring mound clutter foam artisan dualism penology unblock gangway species lichee buttress misled overdose veranda punt gasbag zonal govern cowardly stormily corbel smear","mode":"text","instructions":"Keep practicing these words."},{"text":"handwork illness twosome vaunt ratline overhand volcanic invasion canopy nosegay repent bicycle news ranks nitwit need beneath t
 ibiae melody entrance salable playboy runnel cicada unction falconry snaky specimen seatmate roomy ceramist secretly zero aquiline ounce encumber clonk dipping tubal fable misuse pixie cabaret prevent spoken bread sheikdom crummy odium refine cocoon shine monthly thatcher bluffly coulomb tonearm hellcat destined valid crack rice deficit notary coiffure bonfire endeavor marsh oatmeal misuse mitosis clan nuclei united means curtsy flatland scolding gunfire fun exciting minatory cajolery ensconce unchaste affiance snail kicker biennium blintze pen peanuts ravenous genitals tang chili inertial mechanic europium regency halcyon souvenir obese gentrify savagely diver intrigue exempt crag gent secret amenable hybrid pong uprising shimmery bloat polarize inexpert rectum missive chyme curfew chiseled castle north slipcase pilchard barrier measure boner chemical misdeed stopover pigskin nuptials reason caviare aground vogue steam linage limn grocer comity viable fiscally frenetic em s
 nowbird kiln reunify bleed airline mourn mensch ironical futon umbel lutenist spinster kerchief prune rabidly bushed dingle belittle weakener moralize brights gimbals raging clomp sachet gardenia mistime enzyme bygones abortive dominate abyss mirage unnerve pointer amen accord uncloak faucet recall huntsman hewn loyalism veggies midrib eaves limiter dumps coed urgently canine","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"name":"The Bottom Row","medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the z, x, c, v, b, n and m keys \non the bottom row of the keyboard."}
\ No newline at end of file
+{"steps":[{"text":"\n","mode":"key","instructions":"In this lesson, you will learn the z, x, c, v, b, n and m keys.\n\nPress the ENTER key when you are ready to begin!"},{"text":"z","mode":"key","instructions":"Press the z key with your left little finger."},{"text":"x","mode":"key","instructions":"Press the x key with your left ring finger."},{"text":"c","mode":"key","instructions":"Press the c key with your left middle finger."},{"text":"v","mode":"key","instructions":"Press the v key with your left index finger."},{"text":"b","mode":"key","instructions":"Press the b key with your left index finger."},{"text":"n","mode":"key","instructions":"Press the n key with your right index finger."},{"text":"m","mode":"key","instructions":"Press the m key with your right index finger."},{"text":"xx nn nn cc nn mm mm mm nn zz bb cc xx mm vv zz cc xx xx zz vv vv mm vv cc cc cc xx zz zz vv xx bb nn vv cc mm cc zz zz","mode":"text","instructions":"You did it! Practice typing the keys you
  just learned."},{"text":"mm bb vv nn cc bb zz nn nn bb vv xx vv vv mm cc vv vv mm vv nn nn bb xx mm cc nn vv mm zz mm nn nn mm cc vv xx zz zz bb","mode":"text","instructions":"Keep practicing the new keys."},{"text":"mb mb cm bv xn cc bz bc zz vv bv mv bb nc cn nx xb bm nm nm vv cz cc vv mc zv bb mm nb vv zv xn zz nc zm bb bb bz cn zv nv cm nv nv bv bm zv bv nx cn","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"cm nz nb mv cz zv bv nz mm cn bz mb cm cc nv nb nv xb vv bb xb bn zz zz bc nm nx nc mm mn bb mm bz nx cz vv mn bn cz mm nm bm nv vv bm zz bm zz bb bc","mode":"text","instructions":"Keep practicing key pairs."},{"text":"wn rc bj tm gz kb xf nf by vu dv um ic cy xg ac pm rb bb kc av wc xl be bm av xp bm cy ny nq rb nu vu im bg zv mc ib cl zp on nh yz nx bt vv gb xy ix","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"cr bw kv ve xc yz xw ux xh vv bj un pm sv fc bo nd bi om mp rz pc zm dv c
 l lm hb ub vi cs nx ub yx hm wm nq xc cu rc be iz vo bc bc xy zl xs bz xq bh","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"kielbasi pretax toweling contrary basalt urbanity loner gasoline bite cancer unease dormant but meekness glisten tomahawk syllabus zillion cliquish disgrace refract dominate behind whereon introit craftily popgun abs elixir badger foible nitty wiz rousing creased inertia bemire divvy circus devilry derby asphyxia dedicate mutt zone buyer ecstatic politic incense posting napalm knowable lecture heading baseness pitchman winner vice pontoon corpora recesses tramper bulky lick angular link clownish unisex abscissa moccasin forgive deliver moxie granule bidder telegram byroad ceramic hooves catheter wend lived steamer giving wallaby mamma assemble bigness affix banking nowhere affect rung niece viking unhorse therm beside fatness botch","mode":"text","instructions":"You did it! Time to type real words."},{"tex
 t":"pinky town strewn gabfest resown gelding scribe humane doings prophecy mah tokenism alderman coating ordinal closing rumbling inkwell unripe bridal pippin taxicab murk keno beguiler medical coward expel reattach reengage loch engross millrace sect eggnog snore cadence tatami mache destruct alum varsity cynic searing midyear abuser frantic unpeeled braise curious abject trisect swoon fetlock prospect beating analyze broaden winery mindedly insigne helium hound infield auxin moment nutria terbium mod tonsure deafness synapse pompon gaunt trauma scrawl burning untiring mound clutter foam artisan dualism penology unblock gangway species lichee buttress misled overdose veranda punt gasbag zonal govern cowardly stormily corbel smear","mode":"text","instructions":"Keep practicing these words."},{"text":"handwork illness twosome vaunt ratline overhand volcanic invasion canopy nosegay repent bicycle news ranks nitwit need beneath tibiae melody entrance salable playboy runnel cica
 da unction falconry snaky specimen seatmate roomy ceramist secretly zero aquiline ounce encumber clonk dipping tubal fable misuse pixie cabaret prevent spoken bread sheikdom crummy odium refine cocoon shine monthly thatcher bluffly coulomb tonearm hellcat destined valid crack rice deficit notary coiffure bonfire endeavor marsh oatmeal misuse mitosis clan nuclei united means curtsy flatland scolding gunfire fun exciting minatory cajolery ensconce unchaste affiance snail kicker biennium blintze pen peanuts ravenous genitals tang chili inertial mechanic europium regency halcyon souvenir obese gentrify savagely diver intrigue exempt crag gent secret amenable hybrid pong uprising shimmery bloat polarize inexpert rectum missive chyme curfew chiseled castle north slipcase pilchard barrier measure boner chemical misdeed stopover pigskin nuptials reason caviare aground vogue steam linage limn grocer comity viable fiscally frenetic em snowbird kiln reunify bleed airline mourn mensch i
 ronical futon umbel lutenist spinster kerchief prune rabidly bushed dingle belittle weakener moralize brights gimbals raging clomp sachet gardenia mistime enzyme bygones abortive dominate abyss mirage unnerve pointer amen accord uncloak faucet recall huntsman hewn loyalism veggies midrib eaves limiter dumps coed urgently canine","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":" ","mode":"key","instructions":"$report"}],"order":3,"type":"normal","name":"The Bottom Row","description":"This lesson teaches you the z, x, c, v, b, n and m keys \non the bottom row of the keyboard."}
\ No newline at end of file
diff --git a/lessons/en_US/homerow.lesson b/lessons/en_US/homerow.lesson
index 97e9399..06335a1 100644
--- a/lessons/en_US/homerow.lesson
+++ b/lessons/en_US/homerow.lesson
@@ -1 +1 @@
-{"order":1,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Home Row lesson!\n\nIn this lesson, you will learn the a, s, d, f, g, h, j, k and l keys.  Press the ENTER key when you are ready to begin!"},{"text":"a","mode":"key","instructions":"Press the a key with your left little finger."},{"text":"s","mode":"key","instructions":"Press the s key with your left ring finger."},{"text":"d","mode":"key","instructions":"Press the d key with your left middle finger."},{"text":"f","mode":"key","instructions":"Press the f key with your left index finger."},{"text":"g","mode":"key","instructions":"Press the g key with your left index finger."},{"text":"h","mode":"key","instructions":"Press the h key with your right index finger."},{"text":"j","mode":"key","instructions":"Press the j key with your right index finger."},{"text":"k","mode":"key","instructions":"Press the k key with your right middle finger."},{"text":"l","mode":"key","instructions":"Press the l key 
 with your right ring finger."},{"text":"ss kk jj dd kk kk ll ll jj aa hh ff ss ll hh aa ff dd ss aa gg gg ll hh dd ff ff ss aa aa gg ss jj kk gg ff kk dd aa ss","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"ll hh gg jj ff jj aa jj jj hh gg dd ff ff ll dd gg gg ll gg kk jj hh dd ll ff jj gg ll aa ll kk jj ll ff gg dd aa aa hh","mode":"text","instructions":"Keep practicing the new keys."},{"text":"la ll gj dj kj gl fj hf kl hs sd hh fa ll gf dh aa ja ld ld fs sj ga lh aj dk fa sa af hs jj kj ka ss kg ff fa lj gf fd gh gj gh gl sg ks jj kh lg gf","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"fg ja sk hh sj fd kh ja ad hd fg ll gj ga gh af gl hg kf ff hk sf ls ka hf ff sf ss sa dd fl ag fj sf kk kf dd sf kk sa ak ks gh hs ja ka ks ka fl df","mode":"text","instructions":"Keep practicing key pairs."},{"text":"kg ds ak lh gs gj aj jj gg ks sd df da ss dd fg sh fs af hl hk lf kg sj gl hh lf
  ls hd dd hl dj af gg sd sl jj lj fh dl fl hg al ja kk kd sg aa gf gf lg gl hk gj la ah kk dk hs fs aa lh ll fs hk lj gh as da ag gl gd kk kj df fl gs sd ld gh lk kd ld gd lg kd dj ah gh ak da fa sk kd kd gf hs kj gk fd","mode":"text","instructions":"Almost done.  Keep practicing key pairs."},{"text":"fag ska ah slash ssh alfalfa sass glad gaga la hall sh alas shag ass all gash lad as aha hag gala dad hall fag slag hall dad ssh flak all da ash hajj sh gal flag ash flag ass lag lass saga dad lass as dash dash fa had half glad gall fag sass fa alas dash all ask ad dash glad ll ask gash ad hajj shad salad lad ska gag gash slash half ad gash has add salad gaga fa alfalfa ash hash salad hah gaff has ll glass flash lash half shah algal flag salsa salsa","mode":"text","instructions":"Good job. Time to type real words."},{"text":"lad la shad sass lad hajj hag shall hajj hall add algal sh gash dash flash alfalfa ad gag gala fall slag has lad gall gag half glad ha hash gas lass gash f
 alls slash gaga ad had jag hag flag sash gash alas shall glass has salsa all halal ll hag hall ask shah algal falls all lass hash sass salad da ssh falls add ash lag fa aha hall dad da glad lad hag half gag sh add slash hah salad shad lag hah shad sh alas shad glass hall hall slag lash lad slag sag jag aha","mode":"text","instructions":"Keep practicing these words."},{"text":"sag ass hag gall lash flak fall ad sh gall has sag gag saga glad gad dash sad ssh shh as sh glad fall alfalfa sh ssh lass da half flask add flash halal dash gal aha gala fall hash glass gaff lag ska sash hag lag halal flash gaff salad flak hajj sad sh flask as lass slash sass gash lass lass lass gall lad sash add ash gal gaff shh gaff aha shh hajj all la gad fall shad hah ask ah flak lag salad sad fad flask gag ash gash ask fad ah sash hall ah fag sag fag fall lash had gala gaff ass alga hajj fa shad ah shad alas slash salsa fa gad saga alga salad half falls alfalfa ll all had ask lash saga fag hall sag
 a half la hag sh all alga ask salad dash fag flask dash da has falls da gag gall salad ash ash sash has glass hash glass gala saga gas falls glad alas dash shh as shh sag ll sad as flash lass sad ll fa gag dad gall sass hag hall all as has halal gala ass sh alfalfa falls ah gad gag sass fag sh","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"name":"The Home Row","medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the a, s, d, f, g, h, j, k and l keys \nin the middle of the keyboard.\nThese keys are called the Home Row."}
\ No newline at end of file
+{"steps":[{"text":"\n","mode":"key","instructions":"In this lesson, you will learn the a, s, d, f, g, h, j, k and l keys.\n\nPress the ENTER key when you are ready to begin!"},{"text":"a","mode":"key","instructions":"Press the a key with your left little finger."},{"text":"s","mode":"key","instructions":"Press the s key with your left ring finger."},{"text":"d","mode":"key","instructions":"Press the d key with your left middle finger."},{"text":"f","mode":"key","instructions":"Press the f key with your left index finger."},{"text":"g","mode":"key","instructions":"Press the g key with your left index finger."},{"text":"h","mode":"key","instructions":"Press the h key with your right index finger."},{"text":"j","mode":"key","instructions":"Press the j key with your right index finger."},{"text":"k","mode":"key","instructions":"Press the k key with your right middle finger."},{"text":"l","mode":"key","instructions":"Press the l key with your right ring finger."},{"text":"ss kk j
 j dd kk kk ll ll jj aa hh ff ss ll hh aa ff dd ss aa gg gg ll hh dd ff ff ss aa aa gg ss jj kk gg ff kk dd aa ss","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"ll hh gg jj ff jj aa jj jj hh gg dd ff ff ll dd gg gg ll gg kk jj hh dd ll ff jj gg ll aa ll kk jj ll ff gg dd aa aa hh","mode":"text","instructions":"Keep practicing the new keys."},{"text":"la ll gj dj kj gl fj hf kl hs sd hh fa ll gf dh aa ja ld ld fs sj ga lh aj dk fa sa af hs jj kj ka ss kg ff fa lj gf fd gh gj gh gl sg ks jj kh lg gf","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"fg ja sk hh sj fd kh ja ad hd fg ll gj ga gh af gl hg kf ff hk sf ls ka hf ff sf ss sa dd fl ag fj sf kk kf dd sf kk sa ak ks gh hs ja ka ks ka fl df","mode":"text","instructions":"Keep practicing key pairs."},{"text":"kg ds ak lh gs gj aj jj gg ks sd df da ss dd fg sh fs af hl hk lf kg sj gl hh lf ls hd dd hl dj af gg sd sl jj lj fh dl fl hg a
 l ja kk kd sg aa gf gf lg gl hk gj la ah kk dk hs fs aa lh ll fs hk lj gh as da ag gl gd kk kj df fl gs sd ld gh lk kd ld gd lg kd dj ah gh ak da fa sk kd kd gf hs kj gk fd","mode":"text","instructions":"Almost done.  Keep practicing key pairs."},{"text":"fag ska ah slash ssh alfalfa sass glad gaga la hall sh alas shag ass all gash lad as aha hag gala dad hall fag slag hall dad ssh flak all da ash hajj sh gal flag ash flag ass lag lass saga dad lass as dash dash fa had half glad gall fag sass fa alas dash all ask ad dash glad ll ask gash ad hajj shad salad lad ska gag gash slash half ad gash has add salad gaga fa alfalfa ash hash salad hah gaff has ll glass flash lash half shah algal flag salsa salsa","mode":"text","instructions":"Good job. Time to type real words."},{"text":"lad la shad sass lad hajj hag shall hajj hall add algal sh gash dash flash alfalfa ad gag gala fall slag has lad gall gag half glad ha hash gas lass gash falls slash gaga ad had jag hag flag sash gash a
 las shall glass has salsa all halal ll hag hall ask shah algal falls all lass hash sass salad da ssh falls add ash lag fa aha hall dad da glad lad hag half gag sh add slash hah salad shad lag hah shad sh alas shad glass hall hall slag lash lad slag sag jag aha","mode":"text","instructions":"Keep practicing these words."},{"text":"sag ass hag gall lash flak fall ad sh gall has sag gag saga glad gad dash sad ssh shh as sh glad fall alfalfa sh ssh lass da half flask add flash halal dash gal aha gala fall hash glass gaff lag ska sash hag lag halal flash gaff salad flak hajj sad sh flask as lass slash sass gash lass lass lass gall lad sash add ash gal gaff shh gaff aha shh hajj all la gad fall shad hah ask ah flak lag salad sad fad flask gag ash gash ask fad ah sash hall ah fag sag fag fall lash had gala gaff ass alga hajj fa shad ah shad alas slash salsa fa gad saga alga salad half falls alfalfa ll all had ask lash saga fag hall saga half la hag sh all alga ask salad dash fag fl
 ask dash da has falls da gag gall salad ash ash sash has glass hash glass gala saga gas falls glad alas dash shh as shh sag ll sad as flash lass sad ll fa gag dad gall sass hag hall all as has halal gala ass sh alfalfa falls ah gad gag sass fag sh","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":" ","mode":"key","instructions":"$report"}],"order":1,"type":"normal","name":"The Home Row","description":"This lesson teaches you the a, s, d, f, g, h, j, k and l keys \nin the middle of the keyboard.\nThese keys are called the Home Row."}
\ No newline at end of file
diff --git a/lessons/en_US/intro.lesson b/lessons/en_US/intro.lesson
index 3c79b8a..8e1146e 100644
--- a/lessons/en_US/intro.lesson
+++ b/lessons/en_US/intro.lesson
@@ -1 +1 @@
-{"name":"Welcome","steps":[{"text":" ","mode":"key","instructions":"Hi, welcome to Typing Turtle!  My name is Max the turtle, and I'll to teach you how to type.\n\nFirst, I will tell you the secret of fast typing... Always use the correct finger to press each key!\n\nIf you learn which finger presses each key, and keep practicing, you will be typing like a pro before you know it!\n\nNow, place your hands on the keyboard just like the picture below.\nWhen you're ready, press the SPACE bar with your thumb!"},{"text":" ","mode":"key","instructions":"Good job!  You correctly typed your first key.  When typing, the SPACE bar is used to insert blank spaces between words.\n\nPress the SPACE bar again with your thumb."},{"text":"\n","mode":"key","instructions":"Now I'll teach you the second key, ENTER.  That's the big square key near your right little finger.\n\nWithout moving any other fingers, reach your little finger over and press ENTER.\nCheck the picture below if you need a hi
 nt!"},{"text":"\n","mode":"key","instructions":"Great!  When typing, the ENTER key is used to begin a new line.\n\nPress the ENTER key again with your right little finger."},{"text":" ","mode":"key","instructions":"Wonderful!  Now I'm going to tell you a little more about Typing Turtle.\n\nThe box you are reading is where instructions will appear.  The keyboard picture below shows what your hands should be doing.  The numbers up top show how quickly and accurately you are typing.\n\nWhen you see a big picture of a key like this one, you are supposed to press that key on the keyboard.\nRemember, always use the correct finger to type each key!"},{"text":"\n","mode":"key","instructions":"$report"}],"report":"simple","order":0,"medals":[{"wpm":0,"name":"bronze","accuracy":10},{"wpm":0,"name":"silver","accuracy":70},{"wpm":0,"name":"gold","accuracy":100}],"description":"Click here to begin your typing adventure."}
\ No newline at end of file
+{"steps":[{"text":" ","mode":"key","instructions":"Hi, welcome to Typing Turtle!  My name is Max the turtle, and I'll to teach you how to type.\n\nFirst, I will tell you the secret of fast typing... Always use the correct finger to press each key!\n\nIf you learn which finger presses each key, and keep practicing, you will be typing like a pro before you know it!\n\nNow, place your hands on the keyboard just like the picture below.\nWhen you're ready, press the SPACE bar with your thumb!"},{"text":" ","mode":"key","instructions":"Good job!  You correctly typed your first key.  When typing, the SPACE bar is used to insert blank spaces between words.\n\nPress the SPACE bar again with your thumb."},{"text":"\n","mode":"key","instructions":"Now I'll teach you the second key, ENTER.  That's the big square key near your right little finger.\n\nWithout moving any other fingers, reach your little finger over and press ENTER.\nCheck the picture below if you need a hint!"},{"text":"\n
 ","mode":"key","instructions":"Great!  When typing, the ENTER key is used to begin a new line.\n\nPress the ENTER key again with your right little finger."},{"text":" ","mode":"key","instructions":"Wonderful!  Now I'm going to tell you a little more about Typing Turtle.\n\nThe box you are reading is where instructions will appear.  The keyboard picture below shows what your hands should be doing.  The numbers up top show how quickly and accurately you are typing.\n\nWhen you see a big picture of a key like this one, you are supposed to press that key on the keyboard.\nRemember, always use the correct finger to type each key!"},{"text":"\n","mode":"key","instructions":"$report"}],"order":0,"type":"normal","name":"Welcome","description":"Click here to begin your typing adventure."}
\ No newline at end of file
diff --git a/lessons/en_US/leftcapital.lesson b/lessons/en_US/leftcapital.lesson
index 0a80c19..6ea21ae 100644
--- a/lessons/en_US/leftcapital.lesson
+++ b/lessons/en_US/leftcapital.lesson
@@ -1 +1 @@
-{"order":4,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the Left Hand Capitals lesson!\n\nIn this lesson, you will learn the Q, W, E, R, T, A, S, D, F, G, Z, X, C, V and B keys.  Press the ENTER key when you are ready to begin!"},{"text":"Q","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the Q key with your left little finger."},{"text":"W","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the W key with your left ring finger."},{"text":"E","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the E key with your left middle finger."},{"text":"R","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the R key with your left index finger."},{"text":"T","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the T key with yo
 ur left index finger."},{"text":"A","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the A key with your left little finger."},{"text":"S","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the S key with your left ring finger."},{"text":"D","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the D key with your left middle finger."},{"text":"F","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the F key with your left index finger."},{"text":"G","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the G key with your left index finger."},{"text":"Z","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the Z key with your left little finger."},{"text":"X","mode":"key","instructions":"Pres
 s and hold the SHIFT key with your right little finger, then press the X key with your left ring finger."},{"text":"C","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the C key with your left middle finger."},{"text":"V","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the V key with your left index finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger."},{"text":"RR CC XX TT CC VV BB VV XX WW GG AA EE VV FF QQ AA TT EE QQ DD DD VV FF TT AA SS EE WW WW DD EE ZZ CC FF SS CC TT QQ WW","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"VV GG DD XX SS ZZ WW XX XX GG DD RR SS SS VV TT DD DD BB DD XX XX FF TT BB AA XX DD BB QQ BB CC ZZ VV AA DD RR QQ WW GG","mode":"text","instructions":"Keep practicing the new keys."},{"text":"BB W
 S SQ AA XB ES ZZ RC EA VZ WW EB XQ WC CC DW DT FZ RW FV QB XC CE XE GF DX GC VQ TR RD DX FA FD ES TX QA ZD CS QG ZT EZ RC ZG GG ZZ CW XR BE RR ET","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"DC BQ RE TE BT CW VC ER XS ZA RF RD DS CZ GR TA QW VB SV XR AD ZS CX TR BV VG VV XA FG RS WC EV CT WQ BX WR CZ CT EF TG CC ZC TA ZQ VW FS WT FX WA GR","mode":"text","instructions":"Keep practicing key pairs."},{"text":"Cg uR rQ nA tF AS yZ WG Bm fX WB dF TQ QG oC XW SX Qa kS WZ Rs hV Sr bR pT aQ Fo Ws CR Fo Xb EG Gl Rl Qy Rf Fy Gn nX Xv jT SD VE BA SA FZ iD sT QR Ea","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"GC Xj TE Rt WQ ZC Sm DX jD nD SR GT rC Am AC TZ wT Vf Qx hW Wb So TE hE Ai Dp EE Va Ag pF sE BV WT nT Cc WR qF zE oX DV hG TB Xg vZ RQ XV Ey SF nT wR","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"XiEz FWSZ TQVZ XZVF VVEe RDEl VgAV AwWl ZmQR WfSm 
 AxBB WhBv FFCA GSQn ERSu XFZm XcXt WVFz ZvQt BwVk WpFk GSCX SXDW SsCy SlVn AhTt WGBz GhXE EyGh ZVCR DXTo WZSR WVSX RsFv GEDc VTGZ TlDB ZBGt FARV GTZX QdRk EWBa AWFw QZQj CsCQ WxWr XgVf TETC GhDu FSRG ThXn SaCi EzEn EtZC GTFw XECj WtXC RGXS DZTm GpGz GuZg RnEl ViQV WZWj GFXl CjZo QQZR RXZt GBZa RkWq EZRW CeFn DwWS ChCV WtEy BlZr QuTb SWAS VdQj FDCD TmXn DQTr DXXl ZZTR DAQB WWDt WAFl GGSc TpDd BzEo TqGr ATWs AETq TjGi ScVo ZgEp ZyEf GfBV QQXr QzQv","mode":"text","instructions":"Well done! Time to type jumbles."},{"text":"TdBB EsSE SFQs GbRd XqEV EoWg WiVv FmCu FZZe QXDy AZZh AvXW EyGh FyWT ToRo GgFW RsAl SBSk XEDi CqAl BgTZ TCCq TlCQ ZASh ZzCV GxWi VkRZ QRTl DlZb QyAd SiXv XpTR XlWX ZDCv ZtCF ZCFx GmTk GnAG ElEz WCFW EuZo RBBk QvWc BjTA VAZy BSSQ DfRW GAXo EWRc XfSc BnCZ RTSl TnAu WmEw SoXd XtDQ WlTy EAWZ RABn RESy BnFf ElQz FtGz EGDm CqGf GDCr ZaRE SXRb XDCu EmQX ExCj EiZA ZiFd RrDj CuDj WWSF WhTl RnFG CcGD DzGE VrDG CQTQ VSCW CxQm DXWm ZDVF VoRy TSDh XaWZ GxVs RyAZ SwTX TaEV
  BxXj ZxVf GZWb GVAr ErAp QEEh QBVA","mode":"text","instructions":"Keep practicing these jumbles."},{"text":"CrVb FVTx DbRr BWGB FdTQ DTRA CXXC QQSn VrCV EAGR RwTl ToFZ SyXW AEWT WpGt EuFb QzBF GBXt GZQn GESb WTEd QmXZ FWWZ CGXS DQDT CuDo QhWx ThSb GTAl DXXV EoDs WtFq EWSD RoQg DcWo XfWF GrQf FtEd WjXQ StTl XeXQ VtVc CBGm RQVf QvXf DjTR EtSr EXWs DQVa FeFZ GtDR ZaVT GVDT SBAR CjXQ WeGE GaGl WfEG SpFW XDWi VfVw TdDA FFDz SWVR AQBj ZzSo TdTs DgFg EdBu GdSr FlXj EbAA VtQl GcFu RBFZ ESAx GxSr GnRy FpZp QhAA CyZn BzCX VrQQ GWEo RRZQ AzFo SXSk QcRx WZZT AWEs SyEl VqRb XfCh WgQE ESDW ZDWy ZRSk CVTw CgBc QrCS","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"name":"Left Hand Capitals","medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the CAPITAL letters which are
  typed by your left hand.\nThese are Q, W, E, R, T, A, S, D, F, G, Z, X, C, V and B."}
\ No newline at end of file
+{"steps":[{"text":"\n","mode":"key","instructions":"In this lesson, you will learn the Q, W, E, R, T, A, S, D, F, G, Z, X, C, V and B keys.\n\nPress the ENTER key when you are ready to begin!"},{"text":"Q","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the Q key with your left little finger."},{"text":"W","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the W key with your left ring finger."},{"text":"E","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the E key with your left middle finger."},{"text":"R","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the R key with your left index finger."},{"text":"T","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the T key with your left index finger."},{"text":"A","mode":"key","ins
 tructions":"Press and hold the SHIFT key with your right little finger, then press the A key with your left little finger."},{"text":"S","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the S key with your left ring finger."},{"text":"D","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the D key with your left middle finger."},{"text":"F","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the F key with your left index finger."},{"text":"G","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the G key with your left index finger."},{"text":"Z","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the Z key with your left little finger."},{"text":"X","mode":"key","instructions":"Press and hold the SHIFT key with your right little finge
 r, then press the X key with your left ring finger."},{"text":"C","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the C key with your left middle finger."},{"text":"V","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the V key with your left index finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger."},{"text":"RR CC XX TT CC VV BB VV XX WW GG AA EE VV FF QQ AA TT EE QQ DD DD VV FF TT AA SS EE WW WW DD EE ZZ CC FF SS CC TT QQ WW","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"VV GG DD XX SS ZZ WW XX XX GG DD RR SS SS VV TT DD DD BB DD XX XX FF TT BB AA XX DD BB QQ BB CC ZZ VV AA DD RR QQ WW GG","mode":"text","instructions":"Keep practicing the new keys."},{"text":"BB WS SQ AA XB ES ZZ RC EA VZ WW EB XQ WC CC DW DT FZ RW 
 FV QB XC CE XE GF DX GC VQ TR RD DX FA FD ES TX QA ZD CS QG ZT EZ RC ZG GG ZZ CW XR BE RR ET","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"DC BQ RE TE BT CW VC ER XS ZA RF RD DS CZ GR TA QW VB SV XR AD ZS CX TR BV VG VV XA FG RS WC EV CT WQ BX WR CZ CT EF TG CC ZC TA ZQ VW FS WT FX WA GR","mode":"text","instructions":"Keep practicing key pairs."},{"text":"Cg uR rQ nA tF AS yZ WG Bm fX WB dF TQ QG oC XW SX Qa kS WZ Rs hV Sr bR pT aQ Fo Ws CR Fo Xb EG Gl Rl Qy Rf Fy Gn nX Xv jT SD VE BA SA FZ iD sT QR Ea","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"GC Xj TE Rt WQ ZC Sm DX jD nD SR GT rC Am AC TZ wT Vf Qx hW Wb So TE hE Ai Dp EE Va Ag pF sE BV WT nT Cc WR qF zE oX DV hG TB Xg vZ RQ XV Ey SF nT wR","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"XiEz FWSZ TQVZ XZVF VVEe RDEl VgAV AwWl ZmQR WfSm AxBB WhBv FFCA GSQn ERSu XFZm XcXt WVFz ZvQt BwVk WpF
 k GSCX SXDW SsCy SlVn AhTt WGBz GhXE EyGh ZVCR DXTo WZSR WVSX RsFv GEDc VTGZ TlDB ZBGt FARV GTZX QdRk EWBa AWFw QZQj CsCQ WxWr XgVf TETC GhDu FSRG ThXn SaCi EzEn EtZC GTFw XECj WtXC RGXS DZTm GpGz GuZg RnEl ViQV WZWj GFXl CjZo QQZR RXZt GBZa RkWq EZRW CeFn DwWS ChCV WtEy BlZr QuTb SWAS VdQj FDCD TmXn DQTr DXXl ZZTR DAQB WWDt WAFl GGSc TpDd BzEo TqGr ATWs AETq TjGi ScVo ZgEp ZyEf GfBV QQXr QzQv","mode":"text","instructions":"Well done! Time to type jumbles."},{"text":"TdBB EsSE SFQs GbRd XqEV EoWg WiVv FmCu FZZe QXDy AZZh AvXW EyGh FyWT ToRo GgFW RsAl SBSk XEDi CqAl BgTZ TCCq TlCQ ZASh ZzCV GxWi VkRZ QRTl DlZb QyAd SiXv XpTR XlWX ZDCv ZtCF ZCFx GmTk GnAG ElEz WCFW EuZo RBBk QvWc BjTA VAZy BSSQ DfRW GAXo EWRc XfSc BnCZ RTSl TnAu WmEw SoXd XtDQ WlTy EAWZ RABn RESy BnFf ElQz FtGz EGDm CqGf GDCr ZaRE SXRb XDCu EmQX ExCj EiZA ZiFd RrDj CuDj WWSF WhTl RnFG CcGD DzGE VrDG CQTQ VSCW CxQm DXWm ZDVF VoRy TSDh XaWZ GxVs RyAZ SwTX TaEV BxXj ZxVf GZWb GVAr ErAp QEEh QBVA","mode":"text","i
 nstructions":"Keep practicing these jumbles."},{"text":"CrVb FVTx DbRr BWGB FdTQ DTRA CXXC QQSn VrCV EAGR RwTl ToFZ SyXW AEWT WpGt EuFb QzBF GBXt GZQn GESb WTEd QmXZ FWWZ CGXS DQDT CuDo QhWx ThSb GTAl DXXV EoDs WtFq EWSD RoQg DcWo XfWF GrQf FtEd WjXQ StTl XeXQ VtVc CBGm RQVf QvXf DjTR EtSr EXWs DQVa FeFZ GtDR ZaVT GVDT SBAR CjXQ WeGE GaGl WfEG SpFW XDWi VfVw TdDA FFDz SWVR AQBj ZzSo TdTs DgFg EdBu GdSr FlXj EbAA VtQl GcFu RBFZ ESAx GxSr GnRy FpZp QhAA CyZn BzCX VrQQ GWEo RRZQ AzFo SXSk QcRx WZZT AWEs SyEl VqRb XfCh WgQE ESDW ZDWy ZRSk CVTw CgBc QrCS","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":" ","mode":"key","instructions":"$report"}],"order":4,"type":"normal","name":"Left Hand Capitals","description":"This lesson teaches you the CAPITAL letters which are typed by your left hand.\nThese are Q, W, E, R, T, A, S, D, F, G, Z, X, C, V and B."}
\ No newline at end of file
diff --git a/lessons/en_US/rightcapital.lesson b/lessons/en_US/rightcapital.lesson
index ba80ebf..fa2937f 100644
--- a/lessons/en_US/rightcapital.lesson
+++ b/lessons/en_US/rightcapital.lesson
@@ -1 +1 @@
-{"order":5,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the Right Hand Capitals lesson!\n\nIn this lesson, you will learn the Y, U, I, O, P, H, J, K, L, B, N and M keys.  Press the ENTER key when you are ready to begin!"},{"text":"Y","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the Y key with your right index finger."},{"text":"U","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the U key with your right index finger."},{"text":"I","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the I key with your right middle finger."},{"text":"O","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the O key with your right ring finger."},{"text":"P","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the P key with your right l
 ittle finger."},{"text":"H","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the H key with your right index finger."},{"text":"J","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the J key with your right index finger."},{"text":"K","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the K key with your right middle finger."},{"text":"L","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the L key with your right ring finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger."},{"text":"N","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the N key with your right index finger."},{"text":"M","mode":"key","instructions":"Press and hold
  the SHIFT key with your left little finger, then press the M key with your right index finger."},{"text":"II BB LL OO NN NN MM NN LL YY KK PP UU MM JJ YY PP OO II YY HH HH NN JJ OO PP PP UU YY UU JJ II LL NN JJ HH NN OO YY UU","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"NN KK HH BB HH LL UU BB LL KK HH II HH HH MM OO HH HH MM HH BB BB KK OO MM PP BB HH MM YY MM BB LL NN PP JJ II YY YY KK","mode":"text","instructions":"Keep practicing the new keys."},{"text":"MM UP HY PP BM UH LL IN UP NL UU IM BY UB BB JU HO JL IU JN YM BN BU BU KK HB KN NY OI IH JL JP KJ IH OL YP LJ BH YK LO UL IB LK KK LL NU BI MU IO IO","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"HB MY IU OU MO BY NB II BH LP OJ IH JP BL KO OP YU NM HN LI PJ LH BL OI MN MK NN LP KK IH UB IN NO UY MB UO NL NO UJ OK NB LB OP LY NU KH UO JB YP KI","mode":"text","instructions":"Keep practicing key pairs."},{"text":"Np DI RY zP S
 K PB CL UK Mx oB IM mJ OY YM QN BU LL Yi vH IL OA rN PT jI WO iY Kz UA BP Kz Bj OK Kw Iw YV Io KV Ky yL BG tO LJ NI gP LP NL sJ TO UO Uh","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"aB Bt OO OS IY bN Hx Hc uH yJ PP aO RB Px KN Ob ZO Mo YC rU Uj PQ JI rI Pr JW UO Mi Pp WK AU gM UO yO Bk UO EJ BI QL Hf qK Oh Bq GL IY Le UC LK yO ZO","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"LsIB KUHa OYNb LbNN MfIm ONIw MpPf PZUv LxYP UoHx PCMh UrMG JMNJ KLYy IPHF BNLx BjBD UfJB LGYS MXNu YWJv KLBc HcHU HABV HwNz PrOD UaMB KqLO UCKq LfNP JcOQ YaPP YfHd IAJF KOJk NJKb OwHg LhKS JKIf KHLc YmOu UUMi PUKZ YcYu BANY YCUT BqMo OOOd KqJD JLIa OrBy HhBs IBUy ISLd KJJZ BIBu YSBe IaBL JaOy KEKB KDLq IzIw MrYf UbYt KNLv BtLQ YYLP IdLS KhLh IvUE IbII BnJy JZUL NqBe YSUC MwLR YDOj HUPK NmYt KBNB OxLy HYOT HdBv LbOP HJYg YUHS UJJw KaPk OWJl MVIz OEKR PHYA POOR OuKs PkNz LpIW LCIo KoMf YYBT YBYG","mode":"text","ins
 tructions":"Well done! Time to type jumbles."},{"text":"OmMg IAHO PNYA KiIm BRIf UQUp UrNG KxBD JbLn YdHV PbLq PFBI UCKq JVYJ OQOz KpKU OAPw PgPu BOJs NEPw MpOc OeBR OwNU LKPq LVBe KXYs NuIb YPOv JvLi YCPl HsBG BQOH BvUd LBNG LSNN LdKX KxOu KzPa UwUB UdJU IDLQ IgMu YFYk MuOJ NJLV MLHY HpOI KJBz UIIk BoHl MzBb IJHv OzPF UxUZ HzBm BSHU YvOV IJUb IKMy IOHC MyJo UwYB KSKB IMJx NEKp KBNT LhIO PcIj BNBD UxYc UXBu IrLK LrJl ITHu BDJu YIHN UrOw IyKa NlKB JVKI MRJa NYOY MKNU NCYy JcYy LBNM MQIV OLHr BhUb KXMA IVPb HZOd OiUf MCBt LXNo KaYj KfPR UTPW YOIq YhNK","mode":"text","instructions":"Keep practicing these jumbles."},{"text":"NTNj JfOX HiIT MUKh JlOY HHIK NdBe YYPz NRBf IKKO IZOv OQKb HCBU PIUJ UQKS UDKj YBMN KgBS KbYz KOHj UHUl YxBc JUUa BMBL HYJH NDHQ YqUC OrHj KJPw HcBe UzHA YSJE UUHB IQYp JkUz BoUM KRYo JSUl UtBY HDOw BmBY MSNk BgKx OYNo YGBo JtOH UDHT IcUA JYNi JmJb KSHP LiMH KfHJ HhPP BtLY UmKO KhKv UoIM HQJU LNUs NoNZ OlJJ JMJB HINP PYMt LVPQ OlOA HqKq ImMD KmHT JvBt UjPK 
 MSYv KkKD OhJb IBPX KXHT KyOC KWLW YqPK NVLz MBBd NRYY KIIz IPLY PBJz HdHv YlIC UbLH PIUA HVUw NRIj BnNq UpYO ILHI LBYV LPHv BgOZ BpMl YRNL","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"name":"Right Hand Capitals","medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the CAPITAL letters which are typed by your right hand.\nThese are Y, U, I, O, P, H, J, K, L, B, N, and M."}
\ No newline at end of file
+{"steps":[{"text":"\n","mode":"key","instructions":"In this lesson, you will learn the Y, U, I, O, P, H, J, K, L, B, N and M keys.\n\nPress the ENTER key when you are ready to begin!"},{"text":"Y","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the Y key with your right index finger."},{"text":"U","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the U key with your right index finger."},{"text":"I","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the I key with your right middle finger."},{"text":"O","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the O key with your right ring finger."},{"text":"P","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the P key with your right little finger."},{"text":"H","mode":"key","instructions
 ":"Press and hold the SHIFT key with your left little finger, then press the H key with your right index finger."},{"text":"J","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the J key with your right index finger."},{"text":"K","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the K key with your right middle finger."},{"text":"L","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the L key with your right ring finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger."},{"text":"N","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then press the N key with your right index finger."},{"text":"M","mode":"key","instructions":"Press and hold the SHIFT key with your left little finger, then pres
 s the M key with your right index finger."},{"text":"II BB LL OO NN NN MM NN LL YY KK PP UU MM JJ YY PP OO II YY HH HH NN JJ OO PP PP UU YY UU JJ II LL NN JJ HH NN OO YY UU","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"NN KK HH BB HH LL UU BB LL KK HH II HH HH MM OO HH HH MM HH BB BB KK OO MM PP BB HH MM YY MM BB LL NN PP JJ II YY YY KK","mode":"text","instructions":"Keep practicing the new keys."},{"text":"MM UP HY PP BM UH LL IN UP NL UU IM BY UB BB JU HO JL IU JN YM BN BU BU KK HB KN NY OI IH JL JP KJ IH OL YP LJ BH YK LO UL IB LK KK LL NU BI MU IO IO","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"HB MY IU OU MO BY NB II BH LP OJ IH JP BL KO OP YU NM HN LI PJ LH BL OI MN MK NN LP KK IH UB IN NO UY MB UO NL NO UJ OK NB LB OP LY NU KH UO JB YP KI","mode":"text","instructions":"Keep practicing key pairs."},{"text":"Np DI RY zP SK PB CL UK Mx oB IM mJ OY YM QN BU LL Yi vH IL OA rN P
 T jI WO iY Kz UA BP Kz Bj OK Kw Iw YV Io KV Ky yL BG tO LJ NI gP LP NL sJ TO UO Uh","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"aB Bt OO OS IY bN Hx Hc uH yJ PP aO RB Px KN Ob ZO Mo YC rU Uj PQ JI rI Pr JW UO Mi Pp WK AU gM UO yO Bk UO EJ BI QL Hf qK Oh Bq GL IY Le UC LK yO ZO","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"LsIB KUHa OYNb LbNN MfIm ONIw MpPf PZUv LxYP UoHx PCMh UrMG JMNJ KLYy IPHF BNLx BjBD UfJB LGYS MXNu YWJv KLBc HcHU HABV HwNz PrOD UaMB KqLO UCKq LfNP JcOQ YaPP YfHd IAJF KOJk NJKb OwHg LhKS JKIf KHLc YmOu UUMi PUKZ YcYu BANY YCUT BqMo OOOd KqJD JLIa OrBy HhBs IBUy ISLd KJJZ BIBu YSBe IaBL JaOy KEKB KDLq IzIw MrYf UbYt KNLv BtLQ YYLP IdLS KhLh IvUE IbII BnJy JZUL NqBe YSUC MwLR YDOj HUPK NmYt KBNB OxLy HYOT HdBv LbOP HJYg YUHS UJJw KaPk OWJl MVIz OEKR PHYA POOR OuKs PkNz LpIW LCIo KoMf YYBT YBYG","mode":"text","instructions":"Well done! Time to type jumbles."},{"text"
 :"OmMg IAHO PNYA KiIm BRIf UQUp UrNG KxBD JbLn YdHV PbLq PFBI UCKq JVYJ OQOz KpKU OAPw PgPu BOJs NEPw MpOc OeBR OwNU LKPq LVBe KXYs NuIb YPOv JvLi YCPl HsBG BQOH BvUd LBNG LSNN LdKX KxOu KzPa UwUB UdJU IDLQ IgMu YFYk MuOJ NJLV MLHY HpOI KJBz UIIk BoHl MzBb IJHv OzPF UxUZ HzBm BSHU YvOV IJUb IKMy IOHC MyJo UwYB KSKB IMJx NEKp KBNT LhIO PcIj BNBD UxYc UXBu IrLK LrJl ITHu BDJu YIHN UrOw IyKa NlKB JVKI MRJa NYOY MKNU NCYy JcYy LBNM MQIV OLHr BhUb KXMA IVPb HZOd OiUf MCBt LXNo KaYj KfPR UTPW YOIq YhNK","mode":"text","instructions":"Keep practicing these jumbles."},{"text":"NTNj JfOX HiIT MUKh JlOY HHIK NdBe YYPz NRBf IKKO IZOv OQKb HCBU PIUJ UQKS UDKj YBMN KgBS KbYz KOHj UHUl YxBc JUUa BMBL HYJH NDHQ YqUC OrHj KJPw HcBe UzHA YSJE UUHB IQYp JkUz BoUM KRYo JSUl UtBY HDOw BmBY MSNk BgKx OYNo YGBo JtOH UDHT IcUA JYNi JmJb KSHP LiMH KfHJ HhPP BtLY UmKO KhKv UoIM HQJU LNUs NoNZ OlJJ JMJB HINP PYMt LVPQ OlOA HqKq ImMD KmHT JvBt UjPK MSYv KkKD OhJb IBPX KXHT KyOC KWLW YqPK NVLz MBBd NRYY
  KIIz IPLY PBJz HdHv YlIC UbLH PIUA HVUw NRIj BnNq UpYO ILHI LBYV LPHv BgOZ BpMl YRNL","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":" ","mode":"key","instructions":"$report"}],"order":5,"type":"normal","name":"Right Hand Capitals","description":"This lesson teaches you the CAPITAL letters which are typed by your right hand.\nThese are Y, U, I, O, P, H, J, K, L, B, N, and M."}
\ No newline at end of file
diff --git a/lessons/en_US/test.lesson b/lessons/en_US/test.lesson
index 65a8138..6b2421b 100644
--- a/lessons/en_US/test.lesson
+++ b/lessons/en_US/test.lesson
@@ -1 +1 @@
-{"order":-1,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the Test lesson lesson!\n\nIn this lesson, you will learn the æ, Ω, A, B, bb and B keys.  Press the Enter key when you are ready to begin!"},{"text":"æ","mode":"key","instructions":"Press and hold the ALTGR key, then press the æ key with your left little finger."},{"text":"Ω","mode":"key","instructions":"Press and hold the ALTGR and SHIFT keys, then press the Ω key with your left little finger."},{"text":"A","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the A key with your left little finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger."},{"text":"b","mode":"key","instructions":"Press the b key with your left index finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press th
 e B key with your left index finger."},{"text":"ΩΩ bb bb ΩΩ BB BB BB BB bb ææ BB AA ææ BB BB ææ AA ΩΩ ΩΩ ææ AA AA BB BB ΩΩ AA AA ææ ææ ææ BB ΩΩ bb BB BB AA BB ΩΩ ææ ææ","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"BB BB AA bb AA bb ææ bb bb BB AA ΩΩ AA AA BB ΩΩ AA AA BB AA bb bb BB ΩΩ BB AA bb AA BB ææ BB bb bb BB AA BB ΩΩ ææ ææ BB","mode":"text","instructions":"Keep practicing the new keys."},{"text":"bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb","mode":"text","instructions":"Keep practicing key pairs."},{"text":"bb bb bb bb bb bb bb bb 
 bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb","mode":"text","instructions":"Almost done.  Keep practicing key pairs."},{"text":"BBΩA BΩΩb BBAB bAæb bBΩΩ æBBA BBAB BΩbA ABBB ΩAΩæ bæΩB æΩBB ææAb BBΩæ bBbæ ΩBbB æbΩB AbBB bbAA Ωbæb bBææ ABbæ ΩæBb AæAA BΩΩΩ BBAΩ BBæb BAbB BBBA ΩΩbB BBæB BbAb ABBæ BBAB Ωæææ ΩΩBb bbæΩ bæBæ AæAB BbæB ΩbAB BbAb æΩAB ΩbBæ AbBb AæbA bæAB bAbA ABæB BBæΩ BææB æΩBΩ BBæB bΩbb BbBA ΩBbB æBBæ AAAb AæBb ΩBBB bΩbB Ωæbæ AΩbΩ BbBA ΩæAΩ Bæææ BBΩb ABΩA ΩΩAB bBbB AææΩ Ωbbb BAbA BæBΩ ΩAΩB BBBæ æBΩæ BBæA ΩAbA ΩæbΩ BbAB æBbæ ææΩB AΩAB æBbB æbBB ABΩæ BΩbB bAAΩ æbBb BΩBB bbBA ΩABB bΩAæ bBæb BBΩæ AbΩæ æBæB æBΩb bÎ
 ©BB","mode":"text","instructions":"Good job. Time to type jumbles."},{"text":"æbBΩ BBæA ΩΩæB ΩbΩB ΩBΩΩ AΩΩΩ BBBA ΩABæ Bbbæ ææAA BABB AæBB BBΩB æBææ bΩæA BbΩb bbAb BæAB BbBæ bBBB BæbB BBæb ΩAΩA æAbb BABB bABΩ BæΩB BBBb ææBB BbAB æBΩΩ bæΩA ææΩA ΩΩbB BBæB ABæB ΩΩBA AbAB BBæΩ ΩBæb ΩæAΩ BææB AAæB BæΩæ BbbB ææBæ bbBB BΩæΩ ΩBBB BBæΩ ΩΩBb bAAb BΩBæ bΩBb ΩBæB Bbæb BæBb ΩΩΩb æBΩΩ bBbB BBBb BΩbΩ BBBæ ΩæΩæ BBΩb BbBb bææb æΩΩb bBAb AΩBæ bΩΩΩ æbAB bBBæ æBBb ΩæBæ BBBb bæBΩ AAæA æBAæ BBΩB ΩΩBb bAæΩ bAΩb BbΩΩ æAææ AææA BææB BBΩA AΩbB ABBΩ bΩbB bAææ bAæΩ bΩBB BAAB bbBΩ bbBΩ ABBB Ωææb bæBæ","mode":"text","instructions":"Keep practicing these jumbles."},{"text":"BΩAB AΩbA æAΩæ bBAΩ AbbΩ Ωæbæ BæBB BBbb BBΩb AæΩA BAΩb BABb ææBB BBBæ æΩbΩ bBBB æΩbA BAAA BbæB BBbA BBBΩ ΩΩΩb bΩBB æbæA BbBb ΩBBæ BBBΩ ΩææΩ BBBb AæBA
  AABb BbbΩ æbBæ ΩbΩB BbbB ΩbΩB BBBΩ BBbA ΩæBæ BæΩB æΩBb bΩAB BæBæ ABBΩ æBæb BBæA æABΩ æBæb bææΩ AbAA ABbb ΩΩæA BΩbA Bæbæ BAbb AbbA ææBΩ BΩææ ΩΩæB bΩæA BBbB BæBæ BBBB BΩΩB bBbB BBΩB bbAΩ æAΩΩ AbΩb Bæbæ ΩæBb BΩBb æbBB AΩbA BbBB BææA ΩæBΩ BΩbB ΩBAB ΩBBB æBbB ΩBæΩ æBæB æBBæ bBΩæ bbΩB ΩBbΩ BΩæA BbAæ ΩBBB bΩBA ΩABΩ ΩΩAæ ΩBBb BbBB ABΩæ ABΩA bæbA bææΩ BæAB","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"name":"Test lesson","medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson exists to test out obscure Typing Turtle features.\nPlease skip it by pressing the arrow button to the right."}
\ No newline at end of file
+{"steps":[{"text":"\n","mode":"key","instructions":"In this lesson, you will learn the æ, Ω, A, B, b and B keys.\n\nPress the ENTER key when you are ready to begin!"},{"text":"æ","mode":"key","instructions":"Press and hold the ALTGR key, then press the æ key with your left little finger."},{"text":"Ω","mode":"key","instructions":"Press and hold the ALTGR and SHIFT keys, then press the Ω key with your left little finger."},{"text":"A","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the A key with your left little finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger."},{"text":"b","mode":"key","instructions":"Press the b key with your left index finger."},{"text":"B","mode":"key","instructions":"Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger."},{"text":"
 ΩΩ bb bb ΩΩ BB BB BB BB bb ææ BB AA ææ BB BB ææ AA ΩΩ ΩΩ ææ AA AA BB BB ΩΩ AA AA ææ ææ ææ BB ΩΩ bb BB BB AA BB ΩΩ ææ ææ","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"BB BB AA bb AA bb ææ bb bb BB AA ΩΩ AA AA BB ΩΩ AA AA BB AA bb bb BB ΩΩ BB AA bb AA BB ææ BB bb bb BB AA BB ΩΩ ææ ææ BB","mode":"text","instructions":"Keep practicing the new keys."},{"text":"bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb","mode":"text","instructions":"Keep practicing key pairs."},{"text":"bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb 
 bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb","mode":"text","instructions":"Almost done.  Keep practicing key pairs."},{"text":"BBΩA BΩΩb BBAB bAæb bBΩΩ æBBA BBAB BΩbA ABBB ΩAΩæ bæΩB æΩBB ææAb BBΩæ bBbæ ΩBbB æbΩB AbBB bbAA Ωbæb bBææ ABbæ ΩæBb AæAA BΩΩΩ BBAΩ BBæb BAbB BBBA ΩΩbB BBæB BbAb ABBæ BBAB Ωæææ ΩΩBb bbæΩ bæBæ AæAB BbæB ΩbAB BbAb æΩAB ΩbBæ AbBb AæbA bæAB bAbA ABæB BBæΩ BææB æΩBΩ BBæB bΩbb BbBA ΩBbB æBBæ AAAb AæBb ΩBBB bΩbB Ωæbæ AΩbΩ BbBA ΩæAΩ Bæææ BBΩb ABΩA ΩΩAB bBbB AææΩ Ωbbb BAbA BæBΩ ΩAΩB BBBæ æBΩæ BBæA ΩAbA ΩæbΩ BbAB æBbæ ææΩB AΩAB æBbB æbBB ABΩæ BΩbB bAAΩ æbBb BΩBB bbBA ΩABB bΩAæ bBæb BBΩæ AbΩæ æBæB æBΩb bΩBB","mode":"text","instructions":"Good job. Tim
 e to type jumbles."},{"text":"æbBΩ BBæA ΩΩæB ΩbΩB ΩBΩΩ AΩΩΩ BBBA ΩABæ Bbbæ ææAA BABB AæBB BBΩB æBææ bΩæA BbΩb bbAb BæAB BbBæ bBBB BæbB BBæb ΩAΩA æAbb BABB bABΩ BæΩB BBBb ææBB BbAB æBΩΩ bæΩA ææΩA ΩΩbB BBæB ABæB ΩΩBA AbAB BBæΩ ΩBæb ΩæAΩ BææB AAæB BæΩæ BbbB ææBæ bbBB BΩæΩ ΩBBB BBæΩ ΩΩBb bAAb BΩBæ bΩBb ΩBæB Bbæb BæBb ΩΩΩb æBΩΩ bBbB BBBb BΩbΩ BBBæ ΩæΩæ BBΩb BbBb bææb æΩΩb bBAb AΩBæ bΩΩΩ æbAB bBBæ æBBb ΩæBæ BBBb bæBΩ AAæA æBAæ BBΩB ΩΩBb bAæΩ bAΩb BbΩΩ æAææ AææA BææB BBΩA AΩbB ABBΩ bΩbB bAææ bAæΩ bΩBB BAAB bbBΩ bbBΩ ABBB Ωææb bæBæ","mode":"text","instructions":"Keep practicing these jumbles."},{"text":"BΩAB AΩbA æAΩæ bBAΩ AbbΩ Ωæbæ BæBB BBbb BBΩb AæΩA BAΩb BABb ææBB BBBæ æΩbΩ bBBB æΩbA BAAA BbæB BBbA BBBΩ ΩΩΩb bΩBB æbæA BbBb ΩBBæ BBBΩ ΩææΩ BBBb AæBA AABb BbbΩ æbBæ ΩbΩB BbbB ΩbΩB BBBΩ BBbA
  ΩæBæ BæΩB æΩBb bΩAB BæBæ ABBΩ æBæb BBæA æABΩ æBæb bææΩ AbAA ABbb ΩΩæA BΩbA Bæbæ BAbb AbbA ææBΩ BΩææ ΩΩæB bΩæA BBbB BæBæ BBBB BΩΩB bBbB BBΩB bbAΩ æAΩΩ AbΩb Bæbæ ΩæBb BΩBb æbBB AΩbA BbBB BææA ΩæBΩ BΩbB ΩBAB ΩBBB æBbB ΩBæΩ æBæB æBBæ bBΩæ bbΩB ΩBbΩ BΩæA BbAæ ΩBBB bΩBA ΩABΩ ΩΩAæ ΩBBb BbBB ABΩæ ABΩA bæbA bææΩ BæAB","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":" ","mode":"key","instructions":"$report"}],"order":-1,"type":"normal","name":"Test lesson","description":"This lesson exists to test out obscure Typing Turtle features.\nPlease skip it by pressing the arrow button to the right."}
\ No newline at end of file
diff --git a/lessons/en_US/toprow.lesson b/lessons/en_US/toprow.lesson
index f099a38..079a373 100644
--- a/lessons/en_US/toprow.lesson
+++ b/lessons/en_US/toprow.lesson
@@ -1 +1 @@
-{"order":2,"steps":[{"text":"\n","mode":"key","instructions":"Welcome to the The Top Row lesson!\n\nIn this lesson, you will learn the q, w, e, r, t, y, u, i, o and p keys.  Press the ENTER key when you are ready to begin!"},{"text":"q","mode":"key","instructions":"Press the q key with your left little finger."},{"text":"w","mode":"key","instructions":"Press the w key with your left ring finger."},{"text":"e","mode":"key","instructions":"Press the e key with your left middle finger."},{"text":"r","mode":"key","instructions":"Press the r key with your left index finger."},{"text":"t","mode":"key","instructions":"Press the t key with your left index finger."},{"text":"y","mode":"key","instructions":"Press the y key with your right index finger."},{"text":"u","mode":"key","instructions":"Press the u key with your right index finger."},{"text":"i","mode":"key","instructions":"Press the i key with your right middle finger."},{"text":"o","mode":"key","instructions":"Press the o ke
 y with your right ring finger."},{"text":"p","mode":"key","instructions":"Press the p key with your right little finger."},{"text":"ee oo ii ee oo oo pp oo ii qq uu rr ww pp yy qq rr ee ww qq tt tt pp yy rr rr tt ww qq ww yy ww uu oo yy tt oo rr qq ww","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"pp uu tt ii tt ii ww ii ii uu tt ee tt tt pp ee tt tt pp tt ii ii yy ee pp rr ii tt pp qq pp oo ii pp rr yy ee qq qq uu","mode":"text","instructions":"Keep practicing the new keys."},{"text":"or te uq eu uy ur iy ei ip iu tw yr ut re eq ew pw wi pi pi wr yw to oy oe wp ut pe ry iu iw uy rr ti yu ty ut ww py iw po uw po pr ye wo iw tw oi py","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"uq pp ry rw yw wt tw pp ou yo ii te uw to rt tu pr rq oy ty wy pt qu ip ei ee oi ti pe ru ot tr iy oi yt wr ru pt yt pe oo ui rt iu wi rr ui ip ot ei","mode":"text","instructions":"Keep practicing key pairs.
 "},{"text":"ef tu lp rg fw py uy ow ew ik ft po le qu dq ro yi do up kp tt yf gt pa wd tt eg oh qu up yp wa gi ik ol oj yj sr ir ap rq ti fr yg tp eh dt iq dw ok","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"ia pf pj is ug yg rj ae yr pw yo ar yi pw pg id ri rt il ge wf uk gp ft ap rg eq og id hy tp og aq hr tp rf ug ot ry pa ig fo ji uk yd je pk uw iw lw","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"surefire solely fiat fed flukey testify atrial suppose drolly lawyer koala wall washer ugly legwork rigged killjoy firer flay southpaw hula quietly those sagely diaper ethyl lipread tattler superior hod reap tidy lopsided letup thyself degree works fatality shay relight dishes soda furor twirly spurge taper horde wrath hay jest draft trooper stuffy sure keg aloft pleura retool addle lee pa aside edgewise august shuffle tortured yaw leafage roadster powder are fraught ego jut daddy drill pa
 yer literary headrest quart jeweled wow dowdy tarsus stopple tither steal roguery jostle solute superego folder guy shit keepsake fretsaw hallowed yippee swatter spottily","mode":"text","instructions":"You did it! Time to type real words."},{"text":"pesky supply fetish tread hadst rust oh thereof wrestle yodeler fillip aerator riotous distort gorily flukey high settle wide papal futility firth grayish protege aspire digital draft laetrile palette slug stuff derriere willow polarity wail await fig staid ref theorist odious watt glister stylist torpor hasp prey result parfait shorty pule pail grout hardly roster fifty gutter your sport people garde pusher upshot applier sully parlous freeware jilt tepee titled psst fleurs equator whisky west housetop agitator stet soapy eyeteeth jaws you pathos target pshaw plead tailpipe distrust fretful fitful airport field reroute wastes adopter drowsily kirk waterway whew purpose","mode":"text","instructions":"Keep practicing these words."
 },{"text":"jotter wheels far wright edit footwear ligate aerator paralyse trellis lard settle filter ole fury pj liftoff upshot foppish fruit risotto doter whoreish settee sashay phase altruist foot plethora oop aquaria polestar dippy skill graduate fakir fearless spate peat fireside epithet stead wordage lettered defy austral payoff keyword wiles wight press yak witless paltry route direly qua doggedly life grafter ploy rapper pothead desolate douse letterer hots slight graduate epithet leg propose weep fellatio whoso whale larkspur kelp diffuse aft steal treasury greedily error troupe steeple toiler liaise loggia straw rudely testator rattler rap defray studies outpost waffler raggedy goodwill skylark sigh sled stoker williwaw situated sapwood lifter whose leery praise wailer golly rightful op piffle swat ridged physique rehouse allude diarist esthete tripodal putout ate shirker strudel towhead dado plaid lethargy greeter fluidity slipway pulp hydra ate distil satiety roug
 e prophesy progress depth utility greatly sell rootlet puttee tassel raggedly squire wisp porous poster walkaway flirt rearrest wishy altar prate irate appeal sheepdog hippie saggy tete largish lope floe trike doer sheet ghost glassed salaried kaiser party awoke quietly steeply outlaw skewed odyssey otiose ratifier goitre diereses earthy squiggly filthily repute wapiti prudery wittily lollypop disguise stuffy slog tertiary","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":"\n","mode":"key","instructions":"$report"}],"name":"The Top Row","medals":[{"wpm":5,"name":"bronze","accuracy":60},{"wpm":10,"name":"silver","accuracy":75},{"wpm":20,"name":"gold","accuracy":90}],"description":"This lesson teaches you the q, w, e, r, t, y, u, i, o and p keys \non the top row of the keyboard."}
\ No newline at end of file
+{"steps":[{"text":"\n","mode":"key","instructions":"In this lesson, you will learn the q, w, e, r, t, y, u, i, o and p keys.\n\nPress the ENTER key when you are ready to begin!"},{"text":"q","mode":"key","instructions":"Press the q key with your left little finger."},{"text":"w","mode":"key","instructions":"Press the w key with your left ring finger."},{"text":"e","mode":"key","instructions":"Press the e key with your left middle finger."},{"text":"r","mode":"key","instructions":"Press the r key with your left index finger."},{"text":"t","mode":"key","instructions":"Press the t key with your left index finger."},{"text":"y","mode":"key","instructions":"Press the y key with your right index finger."},{"text":"u","mode":"key","instructions":"Press the u key with your right index finger."},{"text":"i","mode":"key","instructions":"Press the i key with your right middle finger."},{"text":"o","mode":"key","instructions":"Press the o key with your right ring finger."},{"text":"p","
 mode":"key","instructions":"Press the p key with your right little finger."},{"text":"ee oo ii ee oo oo pp oo ii qq uu rr ww pp yy qq rr ee ww qq tt tt pp yy rr rr tt ww qq ww yy ww uu oo yy tt oo rr qq ww","mode":"text","instructions":"You did it! Practice typing the keys you just learned."},{"text":"pp uu tt ii tt ii ww ii ii uu tt ee tt tt pp ee tt tt pp tt ii ii yy ee pp rr ii tt pp qq pp oo ii pp rr yy ee qq qq uu","mode":"text","instructions":"Keep practicing the new keys."},{"text":"or te uq eu uy ur iy ei ip iu tw yr ut re eq ew pw wi pi pi wr yw to oy oe wp ut pe ry iu iw uy rr ti yu ty ut ww py iw po uw po pr ye wo iw tw oi py","mode":"text","instructions":"Nice work. Now put the keys together into pairs."},{"text":"uq pp ry rw yw wt tw pp ou yo ii te uw to rt tu pr rq oy ty wy pt qu ip ei ee oi ti pe ru ot tr iy oi yt wr ru pt yt pe oo ui rt iu wi rr ui ip ot ei","mode":"text","instructions":"Keep practicing key pairs."},{"text":"ef tu lp rg fw py uy ow ew ik ft p
 o le qu dq ro yi do up kp tt yf gt pa wd tt eg oh qu up yp wa gi ik ol oj yj sr ir ap rq ti fr yg tp eh dt iq dw ok","mode":"text","instructions":"Good job. Now practice all the keys you know."},{"text":"ia pf pj is ug yg rj ae yr pw yo ar yi pw pg id ri rt il ge wf uk gp ft ap rg eq og id hy tp og aq hr tp rf ug ot ry pa ig fo ji uk yd je pk uw iw lw","mode":"text","instructions":"Almost done.  Keep practicing all the keys you know."},{"text":"surefire solely fiat fed flukey testify atrial suppose drolly lawyer koala wall washer ugly legwork rigged killjoy firer flay southpaw hula quietly those sagely diaper ethyl lipread tattler superior hod reap tidy lopsided letup thyself degree works fatality shay relight dishes soda furor twirly spurge taper horde wrath hay jest draft trooper stuffy sure keg aloft pleura retool addle lee pa aside edgewise august shuffle tortured yaw leafage roadster powder are fraught ego jut daddy drill payer literary headrest quart jeweled wow dowdy 
 tarsus stopple tither steal roguery jostle solute superego folder guy shit keepsake fretsaw hallowed yippee swatter spottily","mode":"text","instructions":"You did it! Time to type real words."},{"text":"pesky supply fetish tread hadst rust oh thereof wrestle yodeler fillip aerator riotous distort gorily flukey high settle wide papal futility firth grayish protege aspire digital draft laetrile palette slug stuff derriere willow polarity wail await fig staid ref theorist odious watt glister stylist torpor hasp prey result parfait shorty pule pail grout hardly roster fifty gutter your sport people garde pusher upshot applier sully parlous freeware jilt tepee titled psst fleurs equator whisky west housetop agitator stet soapy eyeteeth jaws you pathos target pshaw plead tailpipe distrust fretful fitful airport field reroute wastes adopter drowsily kirk waterway whew purpose","mode":"text","instructions":"Keep practicing these words."},{"text":"jotter wheels far wright edit footw
 ear ligate aerator paralyse trellis lard settle filter ole fury pj liftoff upshot foppish fruit risotto doter whoreish settee sashay phase altruist foot plethora oop aquaria polestar dippy skill graduate fakir fearless spate peat fireside epithet stead wordage lettered defy austral payoff keyword wiles wight press yak witless paltry route direly qua doggedly life grafter ploy rapper pothead desolate douse letterer hots slight graduate epithet leg propose weep fellatio whoso whale larkspur kelp diffuse aft steal treasury greedily error troupe steeple toiler liaise loggia straw rudely testator rattler rap defray studies outpost waffler raggedy goodwill skylark sigh sled stoker williwaw situated sapwood lifter whose leery praise wailer golly rightful op piffle swat ridged physique rehouse allude diarist esthete tripodal putout ate shirker strudel towhead dado plaid lethargy greeter fluidity slipway pulp hydra ate distil satiety rouge prophesy progress depth utility greatly sell
  rootlet puttee tassel raggedly squire wisp porous poster walkaway flirt rearrest wishy altar prate irate appeal sheepdog hippie saggy tete largish lope floe trike doer sheet ghost glassed salaried kaiser party awoke quietly steeply outlaw skewed odyssey otiose ratifier goitre diereses earthy squiggly filthily repute wapiti prudery wittily lollypop disguise stuffy slog tertiary","mode":"text","instructions":"Almost finished. Try to type as quickly and accurately as you can!"},{"text":" ","mode":"key","instructions":"$report"}],"order":2,"type":"normal","name":"The Top Row","description":"This lesson teaches you the q, w, e, r, t, y, u, i, o and p keys \non the top row of the keyboard."}
\ No newline at end of file
diff --git a/lessonscreen.py b/lessonscreen.py
index fbe38fd..0babc07 100644
--- a/lessonscreen.py
+++ b/lessonscreen.py
@@ -144,7 +144,7 @@ class LessonScreen(gtk.VBox):
         gobject.timeout_add(1000, self.timer_cb)
 
     def realize_cb(self, widget):
-        self.activity.add_events(gtk.gdk.KEY_PRESS_MASK)
+        self.activity.add_events(gtk.gdk.KEY_PRESS_MASK|gtk.gdk.KEY_RELEASE_MASK)
         self.key_press_cb_id = self.activity.connect('key-press-event', self.key_cb)
         self.key_release_cb_id = self.activity.connect('key-release-event', self.key_cb)
         
@@ -433,7 +433,7 @@ class LessonScreen(gtk.VBox):
                         self.advance_step()
                     else:
                         self.begin_line()
-                    return
+                    return False
                 
                 self.update_stats()
                 
diff --git a/mainscreen.py b/mainscreen.py
index 63e4d04..01ecc27 100644
--- a/mainscreen.py
+++ b/mainscreen.py
@@ -26,7 +26,7 @@ import sugar.activity.activity
 from sugar.graphics import *
 
 # Import activity modules.
-import lessonscreen, medalscreen
+import lessonscreen, medalscreen, balloongame
 
 # Temporary SVGs of medals from Wikimedia Commons.
 # See the links below for licensing information.
@@ -245,7 +245,12 @@ class MainScreen(gtk.VBox):
         self.show_lesson(self.lesson_index-1)
     
     def lesson_clicked_cb(self, widget):
-        self.activity.push_screen(lessonscreen.LessonScreen(self.visible_lesson, self.activity))
+        if self.visible_lesson['type'] == 'balloon':
+            reload(balloongame)
+            self.activity.push_screen(balloongame.BalloonGame(self.visible_lesson, self.activity))
+        else:
+            reload(lessonscreen)
+            self.activity.push_screen(lessonscreen.LessonScreen(self.visible_lesson, self.activity))
     
     def medal_clicked_cb(self, widget):
         if self.activity.data['medals'].has_key(self.visible_lesson['name']):
-----------------------------------------------------------------------


--
/home/olpc-code/git/activities/typing-turtle


More information about the Commits mailing list