|
From: <umg...@us...> - 2007-10-04 16:37:17
|
Revision: 505
http://pybridge.svn.sourceforge.net/pybridge/?rev=505&view=rev
Author: umgangee
Date: 2007-10-04 09:37:16 -0700 (Thu, 04 Oct 2007)
Log Message:
-----------
Make Contract and Result objects copyable, send results over-the-wire for display on clients.
Modified Paths:
--------------
trunk/pybridge/pybridge/games/bridge/auction.py
trunk/pybridge/pybridge/games/bridge/game.py
trunk/pybridge/pybridge/games/bridge/result.py
trunk/pybridge/pybridge/games/bridge/ui/window_scoresheet.py
Modified: trunk/pybridge/pybridge/games/bridge/auction.py
===================================================================
--- trunk/pybridge/pybridge/games/bridge/auction.py 2007-09-26 13:02:19 UTC (rev 504)
+++ trunk/pybridge/pybridge/games/bridge/auction.py 2007-10-04 16:37:16 UTC (rev 505)
@@ -16,11 +16,13 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+from twisted.spread import pb
+
from call import Bid, Pass, Double, Redouble
from symbols import Direction
-class Contract(object):
+class Contract(object, pb.Copyable, pb.RemoteCopy):
"""Represents the result of an auction."""
@@ -54,8 +56,19 @@
self.redoubleBy = auction.whoCalled(auction.currentRedouble)
+ def getStateToCopy(self):
+ return self.bid, self.declarer, self.doubleBy, self.redoubleBy
+ def setCopyableState(self, state):
+ self.bid, self.declarer, self.doubleBy, self.redoubleBy = state
+
+
+pb.setUnjellyableForClass(Contract, Contract)
+
+
+
+
class Auction(list):
"""The auction (bidding phase) of a game of bridge."""
Modified: trunk/pybridge/pybridge/games/bridge/game.py
===================================================================
--- trunk/pybridge/pybridge/games/bridge/game.py 2007-09-26 13:02:19 UTC (rev 504)
+++ trunk/pybridge/pybridge/games/bridge/game.py 2007-10-04 16:37:16 UTC (rev 505)
@@ -87,6 +87,8 @@
if board: # Use specified board.
self.board = board
+ elif self.boardQueue: # Use pre-specified board.
+ self.board = self.boardQueue.pop(0)
elif self.board: # Advance to next round.
self.board = self.board.next()
else: # Create an initial board.
@@ -136,6 +138,9 @@
def getState(self):
state = {}
+ state['options'] = self.options
+ state['results'] = self.results
+
if self.inProgress():
# Remove hidden hands from deal.
visibleBoard = self.board.copy()
@@ -151,6 +156,8 @@
def setState(self, state):
+ self.options = state.get('options', {})
+
if state.get('board'):
self.start(state['board'])
@@ -172,7 +179,9 @@
else:
self.playCard(card, position=turn)
+ self.results = state.get('results', []) # Overwrites current game result.
+
def updateState(self, event, *args, **kwargs):
allowed = ['start', 'makeCall', 'playCard', 'revealHand']
if event in allowed:
Modified: trunk/pybridge/pybridge/games/bridge/result.py
===================================================================
--- trunk/pybridge/pybridge/games/bridge/result.py 2007-09-26 13:02:19 UTC (rev 504)
+++ trunk/pybridge/pybridge/games/bridge/result.py 2007-10-04 16:37:16 UTC (rev 505)
@@ -16,6 +16,8 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+from twisted.spread import pb
+
from symbols import Direction, Strain, Vulnerable
@@ -40,6 +42,7 @@
self.contract = contract
self.tricksMade = tricksMade
+ self.isVulnerable = None
if self.contract:
vuln = self.board.get('vuln', Vulnerable.None)
self.isVulnerable = self.contract.declarer in self.__vulnMap[vuln]
@@ -47,6 +50,16 @@
self.score = self._getScore()
+ def getStateToCopy(self):
+ return (self.board.copy(), self.contract, self.tricksMade,
+ self.isVulnerable, self.score)
+
+
+ def setCopyableState(self, state):
+ self.board, self.contract, self.tricksMade, self.isVulnerable, self.score = state
+ # assert self.score == self._getScore()
+
+
def _getScoreComponents(self):
"""Compute the component values which contribute to the score.
Note that particular scoring schemes may ignore some of the components.
@@ -178,7 +191,7 @@
-class DuplicateResult(GameResult):
+class DuplicateResult(GameResult, pb.Copyable, pb.RemoteCopy):
"""Represents the result of a completed round of duplicate bridge."""
@@ -196,9 +209,12 @@
return score
+pb.setUnjellyableForClass(DuplicateResult, DuplicateResult)
-class RubberResult(GameResult):
+
+
+class RubberResult(GameResult, pb.Copyable, pb.RemoteCopy):
"""Represents the result of a completed round of rubber bridge."""
@@ -219,8 +235,11 @@
return above, below
+pb.setUnjellyableForClass(RubberResult, RubberResult)
+
+
class Rubber(list):
"""A rubber set, in which pairs compete to make two consecutive games.
Modified: trunk/pybridge/pybridge/games/bridge/ui/window_scoresheet.py
===================================================================
--- trunk/pybridge/pybridge/games/bridge/ui/window_scoresheet.py 2007-09-26 13:02:19 UTC (rev 504)
+++ trunk/pybridge/pybridge/games/bridge/ui/window_scoresheet.py 2007-10-04 16:37:16 UTC (rev 505)
@@ -52,7 +52,7 @@
score = result.score
if result.contract is None: # Bidding passed out.
- row = (result.board['num'], _('Passed out'), '-', '-', '', '')
+ row = (result.board['num'], _('Passed out'), '-', '', '')
else:
if result.contract.declarer in (Direction.North, Direction.South) and score > 0 \
@@ -122,19 +122,53 @@
if parent:
self.window.set_transient_for(parent.window)
self.window.set_title(_('Score Sheet'))
- self.window.connect('delete_event', self.on_delete_event)
- #self.window.set_resizable(False)
+ #self.window.connect('delete_event', self.on_delete_event)
self.eventHandler = SimpleEventHandler(self)
self.table = None
+ self.window.show()
+
def tearDown(self):
- pass
+ self.table.game.detach(self.eventHandler)
+ self.table = None # Dereference table.
+ def setTable(self, table):
+ self.table = table
+ self.table.game.attach(self.eventHandler)
- def on_delete_event(self, widget, *args):
- # TODO: call wm.close(self)
- return True # Stops window deletion taking place.
+ if hasattr(self.table.game, 'rubbers'):
+ self.scoresheet = RubberScoreSheet()
+ if self.table.game.rubbers:
+ rubber = self.table.game.rubbers[-1]
+ self.scoresheet.set_rubber(rubber)
+ else: # Duplicate-style list of results.
+ self.scoresheet = ScoreSheet()
+ for result in self.table.game.results:
+ self.scoresheet.add_result(result)
+
+ self.window.add(self.scoresheet)
+ self.scoresheet.show()
+
+
+ def update(self):
+ if self.table.game.results and not self.table.game.inProgress():
+ if isinstance(self.scoresheet, RubberScoreSheet):
+ rubber = self.table.game.rubbers[-1]
+ self.scoresheet.set_rubber(rubber)
+ else:
+ result = self.table.game.results[-1]
+ self.scoresheet.add_result(result)
+
+
+
+ def event_makeCall(self, call, position):
+ self.update()
+
+
+ def event_playCard(self, card, position):
+ self.update()
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|