Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2012-05-12 21:09:13 (GMT)
committer Walter Bender <walter.bender@gmail.com>2012-05-12 21:09:13 (GMT)
commitfad0560a208533f2a0091174508805747c49b3b3 (patch)
tree2ae24bde5d8ecf213332b87bf785a0987e59a599
parente1368cee90304f70a10f6c71210fb63f1f0b5275 (diff)
v2
-rw-r--r--NEWS5
-rw-r--r--RecallActivity.py39
-rw-r--r--activity/activity.info2
-rw-r--r--game.py75
4 files changed, 95 insertions, 26 deletions
diff --git a/NEWS b/NEWS
index 79000cc..500414c 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,8 @@
+2
+
+* Add color game
+* Add radio buttons for game selection
+
1
* New game insprired by Claudia Urrea
diff --git a/RecallActivity.py b/RecallActivity.py
index 0fcdbd2..4dd3b5f 100644
--- a/RecallActivity.py
+++ b/RecallActivity.py
@@ -24,7 +24,8 @@ if _have_toolbox:
from sugar.activity.widgets import ActivityToolbarButton
from sugar.activity.widgets import StopButton
-from toolbar_utils import button_factory, label_factory, separator_factory
+from toolbar_utils import button_factory, radio_factory, label_factory, \
+ separator_factory
from utils import json_load, json_dump
import telepathy
@@ -64,6 +65,7 @@ class RecallActivity(activity.Activity):
else:
self.colors = ['#A0FFA0', '#FF8080']
+ self._restoring = False
self._setup_toolbars(_have_toolbox)
self._setup_dispatch_table()
@@ -112,8 +114,26 @@ class RecallActivity(activity.Activity):
toolbox.set_current_toolbar(1)
self.toolbar = games_toolbar
- self._new_game_button_h = button_factory(
- 'view-refresh', self.toolbar, self._new_game_cb,
+ self.radio = []
+ self.radio.append(radio_factory(
+ 'game-1', self.toolbar, self._new_game_cb,
+ cb_arg=0, tooltip=_('Play attention game (repeated symbol).'),
+ group=None))
+ self.radio.append(radio_factory(
+ 'game-2', self.toolbar, self._new_game_cb,
+ cb_arg=1, tooltip=_('Play attention game (missing symbol).'),
+ group=self.radio[0]))
+ self.radio.append(radio_factory(
+ 'game-4', self.toolbar, self._new_game_cb,
+ cb_arg=2, tooltip=_('Play n-back game.'),
+ group=self.radio[0]))
+ self.radio.append(radio_factory(
+ 'game-3', self.toolbar, self._new_game_cb,
+ cb_arg=3, tooltip=_('Play attention game (color symbols).'),
+ group=self.radio[0]))
+
+ new_level_button_h = button_factory(
+ 'view-refresh', self.toolbar, self._new_level_cb,
tooltip=_('Load new images.'))
self.status = label_factory(self.toolbar, '')
@@ -127,9 +147,13 @@ class RecallActivity(activity.Activity):
toolbox.toolbar.insert(stop_button, -1)
stop_button.show()
- def _new_game_cb(self, button=None):
- ''' Start a new game. '''
- self._game.new_game()
+ def _new_level_cb(self, button):
+ ''' Reload a new level. '''
+ self._game.new_game(game=None)
+
+ def _new_game_cb(self, button=None, game=0):
+ ''' Reload a new level. '''
+ self._game.new_game(game=game, restart=(not self._restoring))
def write_file(self, file_path):
""" Write the grid status to the Journal """
@@ -145,6 +169,7 @@ class RecallActivity(activity.Activity):
def _restore(self):
""" Restore the game state from metadata """
+ self._restoring = True
dot_list = []
dots = self.metadata['dotlist'].split()
for dot in dots:
@@ -159,9 +184,11 @@ class RecallActivity(activity.Activity):
level = 0
if 'game' in self.metadata:
game = int(self.metadata['game'])
+ self.radio[game].set_active(True)
else:
game = 0
self._game.restore_game(dot_list, correct, level, game)
+ self._restoring = False
# Collaboration-related methods
diff --git a/activity/activity.info b/activity/activity.info
index 0cc8dd2..8dd06d0 100644
--- a/activity/activity.info
+++ b/activity/activity.info
@@ -1,6 +1,6 @@
[Activity]
name = Recall
-activity_version = 1
+activity_version = 2
license = GPLv3
bundle_id = org.sugarlabs.RecallActivity
exec = sugar-activity RecallActivity.RecallActivity
diff --git a/game.py b/game.py
index f188b73..739bfd7 100644
--- a/game.py
+++ b/game.py
@@ -76,6 +76,8 @@ class Game():
# Find the image files
self._PATHS = glob.glob(os.path.join(self._path, 'images', '*.svg'))
+ self._CPATHS = glob.glob(
+ os.path.join(self._path, 'color-images', '*.svg'))
# Generate the sprites we'll need...
self._sprites = Sprites(self._canvas)
@@ -120,10 +122,6 @@ class Game():
if self._correct > 3 and self._level < len(self._dots):
self._level += 3
self._correct = 0
- elif self._correct > 3 and self._game == 0:
- self._level = 3
- self._correct = 0
- self._game += 1
self._set_label('')
for i in range(3):
@@ -160,9 +158,14 @@ class Game():
else:
self._new_game()
- def new_game(self):
+ def new_game(self, game=None, restart=True):
''' Start a new game. '''
- self._all_clear()
+ if game is not None:
+ self._game = game
+ self._level = 3
+ self._correct = 0
+ if restart:
+ self._all_clear()
def _image_in_dots(self, n):
for i in range(self._level):
@@ -178,14 +181,22 @@ class Game():
def _choose_random_images(self):
''' Choose images at random '''
+ if self._game == 3:
+ maxi = len(self._CPATHS)
+ else:
+ maxi = len(self._PATHS)
for i in range(self._level):
if self._dots[i].type == -1:
- n = int(uniform(0, len(self._PATHS)))
+ n = int(uniform(0, maxi))
while self._image_in_dots(n):
- n = int(uniform(0, len(self._PATHS)))
+ n = int(uniform(0, maxi))
self._dots[i].type = n
- self._dots[i].set_shape(self._new_dot_surface(
- image=self._dots[i].type))
+ if self._game == 3:
+ self._dots[i].set_shape(self._new_dot_surface(
+ color_image=self._dots[i].type))
+ else:
+ self._dots[i].set_shape(self._new_dot_surface(
+ image=self._dots[i].type))
self._dots[i].set_layer(100)
self._dots[i].set_label('')
@@ -213,7 +224,7 @@ class Game():
def _new_game(self, restore=False):
''' Load game images and then ask a question... '''
- if self._game in [0, 1]:
+ if self._game in [0, 1, 3]:
self._choose_random_images()
else: # game 2
# generate a random list
@@ -245,7 +256,7 @@ class Game():
_logger.debug('sending a new game')
self._parent.send_new_game()
- if self._game < 2:
+ if self._game in [0, 1, 3]:
self._timeout_id = gobject.timeout_add(
3000, self._ask_the_question)
@@ -299,6 +310,24 @@ class Game():
self._opts[i].set_shape(self._new_dot_surface(
image=self._opts[i].type))
self._opts[i].set_layer(100)
+ elif self._game == 3:
+ self._set_label(_('Recall which image was not shown.'))
+ # Show the possible solutions
+ for i in range(3):
+ n = int(uniform(0, len(self._CPATHS)))
+ while(not self._image_in_dots(n) or \
+ self._image_in_opts(n)):
+ n = int(uniform(0, len(self._CPATHS)))
+ self._opts[i].type = n
+ self._answer = int(uniform(0, 3))
+ n = int(uniform(0, len(self._CPATHS)))
+ while(self._image_in_dots(n)):
+ n = int(uniform(0, len(self._CPATHS)))
+ self._opts[self._answer].type = n
+ for i in range(3):
+ self._opts[i].set_shape(self._new_dot_surface(
+ color_image=self._opts[i].type))
+ self._opts[i].set_layer(100)
elif self._game == 2:
self._set_label(ngettext(
'Recall which image was displayed %d time ago',
@@ -354,7 +383,7 @@ class Game():
if spr == None:
return
- if self._game in [0, 1]:
+ if self._game in [0, 1, 3]:
for i in range(3):
if self._opts[i] == spr:
break
@@ -379,7 +408,7 @@ class Game():
self._opts[i].set_label('☹')
self._correct = 0
- if self._game in [0, 1]:
+ if self._game in [0, 1, 3]:
for i in range(self._level):
self._dots[i].set_layer(100)
else:
@@ -420,10 +449,16 @@ class Game():
def _destroy_cb(self, win, event):
gtk.main_quit()
- def _new_dot_surface(self, color='#000000', image=None):
+ def _new_dot_surface(self, color='#000000', image=None, color_image=None):
''' generate a dot of a color color '''
self._dot_cache = {}
- if image is not None:
+ if color_image is not None:
+ if color_image + 10000 in self._dot_cache:
+ return self._dot_cache[color_image + 10000]
+ pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
+ os.path.join(self._path, self._CPATHS[color_image]),
+ self._svg_width, self._svg_height)
+ elif image is not None:
if image in self._dot_cache:
return self._dot_cache[image]
pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
@@ -450,10 +485,12 @@ class Game():
context.set_source_pixbuf(pixbuf, 0, 0)
context.rectangle(0, 0, self._svg_width, self._svg_height)
context.fill()
- if image is None:
- self._dot_cache[color] = surface
- else:
+ if color_image is not None:
+ self._dot_cache[color_image + 10000] = surface
+ elif image is not None:
self._dot_cache[image] = surface
+ else:
+ self._dot_cache[color] = surface
return surface
def _line(self, vertical=True):