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. |