On Mon, Apr 16, 2012 at 10:07 AM, Manuel Kaufmann <humi...@gmail.com> wrote:
> 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 > "6be01ff2bcfaa58eeacc7f10a57b77b65470d...@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 <humi...@gmail.com> > --- > game.py | 88 > +++++++++++++++++++++++++++++++++++++-------------------------- > 1 file 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: > + # * > 6be01ff2bcfaa58eeacc7f10a57b77b65470d...@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() > -- > 1.7.9.5 > > Ok SL #3296 can be closed after test as it allows collab (other issues should be entered to account OLPC #10750 and to be able to play between two players). Patch applied as: http://git.sugarlabs.org/maze/mainline/commit/32a8c45503e17ad8b5e8a2f3c756b21cbdbf1d2f Thanks.
_______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel