[Commits] typing-turtle branch master updated.

Wade Brainerd wadetb at gmail.com
Wed Jan 28 00:23:47 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  6fb4ec696e195691cc6611b981fc50fbfb5a4f76 (commit)
      from  60fb90236061243e9f873e38674d258ffd76a097 (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                                     |   94 +++++++-
 keyboard.py                                        |    7 +-
 lessonbuilder                                      |   42 +++-
 lessons/en_US/MAKELESSONS                          |   55 ++++-
 lessons/en_US/MAKETESTLESSONS                      |   10 +-
 lessons/en_US/bottomrow.lesson                     |    5 +-
 lessons/en_US/bottomrowgame.lesson                 |  228 ++++++++++++++++++++
 lessons/en_US/homerow.lesson                       |    3 +
 lessons/en_US/homerowballoon.lesson                |    5 +-
 .../{homerowballoon.lesson => homerowgame.lesson}  |  129 ++++++------
 lessons/en_US/intro.lesson                         |    3 +
 lessons/en_US/leftcapital.lesson                   |    5 +-
 lessons/en_US/leftcapitalgame.lesson               |  228 ++++++++++++++++++++
 lessons/en_US/rightcapital.lesson                  |   22 +-
 lessons/en_US/rightcapitalgame.lesson              |  228 ++++++++++++++++++++
 lessons/en_US/test.lesson                          |   84 +++++++-
 lessons/en_US/toprow.lesson                        |    3 +
 lessons/en_US/toprowgame.lesson                    |  228 ++++++++++++++++++++
 lessonscreen.py                                    |    2 -
 medalscreen.py                                     |   31 ++--
 20 files changed, 1283 insertions(+), 129 deletions(-)
 create mode 100644 lessons/en_US/bottomrowgame.lesson
 copy lessons/en_US/{homerowballoon.lesson => homerowgame.lesson} (91%)
 create mode 100644 lessons/en_US/leftcapitalgame.lesson
 create mode 100644 lessons/en_US/rightcapitalgame.lesson
 create mode 100644 lessons/en_US/toprowgame.lesson

- Log -----------------------------------------------------------------
commit 6fb4ec696e195691cc6611b981fc50fbfb5a4f76
Author: Wade Brainerd <wadetb at gmail.com>
Date:   Wed Jan 28 05:23:14 2009 +0000

    Add some more game lessons.  Fix some bugs.  Add a new text lesson type to lessonbuilder.

diff --git a/balloongame.py b/balloongame.py
index 096a8df..3e4b947 100644
--- a/balloongame.py
+++ b/balloongame.py
@@ -14,7 +14,7 @@
 # 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
+import random, datetime
 from gettext import gettext as _
 
 import gobject, pygtk, gtk, pango
@@ -23,8 +23,14 @@ import gobject, pygtk, gtk, pango
 # parameters about them.
 BALLOON_STAGES = [
     { 'count': 10, 'delay': 80 },
-    { 'count': 20, 'delay': 60 },
-    { 'count': 70, 'delay': 40 },
+    #{ 'count': 20, 'delay': 60 },
+    #{ 'count': 70, 'delay': 40 },
+]
+
+DEFAULT_MEDALS = [
+    { 'name': 'bronze', 'score': 4000 },
+    { 'name': 'silver', 'score': 6000 },
+    { 'name': 'gold',   'score': 10000 }
 ]
 
 class Balloon:
@@ -81,6 +87,7 @@ class BalloonGame(gtk.VBox):
         self.stage = BALLOON_STAGES[self.stage_idx]
         self.count_left = self.stage['count']
 
+        self.medal = None
         self.finished = False
 
         # Start the animation loop running.        
@@ -187,8 +194,7 @@ class BalloonGame(gtk.VBox):
                 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()
+            self.finish_game()
  
         return True
 
@@ -205,20 +211,84 @@ class BalloonGame(gtk.VBox):
         self.area.window.draw_rectangle(gc, False, x, y, w, h)
 
         # Draw text
-        report = _('You finished the game!')
-        report += '\n\n'
-        report += _('Your score was %(score)d.') % { 'score': self.score }
-        report += '\n\n'
+        gc.foreground = self.area.get_colormap().alloc_color(0,0,0)
+
+        title = _('You finished!') + '\n'
+        layout = self.area.create_pango_layout(title)
+        layout.set_font_description(pango.FontDescription('Serif Bold 16'))    
+        size = layout.get_size()
+        tx = x+w/2-(size[0]/pango.SCALE)/2
+        ty = y + 100
+        self.area.window.draw_layout(gc, tx, ty, layout)
+
+        report = ''
+        report += _('Your score was %(score)d.') % { 'score': self.score } + '\n'
+        if self.medal:
+            report += _('You earned a %(type)s medal!') % self.medal + '\n'
+        report += '\n'
         report += _('Press the ENTER key to continue.')
     
-        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'))    
+        layout.set_font_description(pango.FontDescription('Times 12'))    
         size = layout.get_size()
         tx = x+w/2-(size[0]/pango.SCALE)/2
-        ty = y+h/2-(size[1]/pango.SCALE)/2
+        ty = y + 200
         self.area.window.draw_layout(gc, tx, ty, layout)
 
+    def finish_game(self):
+        self.finished = True
+
+        # Add to the lesson history.
+        report = { 
+            'lesson': self.lesson['name'],
+            'score': self.score,
+        }
+        self.activity.add_history(report)
+
+        # Show the medal screen, if one should be given.
+        got_medal = None
+        
+        medals = self.lesson.get('medals', DEFAULT_MEDALS)
+        for medal in medals:
+            if self.score >= medal['score']:
+                got_medal = medal['name']
+        
+        if got_medal:
+            # Award the medal.
+            medal = {
+                'lesson': self.lesson['name'],
+                'type': got_medal,
+                'date': datetime.date.today().strftime('%B %d, %Y'),
+                'nick': self.activity.owner.props.nick,
+                'score': self.score
+            }
+            self.medal = medal
+
+            # Compare this medal with any existing medals for this lesson.
+            # Only record the best one.
+            add_medal = True
+            if self.activity.data['medals'].has_key(self.lesson['name']):
+                old_medal = self.activity.data['medals'][self.lesson['name']]
+
+                order = ' '.join([m['name'] for m in medals])
+                add_idx = order.index(medal['type'])
+                old_idx = order.index(old_medal['type']) 
+
+                if add_idx < old_idx:
+                    add_medal = False
+                elif add_idx == old_idx:
+                    if medal['score'] < old_medal['score']:
+                        add_medal = False
+            
+            if add_medal:
+                self.activity.data['motd'] = 'newmedal'
+                self.activity.data['medals'][self.lesson['name']] = medal
+                
+                # Refresh the main screen given the new medal.
+                self.activity.mainscreen.show_lesson(self.activity.mainscreen.lesson_index)
+
+        self.queue_draw()
+
     def queue_draw_balloon(self, b):
         x1 = int(b.x - b.size/2)
         y1 = int(b.y - b.size/2)
diff --git a/keyboard.py b/keyboard.py
index 763d715..bab91ad 100644
--- a/keyboard.py
+++ b/keyboard.py
@@ -243,7 +243,9 @@ class KeyboardData:
         # Access the current GTK keymap.
         self.keymap = gtk.gdk.keymap_get_default()
 
-    def set_layout(self, layout): pass
+    def set_layout(self, layout): 
+        pass
+
     def _build_key_list(self, layout):
         """Builds a list of Keys objects from a layout description.  
            Also fills in derived and inherited key properties.  
@@ -460,7 +462,6 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
 
         # Outline rounded box.
         gc.foreground = self.get_colormap().alloc_color((0.4*65536),int(0.7*65536),int(0.4*65536))
-        #gc.foreground = self.get_colormap().alloc_color(int(0.1*65536),int(0.1*65536),int(0.1*65536))
         
         corner = 5
         points = [
@@ -541,7 +542,7 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
                     if finger[0] == 'L':
                         rhand_image = self.rhand_shift 
                     else:
-                        rhand_image = self.lhand_shift 
+                        lhand_image = self.lhand_shift 
 
                 # TODO: Do something about ALTGR.
 
diff --git a/lessonbuilder b/lessonbuilder
index ebc8b0e..ec7f255 100755
--- a/lessonbuilder
+++ b/lessonbuilder
@@ -291,8 +291,10 @@ def build_game_words(
         all_keys=all_keys, req_keys=new_keys, 
         minlen=2, maxlen=8, 
         bad_words=bad_words)
+
+    random.shuffle(good_words)
     
-    return good_words 
+    return good_words[:200]
 
 def build_key_steps(
     count, new_keys, base_keys, 
@@ -417,6 +419,20 @@ def build_intro_steps():
 
     return steps 
 
+def build_text_step(path):
+    steps = []
+
+    instructions = _('Copy out the following text.')
+
+    try:
+        text = unicode(open(path, 'r').read())
+    except:
+        text = ''
+
+    steps.append(make_step(instructions, 'text', text))
+
+    return steps
+
 if __name__ == "__main__":
     import optparse
     parser = optparse.OptionParser("usage: %prog [options]")
@@ -439,16 +455,20 @@ if __name__ == "__main__":
                       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("--text-file", dest="text_file", metavar="FILE",
+                      help="Text file containing the lesson text.")
     parser.add_option("--game", dest="game", metavar="TYPE", default='balloon',
                       help="Type of game to use.  Currently just 'balloon'.")
     parser.add_option("--output", dest="output", metavar="FILE",
-                      help="Output file.")
+                      help="Output file (*.lesson).")
 
     type_group = optparse.OptionGroup(parser, 
         'Lesson Types', 
         'You must pass a lesson type to control the kind of lesson created.')
     type_group.add_option("--intro-lesson", dest="make_intro_lesson", action="store_true",
                       help="Generate the introductory lesson.")
+    type_group.add_option("--text-lesson", dest="make_text_lesson", action="store_true",
+                      help="Generate a lesson from a text source such as a paragraph.")
     type_group.add_option("--key-lesson", dest="make_key_lesson", action="store_true",
                       help="Generate a lesson to teach a specific set of keys.")
     type_group.add_option("--game-lesson", dest="make_game_lesson", action="store_true",
@@ -457,7 +477,7 @@ if __name__ == "__main__":
 
     medal_group = optparse.OptionGroup(parser, 
         'Medal Requirements', 
-        'Optionally pass these arguments to override medal requirements.')
+        'Pass these arguments to set medal requirements.')
     medal_group.add_option("--bronze-wpm", dest="bronze_wpm", type="int", metavar="N", default=15,
                       help="Words per minute for a Bronze medal.  Default 15.")
     medal_group.add_option("--silver-wpm", dest="silver_wpm", type="int", metavar="N", default=20,
@@ -470,6 +490,12 @@ if __name__ == "__main__":
                       help="Accuracy for a Silver medal.  Default 80.")
     medal_group.add_option("--gold-acc", dest="gold_accuracy", type="int", metavar="N", default=90,
                       help="Accuracy for a Gold medal.  Default 90.")
+    medal_group.add_option("--bronze-score", dest="bronze_score", type="int", metavar="N", default=4000,
+                      help="Game score for a Bronze medal.  Default 4000.")
+    medal_group.add_option("--silver-score", dest="silver_score", type="int", metavar="N", default=6000,
+                      help="Game score  for a Silver medal.  Default 6000.")
+    medal_group.add_option("--gold-score", dest="gold_score", type="int", metavar="N", default=10000,
+                      help="Game score for a Gold medal.  Default 10000.")
     parser.add_option_group(medal_group)
 
     (options, args) = parser.parse_args()
@@ -502,9 +528,9 @@ if __name__ == "__main__":
     lesson['order'] = options.order
 
     lesson['medals'] = [ 
-        { 'name': 'bronze', 'wpm': options.bronze_wpm, 'accuracy': options.bronze_accuracy },
-        { 'name': 'silver', 'wpm': options.silver_wpm, 'accuracy': options.silver_accuracy },
-        { 'name': 'gold',   'wpm': options.gold_wpm,   'accuracy': options.gold_accuracy },
+        { 'name': 'bronze', 'wpm': options.bronze_wpm, 'accuracy': options.bronze_accuracy, 'score': options.bronze_score },
+        { 'name': 'silver', 'wpm': options.silver_wpm, 'accuracy': options.silver_accuracy, 'score': options.silver_score },
+        { 'name': 'gold',   'wpm': options.gold_wpm,   'accuracy': options.gold_accuracy,   'score': options.gold_score },
     ]
 
     if options.make_intro_lesson:
@@ -520,6 +546,10 @@ if __name__ == "__main__":
             count=options.length, new_keys=options.keys, base_keys=options.base_keys, 
             words=words, bad_words=bad_words)
 
+    elif options.make_text_lesson:
+        lesson['type'] = 'normal'
+        lesson['steps'] = build_text_step(options.text_file)
+
     elif options.make_game_lesson:
         if not options.wordlist:
             parser.error('no wordlist file given')
diff --git a/lessons/en_US/MAKELESSONS b/lessons/en_US/MAKELESSONS
index 0cca2ee..61c9fb5 100755
--- a/lessons/en_US/MAKELESSONS
+++ b/lessons/en_US/MAKELESSONS
@@ -47,13 +47,13 @@
     --output=homerow.lesson
     
 ../../lessonbuilder --game-lesson \
-    --title="Home Row Balloon Practice" \
+    --title="Home Row Balloons" \
     --desc="Practice the home row keys in this exciting game!\nDon't let any balloons get by!" \
     --keys="asdfghjkl" \
     --game='balloon' \
     --wordlist=5desk.txt --badwordlist=badwords.txt \
     --order=2 \
-    --output=homerowballoon.lesson
+    --output=homerowgame.lesson
     
 ../../lessonbuilder --key-lesson \
     --title="The Top Row" \
@@ -63,29 +63,64 @@
     --order=3 \
     --output=toprow.lesson
 
+../../lessonbuilder --game-lesson \
+    --title="Top Row Balloons" \
+    --desc="Practice the top row keys in this exciting game!\nDon't let any balloons get by!" \
+    --keys="qwertyuiop" --base-keys="asdfghjkl" \
+    --game='balloon' \
+    --wordlist=5desk.txt --badwordlist=badwords.txt \
+    --order=4 \
+    --output=toprowgame.lesson
+    
 ../../lessonbuilder --key-lesson \
     --title="The Bottom Row" \
     --desc="This lesson teaches you the z, x, c, v, b, n and m keys \non the bottom row of the keyboard." \
     --keys="zxcvbnm" --base-keys="asdfghjklqwertyuiop" \
     --wordlist=5desk.txt --badwordlist=badwords.txt \
-    --order=4 \
+    --order=5 \
     --output=bottomrow.lesson
 
+../../lessonbuilder --game-lesson \
+    --title="Bottom Row Balloons" \
+    --desc="Practice the bottom row keys in this exciting game!\nDon't let any balloons get by!" \
+    --keys="zxcvbnm" --base-keys="asdfghjklqwertyuiop" \
+    --game='balloon' \
+    --wordlist=5desk.txt --badwordlist=badwords.txt \
+    --order=6 \
+    --output=bottomrowgame.lesson
+    
 # Generate left and right hand capital lessons.
 ../../lessonbuilder --key-lesson \
     --title="Left Hand Capitals" \
     --desc="This lesson teaches you the CAPITAL letters which are typed \nby your left hand.\nThese are Q, W, E, R, T, A, S, D, F, G, Z, X, C, V and B." \
-    --keys="QWERTASDFGZXCVB" \
-    --base-keys="abcdefghijklmnopqrstuvwxyz" \
+    --keys="QWERTASDFGZXCVB" --base-keys="abcdefghijklmnopqrstuvwxyz" \
     --wordlist=5desk.txt --badwordlist=badwords.txt \
-    --order=5 \
+    --order=7 \
     --output=leftcapital.lesson
 
+../../lessonbuilder --game-lesson \
+    --title="Left Hand Capital Balloons" \
+    --desc="Practice the left hand CAPITAL letters!\nDon't let any balloons get by!" \
+    --keys="QWERTASDFGZXCVB" --base-keys="abcdefghijklmnopqrstuvwxyz" \
+    --game='balloon' \
+    --wordlist=5desk.txt --badwordlist=badwords.txt \
+    --order=8 \
+    --output=leftcapitalgame.lesson
+    
 ../../lessonbuilder --key-lesson \
     --title="Right Hand Capitals" \
-    --desc="This lesson teaches you the CAPITAL letters which are typed \nby your right hand.\nThese are Y, U, I, O, P, H, J, K, L, B, N, and M." \
-    --keys="YUIOPHJKLBNM" \
-    --base-keys="abcdefghijklmnopqrstuvwxyzQWERTASDFGZXCVB" \
+    --desc="This lesson teaches you the CAPITAL letters which are typed \nby your right hand.\nThese are Y, U, I, O, P, H, J, K, L, N, and M." \
+    --keys="YUIOPHJKLNM" --base-keys="abcdefghijklmnopqrstuvwxyzQWERTASDFGZXCVB" \
     --wordlist=5desk.txt --badwordlist=badwords.txt \
-    --order=6 \
+    --order=9 \
     --output=rightcapital.lesson
+
+../../lessonbuilder --game-lesson \
+    --title="Right Hand Capital Balloons" \
+    --desc="Practice the right hand CAPITAL letters!\nDon't let any balloons get by!" \
+    --keys="YUIOPHJKLNM" --base-keys="abcdefghijklmnopqrstuvwxyzQWERTASDFGZXCVB" \
+    --game='balloon' \
+    --wordlist=5desk.txt --badwordlist=badwords.txt \
+    --order=10 \
+    --output=rightcapitalgame.lesson
+    
diff --git a/lessons/en_US/MAKETESTLESSONS b/lessons/en_US/MAKETESTLESSONS
index 5ae8978..fd7c4c4 100755
--- a/lessons/en_US/MAKETESTLESSONS
+++ b/lessons/en_US/MAKETESTLESSONS
@@ -1,10 +1,12 @@
 ../../lessonbuilder --game-lesson \
-    --title="Balloon game test" \
-    --desc="." \
+    --title="Home Row Balloon Practice" \
+    --desc="Practice the home row keys in this exciting game!\nDon't let any balloons get by!" \
+    --bronze-score=500 --silver-score=1000 --gold-score=1500 \
     --keys="asdfghjkl" \
-    --wordlist=2of12.txt \
+    --game='balloon' \
+    --wordlist=5desk.txt --badwordlist=badwords.txt \
     --order=-2 \
-    --output=balloon-test.lesson
+    --output=homerowballoon.lesson
 
 ../../lessonbuilder --key-lesson \
     --title="Test lesson" \
diff --git a/lessons/en_US/bottomrow.lesson b/lessons/en_US/bottomrow.lesson
index b4a30b6..830e5f9 100644
--- a/lessons/en_US/bottomrow.lesson
+++ b/lessons/en_US/bottomrow.lesson
@@ -4,21 +4,24 @@
         {
             "accuracy": 70, 
             "name": "bronze", 
+            "score": 4000, 
             "wpm": 15
         }, 
         {
             "accuracy": 80, 
             "name": "silver", 
+            "score": 6000, 
             "wpm": 20
         }, 
         {
             "accuracy": 90, 
             "name": "gold", 
+            "score": 10000, 
             "wpm": 25
         }
     ], 
     "name": "The Bottom Row", 
-    "order": 4, 
+    "order": 5, 
     "steps": [
         {
             "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!", 
diff --git a/lessons/en_US/bottomrowgame.lesson b/lessons/en_US/bottomrowgame.lesson
new file mode 100644
index 0000000..40984c3
--- /dev/null
+++ b/lessons/en_US/bottomrowgame.lesson
@@ -0,0 +1,228 @@
+{
+    "description": "Practice the bottom row keys in this exciting game!\nDon't let any balloons get by!", 
+    "medals": [
+        {
+            "accuracy": 70, 
+            "name": "bronze", 
+            "score": 4000, 
+            "wpm": 15
+        }, 
+        {
+            "accuracy": 80, 
+            "name": "silver", 
+            "score": 6000, 
+            "wpm": 20
+        }, 
+        {
+            "accuracy": 90, 
+            "name": "gold", 
+            "score": 10000, 
+            "wpm": 25
+        }
+    ], 
+    "name": "Bottom Row Balloons", 
+    "order": 6, 
+    "type": "balloon", 
+    "words": [
+        "gambol", 
+        "modeling", 
+        "carol", 
+        "directly", 
+        "overact", 
+        "wand", 
+        "bearded", 
+        "upland", 
+        "siding", 
+        "tonight", 
+        "perfect", 
+        "meddle", 
+        "tinny", 
+        "lave", 
+        "gnomon", 
+        "kitsch", 
+        "flan", 
+        "misguide", 
+        "reboot", 
+        "minimum", 
+        "mot", 
+        "ventral", 
+        "heavens", 
+        "bidding", 
+        "parabola", 
+        "vocalize", 
+        "brawling", 
+        "cottar", 
+        "cue", 
+        "bung", 
+        "centred", 
+        "bran", 
+        "stringer", 
+        "harken", 
+        "whenever", 
+        "telling", 
+        "budder", 
+        "redesign", 
+        "meronymy", 
+        "fielding", 
+        "bombed", 
+        "toolbar", 
+        "anise", 
+        "clone", 
+        "unisex", 
+        "bulgy", 
+        "stammer", 
+        "clamping", 
+        "hazer", 
+        "delusive", 
+        "obsidian", 
+        "tankful", 
+        "headlamp", 
+        "limy", 
+        "toxicity", 
+        "fleck", 
+        "miff", 
+        "recall", 
+        "screech", 
+        "clangour", 
+        "verdict", 
+        "bud", 
+        "clerk", 
+        "slattern", 
+        "vim", 
+        "charcoal", 
+        "barker", 
+        "icily", 
+        "beanpole", 
+        "ignition", 
+        "abeyant", 
+        "windmill", 
+        "meekly", 
+        "muskoxen", 
+        "care", 
+        "rubbly", 
+        "blandish", 
+        "fulvous", 
+        "rentable", 
+        "stent", 
+        "snatcher", 
+        "coated", 
+        "caret", 
+        "nickel", 
+        "mutilate", 
+        "dative", 
+        "catfish", 
+        "carpel", 
+        "kind", 
+        "forsaken", 
+        "carburet", 
+        "validly", 
+        "vulture", 
+        "linens", 
+        "overrule", 
+        "inrush", 
+        "cordoba", 
+        "gonna", 
+        "reflux", 
+        "penalty", 
+        "byliner", 
+        "fever", 
+        "salvia", 
+        "rudiment", 
+        "astatine", 
+        "paints", 
+        "clement", 
+        "marigold", 
+        "scleral", 
+        "lobbyer", 
+        "hint", 
+        "assuming", 
+        "incur", 
+        "unheated", 
+        "discord", 
+        "delimit", 
+        "subhuman", 
+        "skeleton", 
+        "cerebral", 
+        "adverb", 
+        "grubbily", 
+        "muted", 
+        "milling", 
+        "acoustic", 
+        "coven", 
+        "cupful", 
+        "millibar", 
+        "bawler", 
+        "pressing", 
+        "kidney", 
+        "aniseed", 
+        "irons", 
+        "bride", 
+        "faunal", 
+        "blend", 
+        "sacral", 
+        "clabber", 
+        "nobility", 
+        "cherry", 
+        "dadaism", 
+        "escrow", 
+        "aground", 
+        "blink", 
+        "gloomily", 
+        "hiccups", 
+        "elect", 
+        "fen", 
+        "merengue", 
+        "dazedly", 
+        "blindly", 
+        "causally", 
+        "zenith", 
+        "enzyme", 
+        "nymphet", 
+        "feeding", 
+        "ecocidal", 
+        "wanna", 
+        "divot", 
+        "workbook", 
+        "servitor", 
+        "greeting", 
+        "gunman", 
+        "frankly", 
+        "recovery", 
+        "flacon", 
+        "besmear", 
+        "tractor", 
+        "below", 
+        "manned", 
+        "snarler", 
+        "nervily", 
+        "forensic", 
+        "nettle", 
+        "enjoyer", 
+        "on", 
+        "picked", 
+        "forceps", 
+        "beatable", 
+        "flummox", 
+        "reverend", 
+        "handle", 
+        "beagle", 
+        "mailing", 
+        "rehandle", 
+        "cuspid", 
+        "credits", 
+        "producer", 
+        "busing", 
+        "tameness", 
+        "denims", 
+        "cutesie", 
+        "bodily", 
+        "softness", 
+        "marksman", 
+        "hunker", 
+        "rumour", 
+        "monogamy", 
+        "birdseed", 
+        "smallish", 
+        "exile"
+    ]
+}
\ No newline at end of file
diff --git a/lessons/en_US/homerow.lesson b/lessons/en_US/homerow.lesson
index ef0fcce..da3c28a 100644
--- a/lessons/en_US/homerow.lesson
+++ b/lessons/en_US/homerow.lesson
@@ -4,16 +4,19 @@
         {
             "accuracy": 70, 
             "name": "bronze", 
+            "score": 4000, 
             "wpm": 15
         }, 
         {
             "accuracy": 80, 
             "name": "silver", 
+            "score": 6000, 
             "wpm": 20
         }, 
         {
             "accuracy": 90, 
             "name": "gold", 
+            "score": 10000, 
             "wpm": 25
         }
     ], 
diff --git a/lessons/en_US/homerowballoon.lesson b/lessons/en_US/homerowballoon.lesson
index 504201d..1d1c991 100644
--- a/lessons/en_US/homerowballoon.lesson
+++ b/lessons/en_US/homerowballoon.lesson
@@ -4,21 +4,24 @@
         {
             "accuracy": 70, 
             "name": "bronze", 
+            "score": 500, 
             "wpm": 15
         }, 
         {
             "accuracy": 80, 
             "name": "silver", 
+            "score": 1000, 
             "wpm": 20
         }, 
         {
             "accuracy": 90, 
             "name": "gold", 
+            "score": 1500, 
             "wpm": 25
         }
     ], 
     "name": "Home Row Balloon Practice", 
-    "order": 2, 
+    "order": -2, 
     "type": "balloon", 
     "words": [
         "haj", 
diff --git a/lessons/en_US/homerowgame.lesson b/lessons/en_US/homerowgame.lesson
new file mode 100644
index 0000000..2dee888
--- /dev/null
+++ b/lessons/en_US/homerowgame.lesson
@@ -0,0 +1,102 @@
+{
+    "description": "Practice the home row keys in this exciting game!\nDon't let any balloons get by!", 
+    "medals": [
+        {
+            "accuracy": 70, 
+            "name": "bronze", 
+            "score": 4000, 
+            "wpm": 15
+        }, 
+        {
+            "accuracy": 80, 
+            "name": "silver", 
+            "score": 6000, 
+            "wpm": 20
+        }, 
+        {
+            "accuracy": 90, 
+            "name": "gold", 
+            "score": 10000, 
+            "wpm": 25
+        }
+    ], 
+    "name": "Home Row Balloons", 
+    "order": 2, 
+    "type": "balloon", 
+    "words": [
+        "algal", 
+        "ska", 
+        "gag", 
+        "alga", 
+        "gaga", 
+        "ash", 
+        "as", 
+        "ha", 
+        "fall", 
+        "half", 
+        "salsa", 
+        "skald", 
+        "dahl", 
+        "jag", 
+        "ah", 
+        "sh", 
+        "alas", 
+        "lad", 
+        "flak", 
+        "ask", 
+        "gash", 
+        "lash", 
+        "shh", 
+        "dada", 
+        "sag", 
+        "falls", 
+        "ala", 
+        "shag", 
+        "saga", 
+        "ad", 
+        "dash", 
+        "sash", 
+        "fa", 
+        "slag", 
+        "haj", 
+        "alfalfa", 
+        "shah", 
+        "flag", 
+        "hajj", 
+        "halala", 
+        "hall", 
+        "gad", 
+        "shall", 
+        "gall", 
+        "has", 
+        "hah", 
+        "gas", 
+        "sass", 
+        "gala", 
+        "shad", 
+        "sal", 
+        "fag", 
+        "flash", 
+        "hag", 
+        "halal", 
+        "flask", 
+        "gaff", 
+        "had", 
+        "slash", 
+        "glass", 
+        "add", 
+        "hash", 
+        "la", 
+        "lass", 
+        "gal", 
+        "ssh", 
+        "dad", 
+        "fad", 
+        "sad", 
+        "glad", 
+        "all", 
+        "salad", 
+        "aha", 
+        "lag"
+    ]
+}
\ No newline at end of file
diff --git a/lessons/en_US/intro.lesson b/lessons/en_US/intro.lesson
index d909720..10e6dbf 100644
--- a/lessons/en_US/intro.lesson
+++ b/lessons/en_US/intro.lesson
@@ -4,16 +4,19 @@
         {
             "accuracy": 70, 
             "name": "bronze", 
+            "score": 4000, 
             "wpm": 0
         }, 
         {
             "accuracy": 80, 
             "name": "silver", 
+            "score": 6000, 
             "wpm": 0
         }, 
         {
             "accuracy": 90, 
             "name": "gold", 
+            "score": 10000, 
             "wpm": 0
         }
     ], 
diff --git a/lessons/en_US/leftcapital.lesson b/lessons/en_US/leftcapital.lesson
index 8a9ad64..8f0e504 100644
--- a/lessons/en_US/leftcapital.lesson
+++ b/lessons/en_US/leftcapital.lesson
@@ -4,21 +4,24 @@
         {
             "accuracy": 70, 
             "name": "bronze", 
+            "score": 4000, 
             "wpm": 15
         }, 
         {
             "accuracy": 80, 
             "name": "silver", 
+            "score": 6000, 
             "wpm": 20
         }, 
         {
             "accuracy": 90, 
             "name": "gold", 
+            "score": 10000, 
             "wpm": 25
         }
     ], 
     "name": "Left Hand Capitals", 
-    "order": 5, 
+    "order": 7, 
     "steps": [
         {
             "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!", 
diff --git a/lessons/en_US/leftcapitalgame.lesson b/lessons/en_US/leftcapitalgame.lesson
new file mode 100644
index 0000000..47c8d94
--- /dev/null
+++ b/lessons/en_US/leftcapitalgame.lesson
@@ -0,0 +1,228 @@
+{
+    "description": "Practice the left hand CAPITAL letters!\nDon't let any balloons get by!", 
+    "medals": [
+        {
+            "accuracy": 70, 
+            "name": "bronze", 
+            "score": 4000, 
+            "wpm": 15
+        }, 
+        {
+            "accuracy": 80, 
+            "name": "silver", 
+            "score": 6000, 
+            "wpm": 20
+        }, 
+        {
+            "accuracy": 90, 
+            "name": "gold", 
+            "score": 10000, 
+            "wpm": 25
+        }
+    ], 
+    "name": "Left Hand Capital Balloons", 
+    "order": 8, 
+    "type": "balloon", 
+    "words": [
+        "Colleen", 
+        "Shepard", 
+        "Quaker", 
+        "Ards", 
+        "Beecher", 
+        "Craig", 
+        "World", 
+        "Cowpens", 
+        "Barbudan", 
+        "Etruscan", 
+        "Damascus", 
+        "Stella", 
+        "Seville", 
+        "Bultmann", 
+        "Domitian", 
+        "Bonita", 
+        "Betsey", 
+        "Faust", 
+        "Tolstoi", 
+        "Christly", 
+        "Coolidge", 
+        "Vesta", 
+        "Tlingit", 
+        "Zimbabwe", 
+        "Draco", 
+        "Curtiss", 
+        "Regis", 
+        "Azores", 
+        "Foster", 
+        "Benny", 
+        "Foucault", 
+        "Dollfuss", 
+        "Stilton", 
+        "Romanov", 
+        "Belarus", 
+        "Fresno", 
+        "Qabalah", 
+        "Woodhull", 
+        "Baudouin", 
+        "Claudine", 
+        "Furies", 
+        "Stone", 
+        "Amanda", 
+        "Troy", 
+        "Vespucci", 
+        "Savaii", 
+        "Wharton", 
+        "Curie", 
+        "Attila", 
+        "Beryl", 
+        "Cairene", 
+        "Deanne", 
+        "Serene", 
+        "Wilton", 
+        "Clive", 
+        "Biafran", 
+        "Vaughan", 
+        "Carreras", 
+        "Aalborg", 
+        "Ginger", 
+        "Bechuana", 
+        "Tanzania", 
+        "Dottie", 
+        "Willie", 
+        "Swiss", 
+        "Goldman", 
+        "Romblon", 
+        "Tarot", 
+        "Tom", 
+        "Valkyrie", 
+        "Adonai", 
+        "Auden", 
+        "Sinai", 
+        "Bering", 
+        "Stacy", 
+        "Assembly", 
+        "Bulgaria", 
+        "Carter", 
+        "Tibesti", 
+        "Alfonso", 
+        "Chaucer", 
+        "Viking", 
+        "Surrey", 
+        "Teflon", 
+        "Baikal", 
+        "Bangkok", 
+        "Wilber", 
+        "Biafra", 
+        "Reynold", 
+        "Gaul", 
+        "Xhosa", 
+        "Edson", 
+        "Dresden", 
+        "Taft", 
+        "Djibouti", 
+        "Quilmes", 
+        "Tacitus", 
+        "Ealing", 
+        "Sweden", 
+        "Chimera", 
+        "Antigua", 
+        "Druid", 
+        "Quito", 
+        "Teddy", 
+        "Baky", 
+        "Campeche", 
+        "Clara", 
+        "Taiwan", 
+        "Saarland", 
+        "Barnett", 
+        "Cyprus", 
+        "Alvin", 
+        "Agatha", 
+        "Rwandan", 
+        "Taegu", 
+        "Tobago", 
+        "Grenada", 
+        "Soho", 
+        "Black", 
+        "Endymion", 
+        "Shinto", 
+        "Vonnegut", 
+        "Church", 
+        "Derby", 
+        "Attica", 
+        "Sahelian", 
+        "Truman", 
+        "Boadicea", 
+        "Behan", 
+        "Sulawesi", 
+        "Godthab", 
+        "Roentgen", 
+        "Granada", 
+        "Gullah", 
+        "Dayton", 
+        "Varanasi", 
+        "Aquarius", 
+        "Eve", 
+        "Tyrol", 
+        "Trudy", 
+        "Disciple", 
+        "Diann", 
+        "Stuart", 
+        "Winnie", 
+        "Steichen", 
+        "Afro", 
+        "EQ", 
+        "Eurobond", 
+        "Sybil", 
+        "Webster", 
+        "Crockett", 
+        "Alva", 
+        "Basilan", 
+        "Scotia", 
+        "Requiem", 
+        "Sondra", 
+        "Garrett", 
+        "Rama", 
+        "Tunisian", 
+        "Sikhism", 
+        "Roberto", 
+        "Ceuta", 
+        "Gus", 
+        "Shikoku", 
+        "Aorangi", 
+        "Bertram", 
+        "Fredric", 
+        "Val", 
+        "Giselle", 
+        "Gladys", 
+        "Bunyan", 
+        "Torres", 
+        "Dwight", 
+        "Goa", 
+        "Futurism", 
+        "Bolshoi", 
+        "Daley", 
+        "Cali", 
+        "Waspy", 
+        "Bunche", 
+        "Ernie", 
+        "Serra", 
+        "Crimean", 
+        "Grey", 
+        "Siberian", 
+        "Vickie", 
+        "Volos", 
+        "Georgina", 
+        "Booth", 
+        "Fourier", 
+        "Clement", 
+        "Graham", 
+        "Alma", 
+        "Dubcek", 
+        "Casper", 
+        "Emmet", 
+        "Balkans", 
+        "Dumas", 
+        "Ranchi", 
+        "Wheeling"
+    ]
+}
\ No newline at end of file
diff --git a/lessons/en_US/rightcapital.lesson b/lessons/en_US/rightcapital.lesson
index 7b656b3..a160621 100644
--- a/lessons/en_US/rightcapital.lesson
+++ b/lessons/en_US/rightcapital.lesson
@@ -1,27 +1,30 @@
 {
-    "description": "This lesson teaches you the CAPITAL letters which are typed \nby your right hand.\nThese are Y, U, I, O, P, H, J, K, L, B, N, and M.", 
+    "description": "This lesson teaches you the CAPITAL letters which are typed \nby your right hand.\nThese are Y, U, I, O, P, H, J, K, L, N, and M.", 
     "medals": [
         {
             "accuracy": 70, 
             "name": "bronze", 
+            "score": 4000, 
             "wpm": 15
         }, 
         {
             "accuracy": 80, 
             "name": "silver", 
+            "score": 6000, 
             "wpm": 20
         }, 
         {
             "accuracy": 90, 
             "name": "gold", 
+            "score": 10000, 
             "wpm": 25
         }
     ], 
     "name": "Right Hand Capitals", 
-    "order": 6, 
+    "order": 9, 
     "steps": [
         {
-            "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!", 
+            "instructions": "In this lesson, you will learn the Y, U, I, O, P, H, J, K, L, N and M keys.\n\nPress the ENTER key when you are ready to begin!", 
             "mode": "key", 
             "text": "\n"
         }, 
@@ -71,11 +74,6 @@
             "text": "L"
         }, 
         {
-            "instructions": "Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger.", 
-            "mode": "key", 
-            "text": "B"
-        }, 
-        {
             "instructions": "Press and hold the SHIFT key with your left little finger, then press the N key with your right index finger.", 
             "mode": "key", 
             "text": "N"
@@ -88,22 +86,22 @@
         {
             "instructions": "You did it! Practice typing the keys you just learned.", 
             "mode": "text", 
-            "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 NN KK HH BB HH LL UU BB LL KK HH II HH HH MM OO HH HH MM HH"
+            "text": "II NN LL OO NN NN MM NN LL YY JJ OO UU MM JJ YY PP OO II YY HH HH NN JJ OO PP PP UU YY UU HH UU KK NN JJ PP NN OO YY UU NN JJ HH LL PP KK UU LL LL JJ HH II PP PP MM OO HH HH MM HH"
         }, 
         {
             "instructions": "Nice work. Now put the keys together into pairs.", 
             "mode": "text", 
-            "text": "PU OU HM MI MP PU LO MI BB MI IJ PO LP MO OB IP BB BO PI PO MI MI BB MH BO IJ BL LI OP KP MP HM UI MI HI LO IO OM PN PN HU IP IJ HU KP II UI KO PM KP BH BO OU OL IN PU UI BI HI BH"
+            "text": "UI PI KP MI MH UI OK MI II MI KO PU YM LI OM HI II IN PO PU MI MI II LI IN KO IO LO PI MO MH KP IJ OL MP OK HM OU PU PU MP HI ML MO MH IU IJ LP PO MO IP IN PI OL HM UI IJ IO KP IP"
         }, 
         {
             "instructions": "Nice work. Now practice all the keys you know.", 
             "mode": "text", 
-            "text": "BL Os Ur AN SI IQ eP LA PO BH Uz PA NE LT Ix eP TH Hi PG EB Mi BD Ku Mc Ug Ol HM UI Om JA Ob Ip ID IV Ji Lv Br Or Us Nu Hu DJ Lv OP RL FO Oe OP Mu Ot RO My TK Um Ig RN ID Nu Iq Lh"
+            "text": "BI Mc Yo AN PE IW cJ Ms PM EN Uf Ia NT LO HD cJ Um Ki PD DH Ka BL Ly Py NA Yo HU UF Ut MP OS Im CO IV Ib LP He Is Ps Om Mu DP LP OP SO Ub OS OP Or It SI Py TK Uk ID Pt CO Om Iq Lj"
         }, 
         {
             "instructions": "Wonderful! Time to type real words.", 
             "mode": "text", 
-            "text": "Yuma Janette Lisbon Ipswich Jake Mexico Leland Mays Hindi Mike Jeanne Belgium Lapland Lome Helsinki Nicobar Lear Plautus Orion Mia Kananga Javanese Hirohito Yosemite Mia Managua Mongol Oder Bradford Lerwick Loyalist Judean Kirk Helene Malaysia Boswell Burnside Plath Mogilyov Boadicea Humboldt Orrin Burundi Unionism Judy Lloyd Kleenex Babylon Julian Kirby Pristina Nolan Pearl Bruneian Bhutan Imogen PCP Master Montcalm Pinter"
+            "text": "Molucca Mbini Harrow Ipswich Kanpur Ophelia Parkman Yafo Isabel Lori Marconi Herschel Jacky Lome Long Nehemiah Knox Howrah Marcia Jere LVN Orville Hounslow Loafer Psalms Martian Poznan Lapland Plato Kenton Hutu Judean Lamb Izmir Kepler Hazel Mainz Mortimer Mozart Hopper Kremlin Kampala Laplace Mendel Humanism Iowan Judith Yoruban Kevlar Moravian Hassid Owens Kroc Islamic Libyan Macaulay Hellene Levis Karelian Ming"
         }, 
         {
             "instructions": "$report", 
diff --git a/lessons/en_US/rightcapitalgame.lesson b/lessons/en_US/rightcapitalgame.lesson
new file mode 100644
index 0000000..3db35f1
--- /dev/null
+++ b/lessons/en_US/rightcapitalgame.lesson
@@ -0,0 +1,228 @@
+{
+    "description": "Practice the right hand CAPITAL letters!\nDon't let any balloons get by!", 
+    "medals": [
+        {
+            "accuracy": 70, 
+            "name": "bronze", 
+            "score": 4000, 
+            "wpm": 15
+        }, 
+        {
+            "accuracy": 80, 
+            "name": "silver", 
+            "score": 6000, 
+            "wpm": 20
+        }, 
+        {
+            "accuracy": 90, 
+            "name": "gold", 
+            "score": 10000, 
+            "wpm": 25
+        }
+    ], 
+    "name": "Right Hand Capital Balloons", 
+    "order": 10, 
+    "type": "balloon", 
+    "words": [
+        "Heller", 
+        "Nemesis", 
+        "Hadrian", 
+        "Haiphong", 
+        "Nixon", 
+        "Lewisham", 
+        "Lorene", 
+        "Mohegan", 
+        "Latvian", 
+        "Muzak", 
+        "Hamhung", 
+        "Napoleon", 
+        "Jonathan", 
+        "Malory", 
+        "Ludhiana", 
+        "Malacca", 
+        "AWOL", 
+        "Humphrey", 
+        "Napier", 
+        "Leipzig", 
+        "Patrick", 
+        "Kitty", 
+        "Peale", 
+        "Jamie", 
+        "Malta", 
+        "Mitty", 
+        "Mexican", 
+        "Karen", 
+        "Lamb", 
+        "Host", 
+        "Pegasus", 
+        "IOU", 
+        "Punjabi", 
+        "Kibo", 
+        "Islam", 
+        "GI", 
+        "Poole", 
+        "Preston", 
+        "Madam", 
+        "Yukon", 
+        "Pueblo", 
+        "Luke", 
+        "Nilgiri", 
+        "Pepin", 
+        "Mendel", 
+        "Perkins", 
+        "PBX", 
+        "Logan", 
+        "Lyons", 
+        "Jeremy", 
+        "Mahatma", 
+        "Marietta", 
+        "Obadiah", 
+        "Perry", 
+        "Mohammed", 
+        "Nanette", 
+        "Kamet", 
+        "Procyon", 
+        "Proteus", 
+        "Judaea", 
+        "AIDS", 
+        "Ionian", 
+        "Plovdiv", 
+        "Main", 
+        "Pius", 
+        "Istrian", 
+        "Kim", 
+        "Picasso", 
+        "Hydra", 
+        "Peel", 
+        "Yorktown", 
+        "Potomac", 
+        "Pliny", 
+        "STOL", 
+        "Keller", 
+        "Patti", 
+        "Yangon", 
+        "Palomar", 
+        "Junior", 
+        "Lamaist", 
+        "Ouija", 
+        "Mervin", 
+        "Harare", 
+        "Yokosuka", 
+        "Mason", 
+        "No", 
+        "Pisan", 
+        "Manama", 
+        "Mahican", 
+        "Melinda", 
+        "Iasi", 
+        "Minorcan", 
+        "Jersey", 
+        "Langley", 
+        "Latakia", 
+        "Oakland", 
+        "Peruvian", 
+        "Masai", 
+        "Powys", 
+        "Owen", 
+        "Jonson", 
+        "Makarios", 
+        "Lela", 
+        "Milicent", 
+        "Moselle", 
+        "Mariana", 
+        "Marcia", 
+        "Mulroney", 
+        "Permian", 
+        "Perceval", 
+        "Jacuzzi", 
+        "Hiram", 
+        "Lon", 
+        "IUD", 
+        "Omagh", 
+        "Ibo", 
+        "Julia", 
+        "Mali", 
+        "Nabatea", 
+        "Menotti", 
+        "Hopkins", 
+        "Pattie", 
+        "FM", 
+        "Leonard", 
+        "GIGO", 
+        "Patmos", 
+        "Marconi", 
+        "Japanese", 
+        "Laverne", 
+        "Nikolaev", 
+        "Peshawar", 
+        "Umbrian", 
+        "Jezebel", 
+        "Nobelist", 
+        "Haydn", 
+        "Ligurian", 
+        "Ocean", 
+        "Hogarth", 
+        "Linnaeus", 
+        "Megrez", 
+        "Mabel", 
+        "Piura", 
+        "Limavady", 
+        "Newark", 
+        "McLuhan", 
+        "Kirin", 
+        "IV", 
+        "Orpheus", 
+        "ATP", 
+        "Nannette", 
+        "June", 
+        "Nazism", 
+        "Hanuka", 
+        "Lily", 
+        "Lucian", 
+        "Iacocca", 
+        "Hasidic", 
+        "Lionel", 
+        "Nashua", 
+        "Odin", 
+        "Moldova", 
+        "Midas", 
+        "Heep", 
+        "Lorenzo", 
+        "Leona", 
+        "Po", 
+        "Lublin", 
+        "Metairie", 
+        "Yoruba", 
+        "Parian", 
+        "Ithaki", 
+        "Om", 
+        "Kabbalah", 
+        "Kirby", 
+        "Oneida", 
+        "Homicide", 
+        "Huron", 
+        "Iqaluit", 
+        "Pepysian", 
+        "Phidias", 
+        "Moore", 
+        "HUD", 
+        "Pope", 
+        "Hathaway", 
+        "Kweiyang", 
+        "Hodgkin", 
+        "Maya", 
+        "Honduras", 
+        "Mercury", 
+        "Ivorian", 
+        "Nagasaki", 
+        "Jessie", 
+        "Jute", 
+        "Lane", 
+        "Hasidim", 
+        "Langland", 
+        "Union", 
+        "Kaiserin", 
+        "Leighton", 
+        "SLR"
+    ]
+}
\ No newline at end of file
diff --git a/lessons/en_US/test.lesson b/lessons/en_US/test.lesson
index 6b2421b..5162947 100644
--- a/lessons/en_US/test.lesson
+++ b/lessons/en_US/test.lesson
@@ -1 +1,83 @@
-{"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
+{
+    "description": "This lesson exists to test out obscure Typing Turtle features.\nPlease skip it by pressing the arrow button to the right.", 
+    "medals": [
+        {
+            "accuracy": 70, 
+            "name": "bronze", 
+            "score": 4000, 
+            "wpm": 15
+        }, 
+        {
+            "accuracy": 80, 
+            "name": "silver", 
+            "score": 6000, 
+            "wpm": 20
+        }, 
+        {
+            "accuracy": 90, 
+            "name": "gold", 
+            "score": 10000, 
+            "wpm": 25
+        }
+    ], 
+    "name": "Test lesson", 
+    "order": -1, 
+    "steps": [
+        {
+            "instructions": "In this lesson, you will learn the \u00e6, \u03a9, A, B, b and B keys.\n\nPress the ENTER key when you are ready to begin!", 
+            "mode": "key", 
+            "text": "\n"
+        }, 
+        {
+            "instructions": "Press and hold the ALTGR key, then press the \u00e6 key with your left little finger.", 
+            "mode": "key", 
+            "text": "\u00e6"
+        }, 
+        {
+            "instructions": "Press and hold the ALTGR and SHIFT keys, then press the \u03a9 key with your left little finger.", 
+            "mode": "key", 
+            "text": "\u03a9"
+        }, 
+        {
+            "instructions": "Press and hold the SHIFT key with your right little finger, then press the A key with your left little finger.", 
+            "mode": "key", 
+            "text": "A"
+        }, 
+        {
+            "instructions": "Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger.", 
+            "mode": "key", 
+            "text": "B"
+        }, 
+        {
+            "instructions": "Press the b key with your left index finger.", 
+            "mode": "key", 
+            "text": "b"
+        }, 
+        {
+            "instructions": "Press and hold the SHIFT key with your right little finger, then press the B key with your left index finger.", 
+            "mode": "key", 
+            "text": "B"
+        }, 
+        {
+            "instructions": "You did it! Practice typing the keys you just learned.", 
+            "mode": "text", 
+            "text": "\u03a9\u03a9 bb bb \u03a9\u03a9 BB BB BB BB bb \u00e6\u00e6 BB AA \u00e6\u00e6 BB BB \u00e6\u00e6 AA \u03a9\u03a9 \u03a9\u03a9 \u00e6\u00e6 AA AA BB BB \u03a9\u03a9 AA AA \u00e6\u00e6 \u00e6\u00e6 \u00e6\u00e6 BB \u03a9\u03a9 bb BB BB AA BB \u03a9\u03a9 \u00e6\u00e6 \u00e6\u00e6 BB BB AA bb AA bb \u00e6\u00e6 bb bb BB AA \u03a9\u03a9 AA AA BB \u03a9\u03a9 AA AA BB AA"
+        }, 
+        {
+            "instructions": "Nice work. Now put the keys together into pairs.", 
+            "mode": "text", 
+            "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"
+        }, 
+        {
+            "instructions": "Nice work. Time to type jumbles.", 
+            "mode": "text", 
+            "text": "\u00e6bbA B\u00e6AA \u03a9\u00e6Bb \u03a9\u03a9\u00e6A BB\u03a9\u00e6 B\u00e6Bb bb\u00e6\u03a9 b\u00e6AB BAbA BBBb B\u00e6A\u03a9 \u03a9BA\u03a9 BbBb ABBB BbA\u03a9 Bb\u03a9B \u00e6A\u00e6b BAAb BB\u00e6B \u03a9bB\u00e6 b\u03a9\u03a9b \u03a9bB\u03a9 BBAb bAB\u00e6 \u00e6\u03a9bb \u00e6BB\u03a9 \u03a9A\u03a9\u03a9 \u03a9Ab\u00e6 \u00e6BB\u03a9 \u00e6A\u03a9\u00e6 \u03a9B\u03a9\u00e6 \u00e6bBb BB\u03a9\u03a9 \u00e6AbB AbbB \u03a9b\u03a9A \u03a9ABb bbbB \u03a9\u03a9\u03a9A \u00e6\u00e6\u00e6\u03a9 BB\u03a9A B\u03a9\u03a9b BBAB bA\u00e6b bB\u03a9\u03a9 \u00e6BBA BBAB B\u03a9bA ABBB \u03a9A\u03a9\u00e6 b\u00e6\u03a9B \u00e6\u03a9BB \u00e6\u00e6Ab BB\u03a9\u00e6 bBb\u00e6 \u03a9BbB \u00e6b\u03a9B AbBB bbAA \u03a9b\u00e6b"
+        }, 
+        {
+            "instructions": "$report", 
+            "mode": "key", 
+            "text": " "
+        }
+    ], 
+    "type": "normal"
+}
\ No newline at end of file
diff --git a/lessons/en_US/toprow.lesson b/lessons/en_US/toprow.lesson
index deb58ed..9804dd1 100644
--- a/lessons/en_US/toprow.lesson
+++ b/lessons/en_US/toprow.lesson
@@ -4,16 +4,19 @@
         {
             "accuracy": 70, 
             "name": "bronze", 
+            "score": 4000, 
             "wpm": 15
         }, 
         {
             "accuracy": 80, 
             "name": "silver", 
+            "score": 6000, 
             "wpm": 20
         }, 
         {
             "accuracy": 90, 
             "name": "gold", 
+            "score": 10000, 
             "wpm": 25
         }
     ], 
diff --git a/lessons/en_US/toprowgame.lesson b/lessons/en_US/toprowgame.lesson
new file mode 100644
index 0000000..ce6f444
--- /dev/null
+++ b/lessons/en_US/toprowgame.lesson
@@ -0,0 +1,228 @@
+{
+    "description": "Practice the top row keys in this exciting game!\nDon't let any balloons get by!", 
+    "medals": [
+        {
+            "accuracy": 70, 
+            "name": "bronze", 
+            "score": 4000, 
+            "wpm": 15
+        }, 
+        {
+            "accuracy": 80, 
+            "name": "silver", 
+            "score": 6000, 
+            "wpm": 20
+        }, 
+        {
+            "accuracy": 90, 
+            "name": "gold", 
+            "score": 10000, 
+            "wpm": 25
+        }
+    ], 
+    "name": "Top Row Balloons", 
+    "order": 4, 
+    "type": "balloon", 
+    "words": [
+        "skate", 
+        "fortieth", 
+        "rush", 
+        "regatta", 
+        "flushed", 
+        "tragedy", 
+        "pilfer", 
+        "goggly", 
+        "papoose", 
+        "wraith", 
+        "sprawl", 
+        "dug", 
+        "litre", 
+        "lid", 
+        "areolate", 
+        "whish", 
+        "fit", 
+        "thyroid", 
+        "haole", 
+        "sateless", 
+        "thready", 
+        "phallus", 
+        "lagger", 
+        "furrow", 
+        "lares", 
+        "park", 
+        "graffiti", 
+        "adequate", 
+        "fell", 
+        "pulpit", 
+        "though", 
+        "thereto", 
+        "dally", 
+        "health", 
+        "pouter", 
+        "gradual", 
+        "appalled", 
+        "surly", 
+        "owlet", 
+        "holiday", 
+        "rehire", 
+        "repay", 
+        "tattered", 
+        "titlist", 
+        "stupefy", 
+        "wild", 
+        "deflated", 
+        "foyer", 
+        "thru", 
+        "spy", 
+        "swart", 
+        "story", 
+        "dahlia", 
+        "flog", 
+        "tailgate", 
+        "preterit", 
+        "purity", 
+        "defy", 
+        "pastil", 
+        "ileal", 
+        "fridge", 
+        "pal", 
+        "laity", 
+        "tore", 
+        "rope", 
+        "total", 
+        "wellhead", 
+        "pesewa", 
+        "hail", 
+        "pedestal", 
+        "shekels", 
+        "twirly", 
+        "twittery", 
+        "quarter", 
+        "prolate", 
+        "despair", 
+        "resale", 
+        "rallier", 
+        "pother", 
+        "forefoot", 
+        "digress", 
+        "filthily", 
+        "playful", 
+        "gelid", 
+        "geyser", 
+        "soft", 
+        "flooded", 
+        "tolerate", 
+        "tallowy", 
+        "desk", 
+        "wake", 
+        "reggae", 
+        "freakish", 
+        "worship", 
+        "roast", 
+        "sweetly", 
+        "droop", 
+        "outhit", 
+        "athirst", 
+        "ease", 
+        "foresee", 
+        "threader", 
+        "repute", 
+        "karate", 
+        "rales", 
+        "parasol", 
+        "tot", 
+        "fire", 
+        "gulf", 
+        "data", 
+        "piked", 
+        "wooled", 
+        "astride", 
+        "truffle", 
+        "thwart", 
+        "hog", 
+        "wisp", 
+        "eared", 
+        "par", 
+        "old", 
+        "periwig", 
+        "leaded", 
+        "rug", 
+        "reshow", 
+        "pleased", 
+        "eats", 
+        "grouser", 
+        "farer", 
+        "waiter", 
+        "equalise", 
+        "flier", 
+        "drafty", 
+        "pilaster", 
+        "pith", 
+        "lessee", 
+        "fried", 
+        "prose", 
+        "wattage", 
+        "rewire", 
+        "waggle", 
+        "futilely", 
+        "yodeller", 
+        "idealise", 
+        "outside", 
+        "sweep", 
+        "striated", 
+        "gagger", 
+        "yourself", 
+        "dowse", 
+        "squire", 
+        "spiel", 
+        "hothead", 
+        "shod", 
+        "arrester", 
+        "dowdy", 
+        "desire", 
+        "putt", 
+        "jihad", 
+        "fail", 
+        "perjurer", 
+        "polypoid", 
+        "lustily", 
+        "upstate", 
+        "reaper", 
+        "rapidly", 
+        "eureka", 
+        "wight", 
+        "dire", 
+        "to", 
+        "grouter", 
+        "toil", 
+        "softie", 
+        "spree", 
+        "outsold", 
+        "testes", 
+        "weakfish", 
+        "pupil", 
+        "yapper", 
+        "hug", 
+        "prod", 
+        "torero", 
+        "hightail", 
+        "helpless", 
+        "tree", 
+        "reap", 
+        "stoker", 
+        "oestrous", 
+        "sepal", 
+        "traitor", 
+        "fretted", 
+        "reeky", 
+        "foothill", 
+        "lour", 
+        "fig", 
+        "floppy", 
+        "dystopia", 
+        "afield", 
+        "fireside", 
+        "upswept", 
+        "drily"
+    ]
+}
\ No newline at end of file
diff --git a/lessonscreen.py b/lessonscreen.py
index a79740c..18c0737 100644
--- a/lessonscreen.py
+++ b/lessonscreen.py
@@ -465,8 +465,6 @@ class LessonScreen(gtk.VBox):
 
         lesson_name = self.lesson['name']
         
-        print self.total_time, self.wpm
-        
         # Add to the lesson history.
         report = { 
             'lesson': lesson_name,
diff --git a/medalscreen.py b/medalscreen.py
index 7573e0d..45d0124 100644
--- a/medalscreen.py
+++ b/medalscreen.py
@@ -53,19 +53,19 @@ class MedalScreen(gtk.EventBox):
         title.set_markup(_("<span font_desc='Serif Bold Italic 28'>Certificate of Achievement</span>"))
         
         text0 = gtk.Label()
-        text0.set_markup(_("<span font_desc='Sans 18'>This certifies that</span>"))
+        text0.set_markup(_("<span font_desc='Sans 16'>This certifies that</span>"))
 
         text1 = gtk.Label()
-        text1.set_markup(_("<span font_desc='Sans 18'><b><u><i>%(nick)s</i></u></b></span>") % medal)
+        text1.set_markup(_("<span font_desc='Sans 16'><b><u><i>%(nick)s</i></u></b></span>") % medal)
 
         text2 = gtk.Label()
-        text2.set_markup(_("<span font_desc='Sans 18'>earned a %(type)s medal</span>") % medal)
+        text2.set_markup(_("<span font_desc='Sans 16'>earned a %(type)s medal in </span>") % medal)
 
         text3 = gtk.Label()
-        text3.set_markup(_("<span font_desc='Sans 18'>in lesson <i>%(lesson)s</i> on </span>") % medal)
+        text3.set_markup(_("<span font_desc='Sans 16'>in <b><u><i>%(lesson)s</i></u></b></span>") % medal)
 
         text4 = gtk.Label()
-        text4.set_markup(_("<span font_desc='Sans 18'><b><u><i>%(date)s</i></u></b></span>") % medal)
+        text4.set_markup(_("<span font_desc='Sans 16'>on <b><u><i>%(date)s</i></u></b>.</span>") % medal)
 
         textbox = gtk.VBox()
         textbox.pack_start(text0)
@@ -79,15 +79,20 @@ class MedalScreen(gtk.EventBox):
         medalbox.pack_end(medalimage)
 
         # Stats section.
-        wpmlabel = gtk.Label()
-        wpmlabel.set_markup("<span size='18000'>" + (_('<b>Words Per Minute:</b> %(wpm)d') % medal) + "</span>" )
-        
-        accuracylabel = gtk.Label()
-        accuracylabel.set_markup("<span size='15000'>" + (_('<b>Accuracy:</b> %(accuracy)d%%') % medal) + "</span>" )
-        
         statbox = gtk.HBox()
-        statbox.pack_start(wpmlabel, True)
-        statbox.pack_start(accuracylabel, True)
+        if medal.has_key('wpm'):
+            stat1 = gtk.Label()
+            stat1.set_markup("<span size='18000'>" + (_('<b>Words Per Minute:</b> %(wpm)d') % medal) + "</span>" )
+            statbox.pack_start(stat1, True)
+        
+            stat2 = gtk.Label()
+            stat2.set_markup("<span size='18000'>" + (_('<b>Accuracy:</b> %(accuracy)d%%') % medal) + "</span>" )
+            statbox.pack_start(stat2, True)
+
+        elif medal.has_key('score'):
+            stat1 = gtk.Label()
+            stat1.set_markup("<span size='18000'>" + (_('<b>SCORE:</b> %(score)d') % medal) + "</span>" )
+            statbox.pack_start(stat1, True)
         
         oklabel = gtk.Label()
         oklabel.set_markup("<span size='10000'>" + _('Press the ENTER key to continue.') + '</span>')
-----------------------------------------------------------------------


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


More information about the Commits mailing list