[Sugar-devel] [PATCH Maze] Collaboration: allow multiple users in the same XO

Rafael Ortiz rafael at activitycentral.com
Fri Apr 20 12:31:53 EDT 2012


On Mon, Apr 16, 2012 at 10:24 PM, Manuel Kaufmann <humitos at gmail.com> wrote:

> This is a workaround to the problem with the real nick on a jabber
> server[1].
> Now, we are using the unique identifier (mesh.my_handle or event.handle)
> for
> each player in the game plus a "-%d" at the end of the uid. This value
> (Player.uid) is added only when the Activity is shared otherwise this
> field is None.
>
> This new workaround allow to distinguish between many users (up to 3) for
> each
> XO laptop -using the gamepad keys.
>
> [1] http://dev.laptop.org/ticket/10750
>
> Signed-off-by: Manuel Kaufmann <humitos at gmail.com>
> ---
>  game.py   |   27 ++++++++++++++++++++-------
>  player.py |   24 ++++++++++++++----------
>  2 files changed, 34 insertions(+), 17 deletions(-)
>
> diff --git a/game.py b/game.py
> index b6319b1..85f6d7f 100644
> --- a/game.py
> +++ b/game.py
> @@ -33,7 +33,9 @@ import pygame
>  import olpcgames
>
>  import logging
> +logging.basicConfig()
>  log = logging.getLogger('Maze')
> +log.setLevel(logging.DEBUG)
>
>  import olpcgames.pausescreen as pausescreen
>  import olpcgames.mesh as mesh
> @@ -195,7 +197,7 @@ class MazeGame:
>
>                 if len(self.remoteplayers) > 0:
>                     mesh.broadcast("move:%s,%d,%d,%d,%d" % \
> -                                   (player.nick,
> +                                   (player.uid,
>                                     player.position[0],
>                                     player.position[1],
>                                     player.direction[0],
> @@ -245,6 +247,7 @@ class MazeGame:
>
>         elif event.type == mesh.CONNECT:
>             log.debug("Connected to the mesh")
> +
>         elif event.type == mesh.PARTICIPANT_ADD:
>             log.debug('mesh.PARTICIPANT_ADD')
>
> @@ -252,10 +255,19 @@ class MazeGame:
>                 if event.handle == mesh.my_handle():
>                     log.debug("Me: %s - %s", buddy.props.nick,
>                                   buddy.props.color)
> +                    # README: this is a workaround to use an unique
> +                    # identifier instead the nick of the buddy
> +                    # http://dev.laptop.org/ticket/10750
> +                    count = ''
> +                    for i, player in enumerate(self.localplayers):
> +                        if i > 0:
> +                            count = '-%d' % i
> +                        player.uid = mesh.my_handle() + count
>                 else:
>                     log.debug("Join: %s - %s", buddy.props.nick,
>                                   buddy.props.color)
>                     player = Player(buddy)
> +                    player.uid = event.handle
>                     self.remoteplayers[event.handle] = player
>                     self.allplayers.append(player)
>                     self.allplayers.extend(player.bonusPlayers())
> @@ -269,8 +281,9 @@ class MazeGame:
>                                   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,
> +                            mesh.send_to(event.handle,
> +                                         "move:%s,%d,%d,%d,%d" % \
> +                                         (player.uid,
>                                           player.position[0],
>                                           player.position[1],
>                                           player.direction[0],
> @@ -367,7 +380,7 @@ class MazeGame:
>             return
>         if message.startswith("move:"):
>             # a player has moved
> -            nick, x, y, dx, dy = message[5:].split(",")[:5]
> +            uid, x, y, dx, dy = message[5:].split(",")[:5]
>
>             # README: this function (player.bonusPlayer) sometimes
>             # returns None and the activity doesn't move the players.
> @@ -377,7 +390,7 @@ class MazeGame:
>             # 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 = player.bonusPlayer(uid)
>             player.hidden = False
>
>             self.markPointDirty(player.position)
> @@ -400,8 +413,8 @@ class MazeGame:
>                 self.reset()
>         elif message.startswith("finish:"):
>             # someone finished the maze
> -            nick, elapsed = message[7:].split(",")[:2]
> -            player = player.bonusPlayer(nick)
> +            uid, elapsed = message[7:].split(",")[:2]
> +            player = player.bonusPlayer(uid)
>             player.elapsed = float(elapsed)
>             self.markPointDirty(player.position)
>         else:
> diff --git a/player.py b/player.py
> index a6636dc..ee2df37 100644
> --- a/player.py
> +++ b/player.py
> @@ -22,15 +22,12 @@
>  #     You should have received a copy of the GNU General Public License
>  #     along with Maze.activity.  If not, see <
> http://www.gnu.org/licenses/>.
>
> -from olpcgames.util import get_bundle_path
> -bundlepath = get_bundle_path()
> -from sugar.graphics.icon import Icon
> -from sugar.graphics.xocolor import XoColor
>  import pygame
> -import re
> -import os
>  import unicodedata
>
> +from olpcgames.util import get_bundle_path
> +bundlepath = get_bundle_path()
> +
>
>  class Player:
>     def __init__(self, buddy, shape='circle'):
> @@ -39,6 +36,11 @@ class Player:
>         self.nick = unicodedata.normalize('NFC',name)
>         colors = buddy.props.color.split(",")
>
> +        # this field is None when the activity is not shared and when
> +        # the user shared it this field will become to
> +        # "olpcgames.mesh.my_handle()"
> +        self.uid = None
> +
>         def string2Color(str):
>             return (int(str[1:3], 16), int(str[3:5], 16), int(str[5:7],
> 16))
>         self.colors = map(string2Color, colors)
> @@ -123,17 +125,19 @@ class Player:
>             self.bonusplayers.append(Player(self.buddy, 'square'))
>             self.bonusplayers.append(Player(self.buddy, 'triangle'))
>
> -            count = 2
> +            count = 1
>             for player in self.bonusplayers:
>                 player.nick = self.nick + "-%d" % count
> +                if self.uid is not None:
> +                    player.uid = self.uid + "-%d" % count
>                 player.hidden = True
>                 count += 1
>
>         return self.bonusplayers
>
> -    def bonusPlayer(self, nick):
> -        if nick == self.nick:
> +    def bonusPlayer(self, uid):
> +        if uid == self.uid:
>             return self
>         for bonusplayer in self.bonusPlayers():
> -            if bonusplayer.nick == nick:
> +            if bonusplayer.uid == uid:
>                 return bonusplayer
> --
> 1.7.9.5
>
> I applied your patch locally (with a little change in an space) on
player.py (line 39), it is working very nice even between two XOs, a minor
glitch in this case is that the path ( o o o ) is not being draw on the
other laptop, i.e I can see the path being draw on my XO but not in the
other player XO. In the local case, its very cool that one of the players
has a circle and the other one a rectangle, having the same colors this is
a optimal way to discriminate.

I'm going to apply it mainline, thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20120420/d954e9c5/attachment.html>


More information about the Sugar-devel mailing list