diff options
author | Walter Bender <walter.bender@gmail.com> | 2011-03-29 18:30:42 (GMT) |
---|---|---|
committer | Walter Bender <walter.bender@gmail.com> | 2011-03-29 18:30:42 (GMT) |
commit | 6fcab0b9bf7b7e97b4c63eb6279f9b3771acc982 (patch) | |
tree | 11c0ed895b83ade4fd78a665de9960e19c14eeca /page.py | |
parent | 79b7365a1187ab3ce6d2841ff4f67a18dfae5a80 (diff) |
adding levels mechanism
Diffstat (limited to 'page.py')
-rw-r--r-- | page.py | 239 |
1 files changed, 89 insertions, 150 deletions
@@ -31,108 +31,7 @@ except ImportError: from genpieces import generate_card from utils.sprites import Sprites, Sprite -# -# These tables and dictionaries represent a level (Level 1 in English) -# CARDS, COLORS, SOUNDS, and WORDS -# -CARDS = [['A', _('pAt')], # Use CAPS for highlight. - ['U', _('Up')], - ['I', _('It')], - ['E', _('pEt')], - ['O', _('pOt')], - ['Y', _('tummY')], - ['P', _('Pat')], - ['N', _('Not,-teNNis')], - ['T', _('Tap')], - ['D', _('DaD')], - ['S', _('iS,-aS,-waS,-sayS')], - ['M', _('MoM')], - ['S', _("Sam,-Stop,-it'S")], - ['A', _('read-A-book')], - ['', ''], - ['', '']] - -# [RGB color, color name, outline stroke] -COLORS = [['#BA6C71', _('light pink'), False], - ['#FFFCC0', _('yellow'), True], - ['#EF2891', _('pink'), False], - ['#70A9CE', _('blue'), False], - ['#FFFFFF', _('white'), True], - ['#DE1C23', _('red'), False], - ['#A4221E', _('brown'), False], - ['#7A6BBD', _('purple'), False], - ['#C72098', _('dark pink'), False], - ['#2EA539', _('green'), False], - ['#B139A2', _('purple'), False], - ['#EE3C1E', _('dark pink'), False], - ['#7EC93C', _('curly green'), False], - ['#FFF200', _('bright yellow'), True]] - -# [sound file, sound string for espeak] -SOUNDS = [['a-as-in-pat.ogg', 'ah'], - ['u-as-in-up.ogg', 'uh'], - ['i-as-in-it.ogg', 'ih'], - ['e-as-in-pet.ogg', 'eh'], - ['o-as-in-pot.ogg', 'ah'], - ['y-as-in-tummy.ogg', 'e'], - ['p-as-in-pat.ogg', 'p'], - ['n-as-in-tennis.ogg', 'n'], - ['t-as-in-tap.ogg', 't'], - ['d-as-in-dog.ogg', 'd'], - ['s-as-in-is.ogg', 's'], - ['m-as-in-mom.ogg', 'm'], - ['s-as-in-stop.ogg', 's'], - ['a-as-in-read-a-book.ogg', 'a']] - -WORDS = ['A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A', - 'a U a a a a a U a a U a a U a U a a a U U a U a a a a a U a a a a a', - 'a I u a I a I a I I I I a a I u I a a u a I I u a I a u a I a a I a', - 'a i u a i a i E a i i E i i a a i u i a a u a i i u a a i E a E a a', - 'a i u a i O a i e a i O a i e O O i i a e i u e a O e i i O a O a O', - 'a i u a i o a i e a i o u i e o e i i a a i u i o a a o u Y a i i u \ -Y o Y a a Y i o a a o i u Y u Y a i u o a e a o u u a a i i a e o i o e a o i \ -a i o o a o a o', - 'Pa i uP a i o Pa i e a i o u i e o e i a a i uP i oP a a o u y a i \ -i u y o y a a y iP PoP a a Po u y PuPPy a i uP o a e a oP uP u a a i i a e \ -Po i o Pe a o i a i o oP a oP a oP', - 'pa i up a i No pa i eN aN i oN u i eN o eN i iN aN a i up i op aN \ -aN oN u y a i i uNNy o y aN a y ip pop a aN po i Nu y puppy aN i up on aN eN \ -a op up u aN aN i i a e po i o pe aN o i a i o op aN op aN op', - 'paT i up a i noT pa i Ten an iT on Tu i TenT o en Ti in an a iT up \ -Ti Top an Tan on u Ty aT iT i unny o y an a y ip pop aT Tan poT i nuTTy puppy \ -an i up on an TenT a op up u an an iT i a e poT i To peT an To i a i To op an \ -op an op', - 'pat i up a i not pa i ten anD it on tu i tent o enD ti in anD a it \ -up ti top anD tanD on Du ty at it i unny o y anD DaDDy ip pop at tand pot i \ -nutty puppy ad i up on an tent DaD op up uD anD anD it i aD e pot i to pet \ -anD to i DaD i to op anD op anD op', - "pat iS up a iS not pa iS ten and it on tu i tent o endS ti in and a \ -it up ti top and tandS on du ty at it iS unny o y and daddy ip pop op up ud \ -and and it iS ad e pot iS to pet and to iS dad'S i to op and op and op", - "pat is up aM is not paM is ten and it on tuMp in tent MoM ends tiM \ -in and aM it up tiM top and tands on du ty Mat it is unny MoMMy and daddy ip \ -pop at tand pot is nutty puppy and is up on Man's tent dad Mop up Mud and and \ -it is ad ttempt pot is toM's pet and toM is dad's i toM Mop and Mop and Mop", - "pat-is-up Sam-is-not pam-is-ten-and-SitS-on-Stump-in-tent mom-Sends-\ -tim-in-and-Sam-SitS-up tim-StopS-and-StandS-on-duSty-mat it-is-Sunny mommy-and\ --daddy-Sip-pop-at-Stand Spot-is-nutty-puppy-and-is-up-on-man's-tent dad-mopS-\ -up-mund-and-Sand it-is-Sad ttempt Spot-is-tom's-pet-and-tom-is-dad's-SSiSt tom\ --mopS-and-mopS-and-mopS", - "pat-is-up sam-is-not pam-is-ten-and-sits-on-A-stump-in-A-tent mom-\ -sends-tim-in-and-sam-sits-up tim-stops-and-stands-on-A-dusty-mat it-is-sunny \ -mommy-and-daddy-sip-pop-at-A-stand spot-is-A-nutty-puppy-and-is-up-on-A-man's-\ -tent dad-mops-up-mud-and-sand it-is-A-sad-Attempt spot-is-tom's-pet-and-tom-is\ --dad's-AssistAnt tom-mops-and-mops-and-mops", - "pat-is-up,-sam-is-not. pam-is-ten-and-sits-on-a-stump-in-a-tent. mom-\ -sends-tim-in-and-sam-sits-on-a-dusty-mat. it-is-sunny. mommy-and-daddy-sip-pop\ --at-a-stand. spot-is-a-nutty-puppy-and-is-up-on-a-man's-tent. dad-mops-up-mud-\ -and-sand. it-is-a-sad-attempt. spot-is-tom's-pet-and-tom-is-dad's-assistant. \ -tom-mops-and-mops-and-mops.", - "mom-insists-sam-must-study-and-pass-a-test. sam-did-not-pass-a-past-\ -test. a-pup-steps-past-and-tempts-sam. sam-is-a-pest-and-sits-in-a-muddy-spot.\ -mom-is-mad-at-sam's-messy-pants-and-sends-pam-and-a-pen. pam's-study-tip-\ -assists-sam. pam-is-an-asset!"] - +# TODO: Generalize all these special cases across levels # TRANS: e.g., This yellow sign is said u like up. MSGS = [[_('This %s sign is said\n'), '%s ' + _('like') + ' %s.'], [_('This %s sign is said\ntogether with other sounds\nas in:\n'), @@ -142,12 +41,12 @@ MSGS = [[_('This %s sign is said\n'), '%s ' + _('like') + ' %s.'], [_('This %s sign is said\n\nReading from left to right, read the\n\ sounds one at a time. You can\nuse your finger to follow along.'), '%s ' + _('like') + ' %s.']] - MSG_INDEX = [4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, -1, -1] SHOW_MSG2 = [False, False, False, False, False, False, True, True, True, True, True, True, True, False, False, False] ALIGN = 11 # Beginning with Card 11, start left-justifying the text +# Rendering-related constants KERN = {'i': 0.6, 'I': 0.6, 'l': 0.6, 't': 0.8, 'T': 0.8, 'r': 0.8, 'm': 1.6, 'w': 1.3, "'": 0.4, 'M': 1.6} ALPHABET = "abcdefghijklmnopqrstuvwxyz.,'!" @@ -155,7 +54,7 @@ ALPHABET = "abcdefghijklmnopqrstuvwxyz.,'!" class Page(): - def __init__(self, canvas, parent=None): + def __init__(self, canvas, path, level, parent=None): self._activity = parent # Starting from command line @@ -224,6 +123,8 @@ class Page(): svg_str_to_pixbuf(generate_card(string=c, colors=['#000000', '#000000'], background=False)))) + + self.load_level(path, level) self.new_page() def page_list(self): @@ -234,14 +135,7 @@ class Page(): return save_page = self.page - for c in self._cards: - c.set_layer(0) - for c in self._double_cards: - c.set_layer(0) - self._background.set_label('') - self._background.set_layer(0) - self._like_card.set_layer(0) - self._page_2.set_layer(0) + self._clear_all() if self._sugar: self._activity.status.set_label( @@ -255,7 +149,7 @@ class Page(): self._x, self._y = 10, 10 # Each list is a collection of phrases, separated by spaces - for i, card in enumerate(CARDS): + for i, card in enumerate(self._card_level_data): if card[0] == '': break if card[0] in 'AEIOUY': @@ -279,37 +173,39 @@ class Page(): def new_page(self, saved_state=None, deck_index=0): ''' Load a new page. ''' - if self.page == len(CARDS): + if self.page == len(self._word_level_data): self.page = 0 if self._sugar: self._activity.status.set_label('') if self.page == len(self._cards): - if MSG_INDEX[self.page] >= 0: - self._cards.append(Sprite(self._sprites, self._left, - GRID_CELL_SIZE, - svg_str_to_pixbuf(generate_card( - string=CARDS[self.page][0].lower(), - colors=[COLORS[self.page][0], '#000000'], - scale=self._scale, - center=True)))) - self._double_cards.append(Sprite(self._sprites, self._left, - self._height + GRID_CELL_SIZE * 2, - svg_str_to_pixbuf(generate_card( - string=CARDS[self.page][0].lower() + \ - CARDS[self.page][0].lower(), - colors=[COLORS[self.page][0], '#000000'], - scale=self._scale, - font_size=32, - center=True)))) - if COLORS[self.page][2]: - stroke = True - else: - stroke = False - self._colored_letters.append(Sprite(self._sprites, 0, 0, - svg_str_to_pixbuf(generate_card( - string=CARDS[self.page][0].lower(), - colors=[COLORS[self.page][0], '#000000'], - background=False, stroke=stroke)))) + self._cards.append(Sprite(self._sprites, self._left, + GRID_CELL_SIZE, + svg_str_to_pixbuf(generate_card( + string=self._card_level_data[self.page][0].lower(), + colors=[self._color_level_data[self.page][0], + '#000000'], + scale=self._scale, + center=True)))) + self._double_cards.append(Sprite(self._sprites, self._left, + self._height + GRID_CELL_SIZE * 2, + svg_str_to_pixbuf(generate_card( + string=self._card_level_data[self.page][0].lower()\ + + self._card_level_data[self.page][0].lower(), + colors=[self._color_level_data[self.page][0], + '#000000'], + scale=self._scale, + font_size=32, + center=True)))) + if self._color_level_data[self.page][2]: + stroke = True + else: + stroke = False + self._colored_letters.append(Sprite(self._sprites, 0, 0, + svg_str_to_pixbuf(generate_card( + string=self._card_level_data[self.page][0].lower(), + colors=[self._color_level_data[self.page][0], + '#000000'], + background=False, stroke=stroke)))) if self._sugar: self._activity.status.set_label('') @@ -330,10 +226,11 @@ class Page(): self._cards[self.page].set_layer(2) if MSG_INDEX[self.page] == 1: - self._background.set_label(MSGS[1][0] % (COLORS[self.page][1])) + self._background.set_label(MSGS[1][0] % ( + self._color_level_data[self.page][1])) else: self._background.set_label(MSGS[MSG_INDEX[self.page]][0] % \ - (COLORS[self.page][1])) + (self._color_level_data[self.page][1])) self._background.set_layer(1) self._page_2.set_layer(1) @@ -343,14 +240,15 @@ class Page(): self._x = 0 self._y = 0 if MSG_INDEX[self.page] == 1: - self._render_phrase(MSGS[1][1] % (CARDS[self.page][1]), + self._render_phrase(MSGS[1][1] % ( + self._card_level_data[self.page][1]), self._like_card, self._like_gc) self._like_card.move((int((self._width - self._final_x) / 2.0), int(4 * self._height / 5.0))) else: self._render_phrase(MSGS[MSG_INDEX[self.page]][1] % \ - (CARDS[self.page][0], - CARDS[self.page][1]), + (self._card_level_data[self.page][0], + self._card_level_data[self.page][1]), self._like_card, self._like_gc) self._like_card.move((int((self._width - self._final_x) / 2.0), int(3 * self._height / 5.0))) @@ -387,15 +285,17 @@ class Page(): self._like_card.set_layer(0) self._page_2.set_layer(0) + ''' if self._sugar: self._activity.status.set_label( _('Read the sounds one at a time.')) + ''' rect = gtk.gdk.Rectangle(0, 0, self._width, self._height * 2) self._my_canvas.images[0].draw_rectangle(self._my_gc, True, *rect) self.invalt(0, 0, self._width, self._height) self._my_canvas.set_layer(1) p = 0 - my_list = WORDS[self.page].split(' ') + my_list = self._word_level_data[self.page].split(' ') # Some pages are aligned left if self.page > ALIGN: @@ -427,7 +327,8 @@ class Page(): # Process each character in the word for c in range(len(word)): - if MSG_INDEX[self.page] >= 0 and word[c] == CARDS[self.page][0]: + if MSG_INDEX[self.page] >= 0 and \ + word[c] == self._card_level_data[self.page][0]: self._draw_pixbuf( self._colored_letters[self.page].images[0], self._x, self._y, canvas, gc) @@ -493,13 +394,13 @@ class Page(): if MSG_INDEX[self.page] >= 0: if os.path.exists(os.path.join( os.path.abspath('.'), 'sounds', - SOUNDS[self.page][0])): + self._sound_level_data[self.page][0])): play_audio_from_file(self, os.path.join( os.path.abspath('.'), 'sounds', - SOUNDS[self.page][0])) + self._sound_level_data[self.page][0])) else: os.system('espeak "%s" --stdout | aplay' % \ - (SOUNDS[self.page][1])) + (self._sound_level_data[self.page][1])) def _game_over(self, msg=_('Game over')): if self._sugar: @@ -520,6 +421,44 @@ class Page(): self._canvas.window.invalidate_rect( gtk.gdk.Rectangle(int(x), int(y), int(w), int(h)), False) + def load_level(self, path, level): + ''' Load a level from the lessons subdirectory ''' + self._card_level_data = [] + self._color_level_data = [] + self._sound_level_data = [] + f = file(os.path.join(path, 'cards' + '.' + level), 'r') + for line in f: + if len(line) > 0 and line[0] != '#': + word = line.split() + self._card_level_data.append([word[0], word[1]]) + if word[4] == 'False': + self._color_level_data.append([word[2], word[3], False]) + else: + self._color_level_data.append([word[2], word[3], True]) + self._sound_level_data.append([word[5], word[6]]) + f.close() + + self._word_level_data = [] + f = file(os.path.join(path, 'words' + '.' + level), 'r') + for line in f: + if len(line) > 0 and line[0] != '#': + self._word_level_data.append(line) + f.close() + + self._clear_all() + self._cards = [] + self._double_cards = [] + self._colored_letters = [] + + def _clear_all(self): + for c in self._cards: + c.set_layer(0) + for c in self._double_cards: + c.set_layer(0) + self._background.set_label('') + self._background.set_layer(0) + self._like_card.set_layer(0) + self._page_2.set_layer(0) def svg_str_to_pixbuf(svg_string): ''' Load pixbuf from SVG string ''' |