Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xactivity.py19
-rwxr-xr-xgame.py147
-rwxr-xr-xmemorizetoolbar.py51
-rw-r--r--messenger.py43
-rw-r--r--model.py11
5 files changed, 152 insertions, 119 deletions
diff --git a/activity.py b/activity.py
index 2d5be77..aa846a3 100755
--- a/activity.py
+++ b/activity.py
@@ -203,24 +203,27 @@ class MemorizeActivity(Activity):
self.table.connect('card-flipped', self.game.card_flipped)
self.table.connect('card-highlighted', self.game.card_highlighted)
- self.game.connect('msg_buddy', self.scoreboard.set_buddy_message)
- self.game.connect('reset_scoreboard', self.scoreboard.reset)
- self.game.connect('reset_table', self.table.reset)
- self.game.connect('load_game', self.table.load_game)
- self.game.connect('load_mode', self.table.load_msg)
- self.game.connect('change_game', self.table.change_game)
- #self.game.connect('load_game', self._memorizeToolbar.update_toolbar)
- #self.game.connect('change_game', self._memorizeToolbar.update_toolbar)
self.game.connect('set-border', self.table.set_border)
self.game.connect('flop-card', self.table.flop_card)
self.game.connect('flip-card', self.table.flip_card)
self.game.connect('highlight-card', self.table.highlight_card)
+ self.game.connect('load_mode', self.table.load_msg)
+
+ self.game.connect('msg_buddy', self.scoreboard.set_buddy_message)
self.game.connect('add_buddy', self.scoreboard.add_buddy)
self.game.connect('rem_buddy', self.scoreboard.rem_buddy)
self.game.connect('increase-score', self.scoreboard.increase_score)
self.game.connect('wait_mode_buddy', self.scoreboard.set_wait_mode)
self.game.connect('change-turn', self.scoreboard.set_selected)
+ self.game.connect('reset_scoreboard', self.scoreboard.reset)
+ self.game.connect('reset_table', self.table.reset)
+
+ self.game.connect('load_game', self.table.load_game)
+ self.game.connect('change_game', self.table.change_game)
+ self.game.connect('load_game', self._memorizeToolbar.update_toolbar)
+ self.game.connect('change_game', self._memorizeToolbar.update_toolbar)
+
self._memorizeToolbar.connect('game_changed', self.game.change_game)
self.connect('shared', self._shared_cb)
self.play_load = True
diff --git a/game.py b/game.py
index 0a867fb..993cf04 100755
--- a/game.py
+++ b/game.py
@@ -53,7 +53,7 @@ class MemorizeGame(GObject):
'rem_buddy': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
'increase-score': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
'wait_mode_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
- 'msg_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ 'msg_buddy': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
'change-turn': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
}
@@ -103,9 +103,15 @@ class MemorizeGame(GObject):
self.set_load_mode('Loading game...')
self.model.grid = grid
self.model.data = data
+ self.model.data['mode'] = mode
self.emit('reset_scoreboard')
if not signal:
- self.emit('change_game_signal', mode, self.get_grid(), self.get_data(), self.waiting_players, self.model.data['game_file'])
+ self.emit('change_game_signal',
+ mode,
+ self.get_grid(),
+ self.get_data(),
+ self.waiting_players,
+ self.model.data['game_file'])
self.emit('change_game', self.get_data(), self.get_grid())
for buddy in self.players:
self.players_score[buddy] = 0
@@ -114,6 +120,7 @@ class MemorizeGame(GObject):
self.last_highlight = 1
self.change_turn()
self.model.data['running'] = 'False'
+
for card in self.model.grid:
if card['state'] == '1':
self.emit('flip-card', self.model.grid.index(card))
@@ -137,6 +144,10 @@ class MemorizeGame(GObject):
def rem_buddy(self, buddy):
_logger.debug('Buddy %r was removed from game', buddy.props.nick)
if self.current_player == buddy and len(self.players) >= 2:
+ if self.last_flipped != -1:
+ self.emit('flop-card', self.last_flipped)
+ self.model.grid[self.last_flipped]['state'] = '0'
+ self.last_flipped = -1
self.change_turn()
index = self.players.index(buddy)
del self.players[index]
@@ -154,104 +165,106 @@ class MemorizeGame(GObject):
elif self.current_player == self.players[-1]:
self.current_player = self.players[0]
else:
- self.current_player = self.players[self.players.index(self.current_player)+1]
+ next = self.players[self.players.index(self.current_player)+1]
+ self.current_player = next
self.set_sensitive(self.current_player == self.myself)
self.emit('change-turn', self.current_player)
+ def play_sound(self, snd, sound_file):
+ if len(snd.split('.')) > 1:
+ if snd.split('.')[1] in ['wav', 'aif', 'aiff']:
+ self.cs.perform('i 102 0.0 3.0 "%s" 1 0.9 0'%(sound_file))
+ else:
+ self.cs.perform('i 100 0.0 3.0 "%s" 1 0.9 0'%(sound_file))
+
def card_flipped(self, widget, id, signal = False):
+
# Check if is my turn
- if not self.sentitive and not signal:
- return
-
- # do not process flips when flipping back
- if self.flip_block is True:
+ if (not self.sentitive and not signal) or self.last_flipped == id:
return
# Handle groups if needed
- if self.model.data['divided'] == '1':
+ if self.model.data.get('divided') == '1':
if self.last_flipped == -1 and id >= (len(self.model.grid)/2):
return
if self.last_flipped <> -1 and id < (len(self.model.grid)/2):
return
+
+ # do not process flips when flipping back
+ if self.flip_block:
+ return
+ else:
+ self.flip_block = True
+
self.model.data['running'] = 'True'
- # play sound in any case if available
+ # play sound in case if available
if self.sound == 1:
snd = self.model.grid[id].get('snd', None)
if snd != None:
- sound_file = join(self.model.data.get('pathsnd'),snd)
- if len(snd.split('.')) > 1:
- if snd.split('.')[1] in ['wav', 'aif', 'aiff']:
- self.cs.perform('i 102 0.0 3.0 "%s" 1 0.9 0'%(sound_file))
- else:
- self.cs.perform('i 100 0.0 3.0 "%s" 1 0.9 0'%(sound_file))
- _logger.debug('Audio: play sound=%s'%sound_file)
+ sound_file = join(self.model.data.get('pathsnd'), snd)
+ self.play_sound(snd, sound_file)
+ self.emit('flip-card', id)
+ if not signal:
+ self.emit('flip-card-signal', id)
+
# First card case
if self.last_flipped == -1:
self.last_flipped = id
self.model.grid[id]['state'] = '1'
- self.emit('flip-card', id)
- if not signal:
- self.emit('flip-card-signal', id)
- if self.model.data['divided'] == '1':
- self.card_highlighted(widget, -1, False)
+ self.flip_block = False
- # Pair matched
- elif self.model.grid[self.last_flipped]['pairkey'] == self.model.grid[id]['pairkey']:
- stroke_color, fill_color = self.current_player.props.color.split(',')
- self.emit('set-border', id, stroke_color, fill_color)
- self.emit('set-border', self.last_flipped, stroke_color, fill_color)
- self.increase_point(self.current_player)
- self.model.grid[id]['state'] = self.current_player.props.color
- self.model.grid[self.last_flipped]['state'] = self.current_player.props.color
- self.emit('flip-card', id)
- if self.model.data['divided'] == '1':
- self.card_highlighted(widget, -1, False)
- if not signal:
- self.emit('flip-card-signal', id)
+ # Second card case
+ else:
+ # Pair matched
+ pair_key_1 = self.model.grid[self.last_flipped]['pairkey']
+ pair_key_2 = self.model.grid[id]['pairkey']
+
+ if pair_key_1 == pair_key_2:
+ stroke_color, fill_color = self.current_player.props.color.split(',')
+ self.emit('set-border', id, stroke_color, fill_color)
+ self.emit('set-border', self.last_flipped, stroke_color, fill_color)
+
+ self.increase_point(self.current_player)
+ self.model.grid[id]['state'] = self.current_player.props.color
+ self.model.grid[self.last_flipped]['state'] = self.current_player.props.color
+ self.flip_block = False
+ # Pair didn't match
+ else:
+ self.model.grid[id]['state'] = '1'
+ self.set_sensitive(False)
+ timeout_add(2000, self.flop_card, id, self.last_flipped)
self.last_flipped = -1
- # Pair don't match
- elif self.model.grid[self.last_flipped]['pairkey'] != self.model.grid[id]['pairkey']:
- self.flip_block = True
- self.emit('flip-card', id)
- if not signal:
- self.emit('flip-card-signal', id)
- self.model.grid[id]['state'] = '1'
- timeout_add(2000, self.flop_card, id, widget)
-
- def flop_card(self, id, widget):
+
+ def flop_card(self, id, id2):
self.emit('flop-card', id)
self.model.grid[id]['state'] = '0'
- self.emit('flop-card', self.last_flipped)
- if self.model.data['divided'] == '1':
- self.card_highlighted(widget, -1, False)
- # self.emit('highlight-card', id, True)
- self.model.grid[self.last_flipped]['state'] = '0'
- self.last_flipped = -1
+ self.emit('flop-card', id2)
+ self.model.grid[id2]['state'] = '0'
+
+ #if self.model.data['divided'] == '1':
+ # self.card_highlighted(widget, -1, False)
+ self.set_sensitive(True)
self.flip_block = False
self.change_turn()
def card_highlighted(self, widget, id, mouse):
- if id == -1:
- self.last_highlight = 1
- self.emit('highlight-card', self.last_highlight, False)
- return
-
- if not self.sentitive:
+ self.emit('highlight-card', self.last_highlight, False)
+ self.last_highlight = id
+
+ if id == -1 or not self.sentitive:
return
+
if self.model.data['divided'] == '1':
if self.last_flipped == -1 and id >= (len(self.model.grid)/2):
return
if self.last_flipped <> -1 and id < (len(self.model.grid)/2):
return
- self.emit('highlight-card', self.last_highlight, False)
- if mouse and self.model.grid[id]['state']=='0':
- self.emit('highlight-card', id, True)
- if not mouse:
+
+ if mouse and self.model.grid[id]['state']=='0' or not mouse:
self.emit('highlight-card', id, True)
-
- self.last_highlight = id
+
def increase_point(self, buddy):
self.players_score[buddy] += 1
@@ -263,12 +276,11 @@ class MemorizeGame(GObject):
def get_data(self):
return self.model.data
- def change_game(self, widget, game_name, size, mode, title = None, color= None):
- if mode in ['file','demo']:
+ def change_game(self, widget, game_name, size, mode, title = None, color= None):
+ if mode in ['file', 'demo']:
if self.model.read(game_name) != 0:
logging.error(' Reading setup file %s'%game_name)
return
- #elif mode in ['reset','size']:
if size == None:
size = int(self.model.data['size'])
self.model.def_grid(size)
@@ -295,8 +307,7 @@ class MemorizeGame(GObject):
self.sentitive = status
if not status:
self.emit('highlight-card', self.last_highlight, False)
- else:
- self.emit('highlight-card', self.last_highlight, True)
+
def get_sensitive(self):
return self.sentitive
diff --git a/memorizetoolbar.py b/memorizetoolbar.py
index 015ac47..f57c410 100755
--- a/memorizetoolbar.py
+++ b/memorizetoolbar.py
@@ -32,8 +32,22 @@ _logger = logging.getLogger('memorize-activity')
class MemorizeToolbar(gtk.Toolbar):
__gtype_name__ = 'MemoryToolbar'
- standard_game_names = ['Load demo games', 'addition', 'capitals', 'drumgit', 'letters', 'numbers', 'phonemes']
- translated_game_names = [_('Load demo games'), _('addition'), _('capitals'), _('drumgit'), _('letters'), _('numbers'), _('phonemes')]
+ standard_game_names = ['Load demo games',
+ 'addition',
+ 'capitals',
+ 'drumgit',
+ 'letters',
+ 'numbers',
+ 'phonemes'
+ ]
+ translated_game_names = [_('Load demo games'),
+ _('addition'),
+ _('capitals'),
+ _('drumgit'),
+ _('letters'),
+ _('numbers'),
+ _('phonemes')
+ ]
__gsignals__ = {
'game_changed': (SIGNAL_RUN_FIRST, None, 5 * [TYPE_PYOBJECT])
@@ -76,9 +90,10 @@ class MemorizeToolbar(gtk.Toolbar):
self._sizes = ['4 X 4', '5 X 5', '6 X 6']
for i, f in enumerate(self._sizes):
self._size_combo.combo.append_item(i, f)
- self._size_combo.combo.connect('changed', self._game_size_cb)
+ self.size_handle_id = self._size_combo.combo.connect('changed', self._game_size_cb)
self._add_widget(self._size_combo)
-
+ self._size_combo.combo.set_active(0)
+
separator = gtk.SeparatorToolItem()
separator.set_draw(True)
self.insert(separator, -1)
@@ -105,7 +120,9 @@ class MemorizeToolbar(gtk.Toolbar):
self.emit('game_changed', None, None, 'reset', None, None)
def _load_game(self, button):
- chooser = ObjectChooser(_('Choose memorize game'), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
+ chooser = ObjectChooser(_('Choose memorize game'),
+ None,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
jobject = ''
try:
result = chooser.run()
@@ -133,20 +150,20 @@ class MemorizeToolbar(gtk.Toolbar):
def _game_changed_cb(self, combobox):
if combobox.get_active() == 0: return
- if not self._lock:
- game_name = self.standard_game_names[self._game_combo.combo.get_active()]
- game_file = join(dirname(__file__), 'demos', game_name+'.zip')
- game_size = int(self._sizes[self._size_combo.combo.get_active()][0])
- if game_name in self.translated_game_names:
- index = self.translated_game_names.index(game_name)
- game_name = self.standard_game_names[index]
- self.emit('game_changed', game_file, game_size, 'demo', None, None)
- #self.activity.change_game(game_file, game_size)
- self._game_combo.combo.set_active(0)
+ title = game_name = self.standard_game_names[self._game_combo.combo.get_active()]
+ game_size = int(self._sizes[self._size_combo.combo.get_active()][0])
+
+ if game_name in self.translated_game_names:
+ index = self.translated_game_names.index(game_name)
+ game_name = self.standard_game_names[index]
+
+ game_file = join(dirname(__file__), 'demos', game_name+'.zip')
+ self.emit('game_changed', game_file, game_size, 'demo', title, None)
+ self._game_combo.combo.set_active(0)
def update_toolbar(self, widget, data, grid):
size = data.get('size')
- self._lock = True
+ self._size_combo.combo.handler_block(self.size_handle_id)
size_index = self._sizes.index(size+' X '+size)
self._size_combo.combo.set_active(int(size_index))
- self._lock = False
+ self._size_combo.combo.handler_unblock(self.size_handle_id)
diff --git a/messenger.py b/messenger.py
index e66e115..f7fc2bc 100644
--- a/messenger.py
+++ b/messenger.py
@@ -73,9 +73,10 @@ class Messenger(ExportedGObject):
self.ordered_bus_names.append(sender)
data = self.game.model.data
path = data['game_file']
- title = data.get('title', 'Received game')
- color = data.get('color', '#ff00ff,#00ff00')
- self.file_sender(path, title, color)
+ if self.game.model.data['mode'] == 'file':
+ title = data.get('title', 'Received game')
+ color = data.get('color', '#ff00ff,#00ff00')
+ self.file_sender(sender, path, title, color)
remote_object = self._tube.get_object(sender, PATH)
remote_object.load_game(self.ordered_bus_names,
@@ -91,16 +92,18 @@ class Messenger(ExportedGObject):
self.player_id = bus_names.index(self._tube.get_unique_name())
#self.game.load_waiting_list(list)
self.game.current_player = self.game.players[current_player]
- self._change_game_receiver('file', grid, data, path)
+ self._change_game_receiver(data['mode'], grid, data, path)
# Change game method
def change_game(self, sender, mode, grid, data, waiting_list, zip):
path = self.game.model.data['game_file']
- title = data.get('title', 'Received game')
- color = data.get('color', '')
+
if mode == 'file':
- self.file_sender(path, title, color)
+ title = data.get('title', 'Received game')
+ color = data.get('color', '')
+ self.file_sender('all', path, title, color)
+
self._change_game_signal(mode, grid, data, path)
def _change_game_handler(self):
@@ -119,33 +122,31 @@ class Messenger(ExportedGObject):
if sender == self._tube.get_unique_name():
return
if mode == 'demo':
- game_name = self.game.model.data['key']
- game_file = join(dirname(__file__), 'demos', game_name+'.zip')
+ game_name = basename(data.get('game_file', 'debug-demo'))
+ game_file = join(dirname(__file__), 'demos', game_name).encode('ascii')
self.game.model.read(game_file)
if mode == 'file':
self.game.model.read(self.files[path])
+
data['path'] = self.game.model.data['path']
data['pathimg'] = self.game.model.data['pathimg']
data['pathsnd'] = self.game.model.data['pathsnd']
- if mode == 'demo':
- self.game.load_remote(grid, data, mode, True)
- else:
- self.game.load_remote(grid, data, mode, True)
+ self.game.load_remote(grid, data, mode, True)
# File transfer methods
-
- def file_sender(self, filename, title, color):
+
+ def file_sender(self, target, filename, title, color):
size = getsize(filename)
f = open(filename, 'r+b')
part_size = 4096
num_parts = (size / part_size) +1
for part in range(num_parts):
bytes = f.read(part_size)
- self._file_part_signal(filename, part+1, num_parts, bytes, title, color)
+ self._file_part_signal(target, filename, part+1, num_parts, bytes, title, color)
f.close()
- @signal(dbus_interface=IFACE, signature='suuayss')
- def _file_part_signal(self, filename, part, numparts, bytes, title, color):
+ @signal(dbus_interface=IFACE, signature='ssuuayss')
+ def _file_part_signal(self, target, filename, part, numparts, bytes, title, color):
pass
def _file_part_handler(self):
@@ -156,11 +157,15 @@ class Messenger(ExportedGObject):
sender_keyword='sender',
byte_arrays=True)
- def _file_part_receiver(self, filename, part, numparts, bytes, title=None, color=None, sender=None):
+ def _file_part_receiver(self, target, filename, part, numparts, bytes, title=None, color=None, sender=None):
# ignore my own signal
if sender == self._tube.get_unique_name():
return
+ if not (target == 'all' or target == self._tube.get_unique_name()):
+ return
+
+
# first chunk
if part == 1:
temp_dir = tempfile.mkdtemp()
diff --git a/model.py b/model.py
index 0751d57..ddfacbc 100644
--- a/model.py
+++ b/model.py
@@ -19,7 +19,7 @@
import libxml2
import os
-from os.path import join, basename
+from os.path import join, basename, dirname
import logging
import random
import gobject
@@ -104,7 +104,7 @@ class Model(object):
self.data['align'] = '1'
try:
- self.dtd = libxml2.parseDTD(None, os.path.join(self.dtd_path, 'memorize.dtd'))
+ self.dtd = libxml2.parseDTD(None, join(self.dtd_path, 'memorize.dtd'))
except libxml2.parserError, e:
_logger.error('Init: no memorize.dtd found ' +str(e))
self.dtd = None
@@ -122,10 +122,6 @@ class Model(object):
self.count = 0
def read(self, game_file):
- if game_file in ["addition", "capitals", "drumgit", "letters", "numbers", "phonemes"]:
- game_file = os.path.join(os.path.dirname(__file__), 'games', game_file+'.zip')
- game_name = os.path.basename(game_file)[:-4]
-
temp_folder = tempfile.mkdtemp()
self.data['key'] = os.path.basename(game_file)
self.data['game_file'] = game_file
@@ -148,7 +144,7 @@ class Model(object):
''' reads the configuration from an xml file '''
try:
- doc = libxml2.parseFile(os.path.join(os.path.dirname(__file__), os.path.join(self.data['path'], 'game.xml')))
+ doc = libxml2.parseFile(join(dirname(__file__), join(self.data['path'], 'game.xml')))
if doc.validateDtd(self.ctxt, self.dtd):
# get the requested nodes
@@ -320,6 +316,7 @@ class Model(object):
random.shuffle(temp1)
self.grid = temp1
_logger.debug('Defgrid: grid( size=%s ): %s' %(self.data['size'], self.grid))
+ _logger.debug('Defgrid: data: %s' %self.data)
def set_data_grid(self, data, grid):
self.data = data