Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Kaufmann <humitos@gmail.com>2012-04-16 15:07:38 (GMT)
committer Rafael Ortiz <rafael@activitycentral.com>2012-04-16 17:01:14 (GMT)
commit32a8c45503e17ad8b5e8a2f3c756b21cbdbf1d2f (patch)
treeb9fee307018c68775bd137405862b3a32f03fc3c
parentd3d76b2f7b91aa8ecdc36952e29cbd07eb936658 (diff)
Allow collaboration (SL #3296)
Replaced "get_buddy" function by "lookup_buddy" as suggested the Error message. In this version is not allowed to play with more than one player in each XO (using the gamepad keywords). This is because a known issue [1] and we can not handle the child's nick properly. The "mesh.PARTICIPANT_ADD" event sends something like "6be01ff2bcfaa58eeacc7f10a57b77b65470d413@jabber.sugarlabs.org" in the "buddy.prosp.nick" variable and the "mesh.broadcast" send the correct child's name. So, when Maze creates the players uses the mesh.PARTICIPANT_ADD value and when it reads the messages it find the correct name (the name that the child chose) [1] http://dev.laptop.org/ticket/10750 Signed-off-by: Manuel Kaufmann <humitos@gmail.com> Signed-off-by: Rafael Ortiz <rafael@activitycentral.com>
-rw-r--r--game.py88
1 files changed, 52 insertions, 36 deletions
diff --git a/game.py b/game.py
index f710d92..b6319b1 100644
--- a/game.py
+++ b/game.py
@@ -244,37 +244,44 @@ class MazeGame:
self.mouse_in_use = 0
elif event.type == mesh.CONNECT:
- print "Connected to the mesh."
+ log.debug("Connected to the mesh")
elif event.type == mesh.PARTICIPANT_ADD:
- buddy = mesh.get_buddy(event.handle)
- if event.handle == mesh.my_handle():
- print "Me:", buddy.props.nick, buddy.props.color
- else:
- print "Join:", buddy.props.nick, buddy.props.color
- player = Player(buddy)
- self.remoteplayers[event.handle] = player
- self.allplayers.append(player)
- self.allplayers.extend(player.bonusPlayers())
- self.markPointDirty(player.position)
- # send a test message to the new player
- mesh.broadcast("Welcome %s" % player.nick)
- # tell them which maze we are playing, so they can sync up
- mesh.send_to(event.handle, "maze:%d,%d,%d,%d" % \
- (self.game_running_time(),
- self.maze.seed,
- self.maze.width, self.maze.height))
- for player in self.localplayers:
- if not player.hidden:
- mesh.send_to(event.handle, "move:%s,%d,%d,%d,%d" % \
- (player.nick,
- player.position[0],
- player.position[1],
- player.direction[0],
- player.direction[1]))
+ log.debug('mesh.PARTICIPANT_ADD')
+
+ def withBuddy(buddy):
+ if event.handle == mesh.my_handle():
+ log.debug("Me: %s - %s", buddy.props.nick,
+ buddy.props.color)
+ else:
+ log.debug("Join: %s - %s", buddy.props.nick,
+ buddy.props.color)
+ player = Player(buddy)
+ self.remoteplayers[event.handle] = player
+ self.allplayers.append(player)
+ self.allplayers.extend(player.bonusPlayers())
+ self.markPointDirty(player.position)
+ # send a test message to the new player
+ mesh.broadcast("Welcome %s" % player.nick)
+ # tell them which maze we are playing, so they can sync up
+ mesh.send_to(event.handle, "maze:%d,%d,%d,%d" % \
+ (self.game_running_time(),
+ self.maze.seed,
+ self.maze.width, self.maze.height))
+ for player in self.localplayers:
+ if not player.hidden:
+ mesh.send_to(event.handle, "move:%s,%d,%d,%d,%d" % \
+ (player.nick,
+ player.position[0],
+ player.position[1],
+ player.direction[0],
+ player.direction[1]))
+
+ mesh.lookup_buddy(event.handle, callback=withBuddy)
elif event.type == mesh.PARTICIPANT_REMOVE:
+ log.debug('mesh.PARTICIPANT_REMOVE')
if event.handle in self.remoteplayers:
player = self.remoteplayers[event.handle]
- print "Leave:", player.nick
+ log.debug("Leave: %s", player.nick)
self.markPointDirty(player.position)
self.allplayers.remove(player)
for bonusplayer in player.bonusPlayers():
@@ -283,9 +290,7 @@ class MazeGame:
del self.remoteplayers[event.handle]
elif event.type == mesh.MESSAGE_UNI or \
event.type == mesh.MESSAGE_MULTI:
- buddy = mesh.get_buddy(event.handle)
- # print "Message from %s / %s: %s" % (buddy.props.nick,
- # event.handle, event.content)
+ log.debug('mesh.MESSAGE_UNI or mesh.MESSAGE_MULTI')
if event.handle == mesh.my_handle():
# ignore messages from ourself
pass
@@ -294,10 +299,10 @@ class MazeGame:
try:
self.handleMessage(player, event.content)
except:
- print "Error handling message: %s\n%s" % \
- (event, sys.exc_info())
+ log.debug("Error handling message: %s\n%s",
+ event, sys.exc_info())
else:
- print "Message from unknown buddy?"
+ log.debug("Message from unknown buddy?")
elif event.type == pygame.USEREVENT:
# process our buttons
@@ -355,14 +360,26 @@ class MazeGame:
finish: nick, elapsed
A player has finished the maze
"""
+ log.debug('mesh message: %s', message)
+
# ignore messages from myself
if player in self.localplayers:
return
if message.startswith("move:"):
# a player has moved
nick, x, y, dx, dy = message[5:].split(",")[:5]
- player = player.bonusPlayer(nick)
+
+ # README: this function (player.bonusPlayer) sometimes
+ # returns None and the activity doesn't move the players.
+ # This is because the name sent to the server is the
+ # child's name but it returns something like this:
+ # * 6be01ff2bcfaa58eeacc7f10a57b77b65470d413@jabber.sugarlabs.org
+ # So, we have set remote users with this kind of name but
+ # we receive the reald child's name in the mesh message
+
+ # player = player.bonusPlayer(nick)
player.hidden = False
+
self.markPointDirty(player.position)
player.position = (int(x), int(y))
player.direction = (int(dx), int(dy))
@@ -389,8 +406,7 @@ class MazeGame:
self.markPointDirty(player.position)
else:
# it was something I don't recognize...
- print "Message from %s: %s" % (player.nick, message)
- pass
+ log.debug("Message from %s: %s", player.nick, message)
def arrowKeysPressed(self):
keys = pygame.key.get_pressed()