[Sugar-devel] [PATCH Maze] Allow collaboration (SL #3296)

Rafael Ortiz rafael at activitycentral.com
Mon Apr 16 13:08:50 EDT 2012


On Mon, Apr 16, 2012 at 10:07 AM, Manuel Kaufmann <humitos at 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
> "6be01ff2bcfaa58eeacc7f10a57b77b65470d413 at 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 at 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:
> +            #  *
> 6be01ff2bcfaa58eeacc7f10a57b77b65470d413 at 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20120416/d9911f24/attachment-0001.html>


More information about the Sugar-devel mailing list