[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