Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/controller.py
diff options
context:
space:
mode:
Diffstat (limited to 'controller.py')
-rw-r--r--controller.py143
1 files changed, 75 insertions, 68 deletions
diff --git a/controller.py b/controller.py
index dc446aa..ec588fc 100644
--- a/controller.py
+++ b/controller.py
@@ -9,7 +9,6 @@ from dbus.service import method, signal
from dbus.gobject_service import ExportedGObject
from model import Model
-from gamestate import GameState
# XXX: I'm not convinced this is in the right namespace
SERVICE = "org.freedesktop.Telepathy.Tube.Memosono"
@@ -19,8 +18,9 @@ PATH = "/org/freedesktop/Telepathy/Tube/Memosono"
GAME_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit')
+MAX_NUM_PLAYERS = 2
-_logger = logging.getLogger('memosono-activity.game')
+_logger = logging.getLogger('controller')
class Controller(ExportedGObject):
@@ -40,56 +40,51 @@ class Controller(ExportedGObject):
self.owner = owner
self._get_buddy = get_buddy
self.activity = activity
-
- self.model = None
- self.playerid = None
+ self.numplayers = 0
self.turn = 0
- # index 0 is the master
- self.players = []
- self.started = 0
- self.count = 0
+
if self.is_initiator:
- self.gs = GameState()
+ self.init_game()
+
for tile in self.pv.tiles:
tile.connect('button-press-event', self._button_press_cb, self.pv.tiles.index(tile))
+
self.tube.watch_participants(self.participant_change_cb)
+
def participant_change_cb(self, added, removed):
- # Initiator is player 0, other player is player 1.
_logger.debug('adding participants: %r', added)
_logger.debug('removing participants: %r', removed)
for handle, bus_name in added:
buddy = self._get_buddy(handle)
- _logger.debug('Buddy %r was added', buddy)
if buddy is not None:
- if len(self.players) < 2:
+ _logger.debug('buddy %r was added', buddy)
+ if self.numplayers < MAX_NUM_PLAYERS:
self.buddies_panel.add_player(buddy)
- self.players.append(self.tube.participants[handle])
- if self.is_initiator:
- self.gs.points[self.tube.participants[handle]] = 0
- _logger.debug('MA: points of players: %s', self.gs.points)
- _logger.debug('MA: list of players: %s', self.players)
+ self.numplayers+=1
+ if self.is_initiator:
+ self.model.players[self.tube.participants[handle]] = [buddy.props.nick, 0]
+ _logger.debug('list of players: %s', self.model.players)
else:
- self.buddies_panel.add_watcher(buddy)
-
+ self.info_panel.show('we are already two players')
+
for handle in removed:
buddy = self._get_buddy(handle)
- _logger.debug('Buddy %r was removed', buddy)
if buddy is not None:
- self.buddies_panel.remove_watcher(buddy)
- try:
- self.players.remove(self.tube.participants[handle])
- except ValueError:
- # already absent
- pass
-
- if not self.entered:
- if self.is_initiator:
- _logger.debug('I am the initiator, so making myself the leader of the game.')
- self.init_game()
+ _logger.debug('buddy %r was removed', buddy)
+ self.buddies_panel.remove_player(buddy)
+ self.numplayers-=1
+ if self.is_initiator:
+ try:
+ del self.model.players[self.tube.participants[handle]]
+ except ValueError:
+ # already absent
+ pass
+
+ if not self.entered:
self.playerid = self.tube.get_unique_name()
self.tube.add_signal_receiver(self.info_cb, 'Info', IFACE,
path=PATH, sender_keyword='sender')
@@ -99,22 +94,24 @@ class Controller(ExportedGObject):
path=PATH, sender_keyword='sender')
self.tube.add_signal_receiver(self.points_cb, 'Points', IFACE,
path=PATH, sender_keyword='sender')
- self.entered = True
+ self.entered = True
+
if self.is_initiator:
- if len(self.players) == 2 and self.started == 0:
- _logger.debug('Start the game.')
- self.Info('Start the game')
- self.started = 1
- self.Turn(self.players[self.gs.player_active])
+ if len(self.model.players) == 2 and self.model.started == 0:
+ _logger.debug('start the game')
+ self.Info('start the game')
+ self.model.started = 1
+ self.change_turn()
- def init_game(self):
+ def init_game(self):
+ _logger.debug('I am the initiator, so making myself the leader of the game.')
self.model = Model(GAME_PATH, os.path.dirname(__file__))
self.model.read('drumgit.mson')
self.model.def_grid()
-
self.tube.add_signal_receiver(self.selected_cb, 'Selected', IFACE,
path=PATH, sender_keyword='sender')
+
@signal(dbus_interface=IFACE, signature='n')
def Selected(self, tilenum):
@@ -123,24 +120,34 @@ class Controller(ExportedGObject):
def selected_cb(self, tilenum, sender=None):
_logger.debug('MA: %s flipped tile %d', sender, tilenum)
obj, color = self.model.gettile(tilenum)
- self.Flip(tilenum, obj, color)
+ if self.model.grid[tilenum][2] == 1:
+ self.Info('selected already')
+ else:
+ self.Flip(tilenum, obj, color)
- self.count+=1
- if self.count == 1:
- self.gs.selected = tilenum
- if self.count == 2:
- self.count = 0
- # evaluate
- if( self.model.same(tilenum, self.gs.selected) == 1):
- _logger.debug('MA: Tile(%d) and (%d) are the same', tilenum, self.gs.selected)
- self.gs.points[sender]+=1
- self.Points(sender, self.gs.points[sender])
- self.info_panel.show('Open another one')
- else:
- gobject.timeout_add(2000, self._turn_back, tilenum, self.gs.selected)
- _logger.debug('Tile(%d) and (%d) are NOT the same', tilenum, self.gs.selected)
- # next player
- self.change_turn()
+ self.model.count+=1
+ if self.model.count == 1:
+ self.model.selected = tilenum
+ self.model.grid[tilenum][2] = 1
+ return
+ if self.model.count == 2:
+ self.model.count = 0
+ # evaluate
+ if( self.model.same(tilenum, self.model.selected) == 1):
+ _logger.debug('MA: Tile(%d) and (%d) are the same', tilenum, self.model.selected)
+ self.model.grid[tilenum][2] = 1
+ self.model.grid[self.model.selected][2] = 1
+
+ self.model.players[sender][1]+=1
+ self.Points(sender, self.model.players[sender][1])
+ self.Info('found pair, one more try')
+ else:
+ self.model.grid[tilenum][2] = 0
+ self.model.grid[self.model.selected][2] = 0
+ self.change_turn()
+ self.Info('pair does not match, next player')
+ gobject.timeout_add(2000, self._turn_back, tilenum, self.model.selected)
+ _logger.debug('Tile(%d) and (%d) are NOT the same', tilenum, self.model.selected)
def _turn_back(self, tilenuma, tilenumb):
self.Flip(tilenuma, 'images/black.png', 100)
@@ -148,12 +155,13 @@ class Controller(ExportedGObject):
return False
def change_turn(self):
- if self.gs.player_active == 0:
- self.gs.player_active = 1
+ if self.model.player_active < (len(self.model.players)-1):
+ self.model.player_active+=1
else:
- self.gs.player_active = 0
-
- self.Turn(self.players[self.gs.player_active])
+ self.model.player_active = 0
+
+ key = self.model.players.keys()[self.model.player_active]
+ self.Turn(key, self.model.players[key][0])
@signal(dbus_interface=IFACE, signature='nsn')
@@ -166,17 +174,16 @@ class Controller(ExportedGObject):
self.pv.flip(tilenum, os.path.join(os.path.dirname(__file__), obj), color)
- @signal(dbus_interface=IFACE, signature='s')
- def Turn(self, playerid):
+ @signal(dbus_interface=IFACE, signature='ss')
+ def Turn(self, playerid, name):
"""Signal that it is the players turn"""
- def turn_cb(self, playerid, sender=None):
+ def turn_cb(self, playerid, name, sender=None):
if self.playerid == playerid:
self.turn = 1
- self.info_panel.show('It is my turn')
else:
- self.turn = 0
-
+ self.turn = 0
+ self.info_panel.show('hey %s it is your turn'%name)
@signal(dbus_interface=IFACE, signature='sn')
def Points(self, player, points):