Mercurial > libervia-backend
annotate src/plugins/plugin_misc_tarot.py @ 578:28331ecf0a65
misc: README cleaning + added Mutagen to credits
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 09 Jan 2013 22:31:32 +0100 |
parents | ca13633d3b6b |
children | 952322b1d490 |
rev | line source |
---|---|
88 | 1 #!/usr/bin/python |
2 # -*- coding: utf-8 -*- | |
3 | |
4 """ | |
361 | 5 SAT plugin for managing French Tarot game |
572 | 6 Copyright (C) 2009, 2010, 2011, 2012, 2013 Jérôme Poisson (goffi@goffi.org) |
88 | 7 |
8 This program is free software: you can redistribute it and/or modify | |
480
2a072735e459
Licence modification: the full project is now under AGPL v3+ instead of GPL v3+
Goffi <goffi@goffi.org>
parents:
459
diff
changeset
|
9 it under the terms of the GNU Affero General Public License as published by |
88 | 10 the Free Software Foundation, either version 3 of the License, or |
11 (at your option) any later version. | |
12 | |
13 This program is distributed in the hope that it will be useful, | |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
480
2a072735e459
Licence modification: the full project is now under AGPL v3+ instead of GPL v3+
Goffi <goffi@goffi.org>
parents:
459
diff
changeset
|
16 GNU Affero General Public License for more details. |
88 | 17 |
480
2a072735e459
Licence modification: the full project is now under AGPL v3+ instead of GPL v3+
Goffi <goffi@goffi.org>
parents:
459
diff
changeset
|
18 You should have received a copy of the GNU Affero General Public License |
88 | 19 along with this program. If not, see <http://www.gnu.org/licenses/>. |
20 """ | |
21 | |
22 from logging import debug, info, warning, error | |
23 from twisted.words.xish import domish | |
563 | 24 from twisted.words.protocols.jabber import jid |
88 | 25 import random |
26 | |
27 from zope.interface import implements | |
28 | |
91 | 29 from wokkel import disco, iwokkel, data_form |
223 | 30 from sat.tools.xml_tools import dataForm2xml |
31 from sat.tools.games import TarotCard | |
88 | 32 |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
33 from time import time |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
34 |
88 | 35 try: |
36 from twisted.words.protocols.xmlstream import XMPPHandler | |
37 except ImportError: | |
38 from wokkel.subprotocols import XMPPHandler | |
39 | |
90 | 40 MESSAGE = '/message' |
41 NS_CG = 'http://www.goffi.org/protocol/card_game' | |
42 CG_TAG = 'card_game' | |
43 CG_REQUEST = MESSAGE + '/' + CG_TAG + '[@xmlns="' + NS_CG + '"]' | |
88 | 44 |
45 PLUGIN_INFO = { | |
46 "name": "Tarot cards plugin", | |
47 "import_name": "Tarot", | |
48 "type": "Misc", | |
49 "protocols": [], | |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
50 "dependencies": ["XEP-0045", "XEP-0249"], |
88 | 51 "main": "Tarot", |
90 | 52 "handler": "yes", |
88 | 53 "description": _("""Implementation of Tarot card game""") |
54 } | |
55 | |
94 | 56 |
88 | 57 class Tarot(): |
58 | |
59 def __init__(self, host): | |
60 info(_("Plugin Tarot initialization")) | |
61 self.host = host | |
62 self.games={} | |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
63 self.waiting_inv = {} #Invitation waiting for people to join to launch a game |
91 | 64 self.contrats = [_('Passe'), _('Petite'), _('Garde'), _('Garde Sans'), _('Garde Contre')] |
372
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
65 host.bridge.addMethod("tarotGameLaunch", ".plugin", in_sign='ass', out_sign='', method=self.launchGame) #args: room_jid, players, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
66 host.bridge.addMethod("tarotGameCreate", ".plugin", in_sign='sass', out_sign='', method=self.createGame) #args: room_jid, players, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
67 host.bridge.addMethod("tarotGameReady", ".plugin", in_sign='sss', out_sign='', method=self.newPlayerReady) #args: player, referee, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
68 host.bridge.addMethod("tarotGameContratChoosed", ".plugin", in_sign='ssss', out_sign='', method=self.contratChoosed) #args: player, referee, contrat, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
69 host.bridge.addMethod("tarotGamePlayCards", ".plugin", in_sign='ssa(ss)s', out_sign='', method=self.play_cards) #args: player, referee, cards, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
70 host.bridge.addSignal("tarotGameStarted", ".plugin", signature='ssass') #args: room_jid, referee, players, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
71 host.bridge.addSignal("tarotGameNew", ".plugin", signature='sa(ss)s') #args: room_jid, hand, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
72 host.bridge.addSignal("tarotGameChooseContrat", ".plugin", signature='sss') #args: room_jid, xml_data, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
73 host.bridge.addSignal("tarotGameShowCards", ".plugin", signature='ssa(ss)a{ss}s') #args: room_jid, type ["chien", "poignée",...], cards, data[dict], profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
74 host.bridge.addSignal("tarotGameCardsPlayed", ".plugin", signature='ssa(ss)s') #args: room_jid, player, type ["chien", "poignée",...], cards, data[dict], profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
75 host.bridge.addSignal("tarotGameYourTurn", ".plugin", signature='ss') #args: room_jid, profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
76 host.bridge.addSignal("tarotGameScore", ".plugin", signature='ssasass') #args: room_jid, xml_data, winners (list of nicks), loosers (list of nicks), profile |
f964dcec1611
core: plugins refactored according to bridge + updatedValue now use profile
Goffi <goffi@goffi.org>
parents:
362
diff
changeset
|
77 host.bridge.addSignal("tarotGameInvalidCards", ".plugin", signature='ssa(ss)a(ss)s') #args: room_jid, game phase, played_cards, invalid_cards, profile |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
78 host.trigger.add("MUC user joined", self.userJoinedTrigger) |
88 | 79 self.deck_ordered = [] |
92 | 80 for value in ['excuse']+map(str,range(1,22)): |
141
8c80d4dec7a8
mover Card class to tools/games and renamed it in TarotCard
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
81 self.deck_ordered.append(TarotCard(("atout",value))) |
92 | 82 for suit in ["pique", "coeur", "carreau", "trefle"]: |
88 | 83 for value in map(str,range(1,11))+["valet","cavalier","dame","roi"]: |
141
8c80d4dec7a8
mover Card class to tools/games and renamed it in TarotCard
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
84 self.deck_ordered.append(TarotCard((suit, value))) |
88 | 85 |
92 | 86 def createGameElt(self, to_jid, type="normal"): |
87 type = "normal" if to_jid.resource else "groupchat" | |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
88 elt = domish.Element((None,'message')) |
90 | 89 elt["to"] = to_jid.full() |
92 | 90 elt["type"] = type |
90 | 91 elt.addElement((NS_CG, CG_TAG)) |
92 return elt | |
93 | |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
94 def __card_list_to_xml(self, cards_list, elt_name): |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
95 """Convert a card list to domish element""" |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
96 cards_list_elt = domish.Element((None,elt_name)) |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
97 for card in cards_list: |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
98 card_elt = domish.Element((None,'card')) |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
99 card_elt['suit'] = card.suit |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
100 card_elt['value'] = card.value |
92 | 101 cards_list_elt.addChild(card_elt) |
102 return cards_list_elt | |
90 | 103 |
92 | 104 def __xml_to_list(self, cards_list_elt): |
105 """Convert a domish element with cards to a list of tuples""" | |
106 cards_list = [] | |
107 for card in cards_list_elt.elements(): | |
108 cards_list.append((card['suit'], card['value'])) | |
109 return cards_list | |
563 | 110 |
90 | 111 |
112 def __create_started_elt(self, players): | |
113 """Create a game_started domish element""" | |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
114 started_elt = domish.Element((None,'started')) |
90 | 115 idx = 0 |
116 for player in players: | |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
117 player_elt = domish.Element((None,'player')) |
90 | 118 player_elt.addContent(player) |
119 player_elt['index'] = str(idx) | |
120 idx+=1 | |
121 started_elt.addChild(player_elt) | |
122 return started_elt | |
123 | |
91 | 124 def __ask_contrat(self): |
125 """Create a element for asking contrat""" | |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
126 contrat_elt = domish.Element((None,'contrat')) |
91 | 127 form = data_form.Form('form', title=_('contrat selection')) |
128 field = data_form.Field('list-single', 'contrat', options=map(data_form.Option, self.contrats), required=True) | |
129 form.addField(field) | |
130 contrat_elt.addChild(form.toElement()) | |
131 return contrat_elt | |
132 | |
95 | 133 def __give_scores(self, scores, winners, loosers): |
134 """Create an element to give scores | |
135 @param scores: unicode (can contain line feed) | |
136 @param winners: list of unicode nicks of winners | |
137 @param loosers: list of unicode nicks of loosers""" | |
138 | |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
139 score_elt = domish.Element((None,'score')) |
95 | 140 form = data_form.Form('form', title=_('scores')) |
141 for line in scores.split('\n'): | |
142 field = data_form.Field('fixed', value = line) | |
143 form.addField(field) | |
144 score_elt.addChild(form.toElement()) | |
145 for winner in winners: | |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
146 winner_elt = domish.Element((None,'winner')) |
95 | 147 winner_elt.addContent(winner) |
148 score_elt.addChild(winner_elt) | |
149 for looser in loosers: | |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
150 looser_elt = domish.Element((None,'looser')) |
95 | 151 looser_elt.addContent(looser) |
152 score_elt.addChild(looser_elt) | |
153 return score_elt | |
154 | |
99
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
155 def __invalid_cards_elt(self, played_cards, invalid_cards, game_phase): |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
156 """Create a element for invalid_cards error |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
157 @param list_cards: list of Card |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
158 @param game_phase: phase of the game ['ecart', 'play']""" |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
159 error_elt = domish.Element((None,'error')) |
99
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
160 played_elt = self.__card_list_to_xml(played_cards, 'played') |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
161 invalid_elt = self.__card_list_to_xml(invalid_cards, 'invalid') |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
162 error_elt['type'] = 'invalid_cards' |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
163 error_elt['phase'] = game_phase |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
164 error_elt.addChild(played_elt) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
165 error_elt.addChild(invalid_elt) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
166 return error_elt |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
167 |
94 | 168 def __next_player(self, game_data, next_pl = None): |
169 """Increment player number & return player name | |
170 @param next_pl: if given, then next_player is forced to this one | |
171 """ | |
172 if next_pl: | |
173 game_data['current_player'] = game_data['players'].index(next_pl) | |
174 return next_pl | |
175 else: | |
176 pl_idx = game_data['current_player'] = (game_data['current_player'] + 1) % len(game_data['players']) | |
177 return game_data['players'][pl_idx] | |
178 | |
179 def __winner(self, game_data): | |
180 """give the nick of the player who win this trick""" | |
181 players_data = game_data['players_data'] | |
182 first = game_data['first_player'] | |
183 first_idx = game_data['players'].index(first) | |
184 suit_asked = None | |
185 strongest = None | |
186 winner = None | |
187 for idx in [(first_idx + i) % 4 for i in range(4)]: | |
188 player = game_data['players'][idx] | |
189 card = players_data[player]['played'] | |
190 if card.value == "excuse": | |
191 continue | |
192 if suit_asked == None: | |
193 suit_asked = card.suit | |
194 if (card.suit == suit_asked or card.suit == "atout") and card > strongest: | |
195 strongest = card | |
196 winner = player | |
95 | 197 assert winner |
94 | 198 return winner |
199 | |
200 def __excuse_hack(self, game_data, played, winner): | |
95 | 201 """give a low card to other team and keep excuse if trick is lost |
202 @param game_data: data of the game | |
203 @param played: cards currently on the table | |
204 @param winner: nick of the trick winner""" | |
94 | 205 #TODO: manage the case where excuse is played on the last trick (and lost) |
206 players_data = game_data['players_data'] | |
141
8c80d4dec7a8
mover Card class to tools/games and renamed it in TarotCard
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
207 excuse = TarotCard(("atout","excuse")) |
95 | 208 |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
209 #we first check if the Excuse was already played |
95 | 210 #and if somebody is waiting for a card |
94 | 211 for player in game_data['players']: |
212 if players_data[player]['wait_for_low']: | |
213 #the excuse owner has to give a card to somebody | |
214 if winner == player: | |
215 #the excuse owner win the trick, we check if we have something to give | |
216 for card in played: | |
217 if card.points == 0.5: | |
218 pl_waiting = players_data[player]['wait_for_low'] | |
219 played.remove(card) | |
220 players_data[pl_waiting]['levees'].append(card) | |
221 debug (_('Player %(excuse_owner)s give %(card_waited)s to %(player_waiting)s for Excuse compensation') % {"excuse_owner":player, "card_waited": card, "player_waiting":pl_waiting}) | |
95 | 222 return |
94 | 223 return |
224 | |
225 if not excuse in played: | |
95 | 226 #the Excuse is not on the table, nothing to do |
94 | 227 return |
228 | |
95 | 229 excuse_player = None #Who has played the Excuse ? |
94 | 230 for player in game_data['players']: |
231 if players_data[player]['played'] == excuse: | |
232 excuse_player = player | |
233 break | |
234 | |
235 if excuse_player == winner: | |
236 return #the excuse player win the trick, nothing to do | |
237 | |
238 #first we remove the excuse from played cards | |
239 played.remove(excuse) | |
240 #then we give it back to the original owner | |
241 owner_levees = players_data[excuse_player]['levees'] | |
242 owner_levees.append(excuse) | |
243 #finally we give a low card to the trick winner | |
244 low_card = None | |
95 | 245 #We look backward in cards won by the Excuse owner to |
246 #find a low value card | |
94 | 247 for card_idx in range(len(owner_levees)-1, -1, -1): |
248 if owner_levees[card_idx].points == 0.5: | |
249 low_card = owner_levees[card_idx] | |
250 del owner_levees[card_idx] | |
251 players_data[winner]['levees'].append(low_card) | |
252 debug (_('Player %(excuse_owner)s give %(card_waited)s to %(player_waiting)s for Excuse compensation') % {"excuse_owner":excuse_player, "card_waited": low_card, "player_waiting":winner}) | |
253 break | |
254 if not low_card: #The player has no low card yet | |
255 #TODO: manage case when player never win a trick with low card | |
256 players_data[excuse_player]['wait_for_low'] = winner | |
257 debug(_("%(excuse_owner)s keep the Excuse but has not card to give, %(winner)s is waiting for one") % {'excuse_owner':excuse_player, 'winner':winner}) | |
258 | |
259 | |
328 | 260 def __draw_game(self, game_data): |
261 """The game is draw, no score change | |
262 @param game_data: data of the game | |
263 @return: tuple with (string victory message, list of winners, list of loosers)""" | |
264 players_data = game_data['players_data'] | |
265 scores_str = _('Draw game') | |
266 scores_str+='\n' | |
267 for player in game_data['players']: | |
268 scores_str+=_("\n--\n%(player)s:\nscore for this game ==> %(score_game)i\ntotal score ==> %(total_score)i") % {'player':player, 'score_game':0, 'total_score': players_data[player]['score']} | |
269 debug(scores_str) | |
270 | |
271 return (scores_str, [], []) | |
272 | |
273 | |
94 | 274 def __calculate_scores(self, game_data): |
95 | 275 """The game is finished, time to know who won :) |
276 @param game_data: data of the game | |
277 @return: tuple with (string victory message, list of winners, list of loosers)""" | |
94 | 278 players_data = game_data['players_data'] |
279 levees = players_data[game_data['attaquant']]['levees'] | |
280 score = 0 | |
281 nb_bouts = 0 | |
95 | 282 bouts = [] |
94 | 283 for card in levees: |
284 if card.bout: | |
285 nb_bouts +=1 | |
95 | 286 bouts.append(card.value) |
94 | 287 score += card.points |
95 | 288 |
161
c37826d80f2a
plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents:
147
diff
changeset
|
289 #We we do a basic check on score calculation |
95 | 290 check_score = 0 |
291 defenseurs = game_data['players'][:] | |
292 defenseurs.remove(game_data['attaquant']) | |
293 for defenseur in defenseurs: | |
294 for card in players_data[defenseur]['levees']: | |
295 check_score+=card.points | |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
296 if game_data['contrat'] == "Garde Contre": |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
297 for card in game_data['chien']: |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
298 check_score+=card.points |
95 | 299 assert (score + check_score == 91) |
300 | |
94 | 301 point_limit = None |
302 if nb_bouts == 3: | |
303 point_limit = 36 | |
304 elif nb_bouts == 2: | |
305 point_limit = 41 | |
306 elif nb_bouts == 1: | |
307 point_limit = 51 | |
308 else: | |
309 point_limit = 56 | |
95 | 310 if game_data['contrat'] == 'Petite': |
311 contrat_mult = 1 | |
312 elif game_data['contrat'] == 'Garde': | |
313 contrat_mult = 2 | |
314 elif game_data['contrat'] == 'Garde Sans': | |
315 contrat_mult = 4 | |
316 elif game_data['contrat'] == 'Garde Contre': | |
317 contrat_mult = 6 | |
318 else: | |
161
c37826d80f2a
plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents:
147
diff
changeset
|
319 error(_('INTERNAL ERROR: contrat not managed (mispelled ?)')) |
c37826d80f2a
plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents:
147
diff
changeset
|
320 assert(False) |
95 | 321 |
94 | 322 victory = (score >= point_limit) |
161
c37826d80f2a
plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents:
147
diff
changeset
|
323 margin = abs(score - point_limit) |
c37826d80f2a
plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents:
147
diff
changeset
|
324 points_defenseur = (margin + 25) * contrat_mult * (-1 if victory else 1) |
95 | 325 winners = [] |
326 loosers = [] | |
327 player_score = {} | |
328 for player in game_data['players']: | |
329 #TODO: adjust this for 3 and 5 players variants | |
330 #TODO: manage bonuses (petit au bout, poignée, chelem) | |
331 player_score[player] = points_defenseur if player != game_data['attaquant'] else points_defenseur * -3 | |
332 players_data[player]['score'] += player_score[player] #we add score of this game to the global score | |
333 if player_score[player] > 0: | |
334 winners.append(player) | |
335 else: | |
336 loosers.append(player) | |
94 | 337 |
147
dc692acde155
plugin Tarot: separator doen't appear anymore when attacked has no bout in scores
Goffi <goffi@goffi.org>
parents:
141
diff
changeset
|
338 scores_str = _('The attacker (%(attaquant)s) makes %(points)i and needs to make %(point_limit)i (%(nb_bouts)s oulder%(plural)s%(separator)s%(bouts)s): he %(victory)s') % {'attaquant':game_data['attaquant'], 'points':score, 'point_limit':point_limit, 'nb_bouts': nb_bouts, 'plural': 's' if nb_bouts>1 else '', 'separator':': ' if nb_bouts != 0 else '', 'bouts':','.join(map(str,bouts)), 'victory': 'win' if victory else 'loose'} |
95 | 339 scores_str+='\n' |
340 for player in game_data['players']: | |
341 scores_str+=_("\n--\n%(player)s:\nscore for this game ==> %(score_game)i\ntotal score ==> %(total_score)i") % {'player':player, 'score_game':player_score[player], 'total_score': players_data[player]['score']} | |
342 debug(scores_str) | |
343 | |
344 return (scores_str, winners, loosers) | |
94 | 345 |
99
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
346 def __invalid_cards(self, game_data, cards): |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
347 """Checks that the player has the right to play what he wants to |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
348 @param game_data: Game data |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
349 @param cards: cards the player want to play |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
350 @return forbidden_cards cards or empty list if cards are ok""" |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
351 forbidden_cards = [] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
352 if game_data['stage'] == 'ecart': |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
353 for card in cards: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
354 if card.bout or card.value=="roi": |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
355 forbidden_cards.append(card) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
356 #TODO: manage case where atouts (trumps) are in the dog |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
357 elif game_data['stage'] == 'play': |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
358 biggest_atout = None |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
359 suit_asked = None |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
360 players = game_data['players'] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
361 players_data = game_data['players_data'] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
362 idx = players.index(game_data['first_player']) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
363 current_idx = game_data['current_player'] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
364 current_player = players[current_idx] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
365 if idx == current_idx: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
366 #the player is the first to play, he can play what he wants |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
367 return forbidden_cards |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
368 while (idx != current_idx): |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
369 player = players[idx] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
370 played_card = players_data[player]['played'] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
371 if not suit_asked and played_card.value != "excuse": |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
372 suit_asked = played_card.suit |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
373 if played_card.suit == "atout" and played_card > biggest_atout: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
374 biggest_atout = played_card |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
375 idx = (idx + 1) % len(players) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
376 has_suit = False #True if there is one card of the asked suit in the hand of the player |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
377 has_atout = False |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
378 biggest_hand_atout = None |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
379 |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
380 for hand_card in game_data['hand'][current_player]: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
381 if hand_card.suit == suit_asked: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
382 has_suit = True |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
383 if hand_card.suit == "atout": |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
384 has_atout = True |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
385 if hand_card.suit == "atout" and hand_card > biggest_hand_atout: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
386 biggest_hand_atout = hand_card |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
387 |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
388 assert len(cards) == 1 |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
389 card = cards[0] |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
390 if card.suit != suit_asked and has_suit and card.value != "excuse": |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
391 forbidden_cards.append(card) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
392 return forbidden_cards |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
393 if card.suit != suit_asked and card.suit != "atout" and has_atout: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
394 forbidden_cards.append(card) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
395 return forbidden_cards |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
396 if card.suit == "atout" and card < biggest_atout and biggest_hand_atout > biggest_atout and card.value != "excuse": |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
397 forbidden_cards.append(card) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
398 else: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
399 error(_('Internal error: unmanaged game stage')) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
400 return forbidden_cards |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
401 |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
402 |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
403 def __start_play(self, room_jid, game_data, profile): |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
404 """Start the game (tell to the first player after dealer to play""" |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
405 game_data['stage'] = "play" |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
406 next_player_idx = game_data['current_player'] = (game_data['init_player'] + 1) % len(game_data['players']) #the player after the dealer start |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
407 game_data['first_player'] = next_player = game_data['players'][next_player_idx] |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
408 to_jid = jid.JID(room_jid.userhost()+"/"+next_player) #FIXME: gof: |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
409 mess = self.createGameElt(to_jid) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
410 yourturn_elt = mess.firstChildElement().addElement('your_turn') |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
411 self.host.profiles[profile].xmlstream.send(mess) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
412 |
91 | 413 |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
414 def userJoinedTrigger(self, room, user, profile): |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
415 """This trigger is used to check if we are waiting people in this room, |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
416 and to create a game if everybody is here""" |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
417 _room_jid = room.occupantJID.userhostJID() |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
418 if _room_jid in self.waiting_inv and len(room.roster) == 4: |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
419 #When we have 4 people in the room, we create the game |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
420 #TODO: check people identity |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
421 players = room.roster.keys() |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
422 del self.waiting_inv[_room_jid] |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
423 self.createGame(_room_jid.userhost(), players, profile_key=profile) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
424 return True |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
425 |
563 | 426 def launchGame(self, players, profile_key='@NONE@'): |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
427 """Launch a game: helper method to create a room, invite players, and create the tarot game |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
428 @param players: list for players jid""" |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
429 debug(_('Launching tarot game')) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
430 profile = self.host.memory.getProfileName(profile_key) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
431 if not profile: |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
432 error(_("Unknown profile")) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
433 return |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
434 |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
435 def tarotRoomJoined(room): |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
436 _room = room.occupantJID.userhostJID() |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
437 for player in players: |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
438 self.host.plugins["XEP-0249"].invite(jid.JID(player), room.occupantJID.userhostJID(), {"game":"Tarot"}, profile) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
439 self.waiting_inv[_room] = (time(), players) #TODO: remove invitation waiting for too long, using the time data |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
440 |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
441 def after_init(ignore): |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
442 room_name = "sat_tarot_%s" % self.host.plugins["XEP-0045"].getUniqueName(profile_key) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
443 print "\n\n===> room_name:", room_name |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
444 #muc_service = self.host.memory.getServerServiceEntity("conference", "text", profile) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
445 muc_service = None |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
446 for service in self.host.memory.getServerServiceEntities("conference", "text", profile): |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
447 if not ".irc." in service.userhost(): |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
448 #FIXME: |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
449 #This awfull ugly hack is here to avoid an issue with openfire: the irc gateway |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
450 #use "conference/text" identity (instead of "conference/irc"), there is certainly a better way |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
451 #to manage this, but this hack fill do it for test purpose |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
452 muc_service = service |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
453 break |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
454 if not muc_service: |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
455 error(_("Can't find a MUC service")) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
456 return |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
457 |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
458 _jid, xmlstream = self.host.getJidNStream(profile) |
563 | 459 d = self.host.plugins["XEP-0045"].join(jid.JID("%s@%s" % (room_name, muc_service.userhost())), _jid.user, {}, profile).addCallback(tarotRoomJoined) |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
460 |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
461 client = self.host.getClient(profile) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
462 if not client: |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
463 error(_('No client for this profile key: %s') % profile_key) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
464 return |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
465 client.client_initialized.addCallback(after_init) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
466 |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
467 |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
468 |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
469 |
563 | 470 def createGame(self, room_jid_param, players, profile_key='@NONE@'): |
320
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
471 """Create a new game |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
472 @param room_jid_param: jid of the room |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
473 @param players: list of players nick (nick must exist in the room) |
5fc5e6a7e5c3
plugin Tarot: added a launch method to automatically create a new room, invite players and create the game
Goffi <goffi@goffi.org>
parents:
291
diff
changeset
|
474 @param profile_key: %(doc_profile_key)s""" |
88 | 475 debug (_("Creating Tarot game")) |
90 | 476 room_jid = jid.JID(room_jid_param) |
88 | 477 profile = self.host.memory.getProfileName(profile_key) |
478 if not profile: | |
479 error (_("profile %s is unknown") % profile_key) | |
480 return | |
194 | 481 if self.games.has_key(room_jid): |
90 | 482 warning (_("Tarot game already started in room %s") % room_jid.userhost()) |
88 | 483 else: |
291 | 484 room_nick = self.host.plugins["XEP-0045"].getRoomNick(room_jid.userhost(), profile) |
93 | 485 if not room_nick: |
486 error ('Internal error') | |
487 return | |
488 referee = room_jid.userhost() + '/' + room_nick | |
90 | 489 status = {} |
91 | 490 players_data = {} |
90 | 491 for player in players: |
95 | 492 players_data[player] = {'score':0} |
90 | 493 status[player] = "init" |
95 | 494 self.games[room_jid.userhost()] = {'referee':referee, 'players':players, 'status':status, 'players_data':players_data, 'hand_size':18, 'init_player':0, 'current_player': None, 'contrat': None, 'stage': None} |
90 | 495 for player in players: |
496 mess = self.createGameElt(jid.JID(room_jid.userhost()+'/'+player)) | |
497 mess.firstChildElement().addChild(self.__create_started_elt(players)) | |
498 self.host.profiles[profile].xmlstream.send(mess) | |
499 | |
563 | 500 def newPlayerReady(self, player, referee, profile_key='@NONE@'): |
90 | 501 """Must be called when player is ready to start a new game""" |
502 profile = self.host.memory.getProfileName(profile_key) | |
503 if not profile: | |
504 error (_("profile %s is unknown") % profile_key) | |
505 return | |
506 debug ('new player ready: %s' % profile) | |
507 mess = self.createGameElt(jid.JID(referee)) | |
91 | 508 ready_elt = mess.firstChildElement().addElement('player_ready') |
92 | 509 ready_elt['player'] = player |
91 | 510 self.host.profiles[profile].xmlstream.send(mess) |
511 | |
563 | 512 def contratChoosed(self, player, referee, contrat, profile_key='@NONE@'): |
91 | 513 """Must be call by player when the contrat is selected |
92 | 514 @param player: player's name |
91 | 515 @param referee: arbiter jid |
516 @contrat: contrat choosed (must be the exact same string than in the give list options) | |
517 @profile_key: profile | |
518 """ | |
519 profile = self.host.memory.getProfileName(profile_key) | |
520 if not profile: | |
521 error (_("profile %s is unknown") % profile_key) | |
522 return | |
523 debug (_('contrat [%(contrat)s] choosed by %(profile)s') % {'contrat':contrat, 'profile':profile}) | |
524 mess = self.createGameElt(jid.JID(referee)) | |
525 contrat_elt = mess.firstChildElement().addElement(('','contrat_choosed'), content=contrat) | |
92 | 526 contrat_elt['player'] = player |
90 | 527 self.host.profiles[profile].xmlstream.send(mess) |
88 | 528 |
563 | 529 def play_cards(self, player, referee, cards, profile_key='@NONE@'): |
92 | 530 """Must be call by player when the contrat is selected |
531 @param player: player's name | |
532 @param referee: arbiter jid | |
533 @cards: cards played (list of tuples) | |
534 @profile_key: profile | |
535 """ | |
536 profile = self.host.memory.getProfileName(profile_key) | |
537 if not profile: | |
538 error (_("profile %s is unknown") % profile_key) | |
539 return | |
540 debug (_('Cards played by %(profile)s: [%(cards)s]') % {'profile':profile,'cards':cards}) | |
541 mess = self.createGameElt(jid.JID(referee)) | |
141
8c80d4dec7a8
mover Card class to tools/games and renamed it in TarotCard
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
542 playcard_elt = mess.firstChildElement().addChild(self.__card_list_to_xml(TarotCard.from_tuples(cards), 'cards_played')) |
92 | 543 playcard_elt['player'] = player |
544 self.host.profiles[profile].xmlstream.send(mess) | |
88 | 545 |
92 | 546 def newGame(self, room_jid, profile): |
88 | 547 """Launch a new round""" |
548 debug (_('new Tarot game')) | |
549 deck = self.deck_ordered[:] | |
550 random.shuffle(deck) | |
91 | 551 game_data = self.games[room_jid.userhost()] |
552 players = game_data['players'] | |
553 players_data = game_data['players_data'] | |
554 current_player = game_data['current_player'] | |
92 | 555 game_data['stage'] = "init" |
94 | 556 game_data['first_player'] = None #first player for the current trick |
95 | 557 game_data['contrat'] = None |
91 | 558 hand = game_data['hand'] = {} |
559 hand_size = game_data['hand_size'] | |
560 chien = game_data['chien'] = [] | |
328 | 561 for i in range(4): |
88 | 562 hand[players[i]] = deck[0:hand_size] |
563 del deck[0:hand_size] | |
92 | 564 chien.extend(deck) |
88 | 565 del(deck[:]) |
566 | |
567 for player in players: | |
90 | 568 to_jid = jid.JID(room_jid.userhost()+"/"+player) #FIXME: gof: |
569 mess = self.createGameElt(to_jid) | |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
570 mess.firstChildElement().addChild(self.__card_list_to_xml(hand[player], 'hand')) |
92 | 571 self.host.profiles[profile].xmlstream.send(mess) |
91 | 572 players_data[player]['contrat'] = None |
92 | 573 players_data[player]['levees'] = [] #cards won |
94 | 574 players_data[player]['played'] = None #card on the table |
575 players_data[player]['wait_for_low'] = None #Used when a player wait for a low card because of excuse | |
91 | 576 |
577 pl_idx = game_data['current_player'] = (game_data['init_player'] + 1) % len(players) #the player after the dealer start | |
578 player = players[pl_idx] | |
579 to_jid = jid.JID(room_jid.userhost()+"/"+player) #FIXME: gof: | |
580 mess = self.createGameElt(to_jid) | |
581 mess.firstChildElement().addChild(self.__ask_contrat()) | |
92 | 582 self.host.profiles[profile].xmlstream.send(mess) |
90 | 583 |
584 | |
585 def card_game_cmd(self, mess_elt, profile): | |
93 | 586 from_jid = jid.JID(mess_elt['from']) |
587 room_jid = jid.JID(from_jid.userhost()) | |
90 | 588 game_elt = mess_elt.firstChildElement() |
92 | 589 game_data = self.games[room_jid.userhost()] |
590 players_data = game_data['players_data'] | |
591 | |
592 for elt in game_elt.elements(): | |
91 | 593 |
92 | 594 if elt.name == 'started': #new game created |
90 | 595 players = [] |
596 for player in elt.elements(): | |
597 players.append(unicode(player)) | |
93 | 598 self.host.bridge.tarotGameStarted(room_jid.userhost(), from_jid.full(), players, profile) |
91 | 599 |
92 | 600 elif elt.name == 'player_ready': #ready to play |
601 player = elt['player'] | |
90 | 602 status = self.games[room_jid.userhost()]['status'] |
603 nb_players = len(self.games[room_jid.userhost()]['players']) | |
604 status[player] = 'ready' | |
605 debug (_('Player %(player)s is ready to start [status: %(status)s]') % {'player':player, 'status':status}) | |
91 | 606 if status.values().count('ready') == nb_players: #everybody is ready, we can start the game |
92 | 607 self.newGame(room_jid, profile) |
88 | 608 |
90 | 609 elif elt.name == 'hand': #a new hand has been received |
92 | 610 self.host.bridge.tarotGameNew(room_jid.userhost(), self.__xml_to_list(elt), profile) |
91 | 611 |
612 elif elt.name == 'contrat': #it's time to choose contrat | |
613 form = data_form.Form.fromElement(elt.firstChildElement()) | |
102 | 614 xml_data = dataForm2xml(form) |
92 | 615 self.host.bridge.tarotGameChooseContrat(room_jid.userhost(), xml_data, profile) |
91 | 616 |
92 | 617 elif elt.name == 'contrat_choosed': |
91 | 618 #TODO: check we receive the contrat from the right person |
92 | 619 #TODO: use proper XEP-0004 way for answering form |
620 player = elt['player'] | |
621 players_data[player]['contrat'] = unicode(elt) | |
91 | 622 contrats = [players_data[player]['contrat'] for player in game_data['players']] |
623 if contrats.count(None): | |
624 #not everybody has choosed his contrat, it's next one turn | |
625 player = self.__next_player(game_data) | |
626 to_jid = jid.JID(room_jid.userhost()+"/"+player) #FIXME: gof: | |
627 mess = self.createGameElt(to_jid) | |
628 mess.firstChildElement().addChild(self.__ask_contrat()) | |
92 | 629 self.host.profiles[profile].xmlstream.send(mess) |
91 | 630 else: |
631 best_contrat = [None, "Passe"] | |
632 for player in game_data['players']: | |
633 contrat = players_data[player]['contrat'] | |
634 idx_best = self.contrats.index(best_contrat[1]) | |
635 idx_pl = self.contrats.index(contrat) | |
636 if idx_pl > idx_best: | |
637 best_contrat[0] = player | |
638 best_contrat[1] = contrat | |
328 | 639 if best_contrat[1] == "Passe": |
640 debug(_("Everybody is passing, round ended")) | |
641 to_jid = jid.JID(room_jid.userhost()) | |
642 mess = self.createGameElt(to_jid) | |
643 mess.firstChildElement().addChild(self.__give_scores(*self.__draw_game(game_data))) | |
644 self.host.profiles[profile].xmlstream.send(mess) | |
645 game_data['init_player'] = (game_data['init_player'] + 1) % len(game_data['players']) #we change the dealer | |
646 for player in game_data['players']: | |
647 game_data['status'][player] = "init" | |
648 return | |
91 | 649 debug (_("%(player)s win the bid with %(contrat)s") % {'player':best_contrat[0],'contrat':best_contrat[1]}) |
95 | 650 game_data['contrat'] = best_contrat[1] |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
651 |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
652 if game_data['contrat'] == "Garde Sans" or game_data['contrat'] == "Garde Contre": |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
653 self.__start_play(room_jid, game_data, profile) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
654 game_data['attaquant'] = best_contrat[0] |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
655 else: |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
656 #Time to show the chien to everybody |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
657 to_jid = jid.JID(room_jid.userhost()) #FIXME: gof: |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
658 mess = self.createGameElt(to_jid) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
659 chien_elt = mess.firstChildElement().addChild(self.__card_list_to_xml(game_data['chien'], 'chien')) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
660 chien_elt['attaquant'] = best_contrat[0] |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
661 self.host.profiles[profile].xmlstream.send(mess) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
662 #the attacker (attaquant) get the chien |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
663 game_data['hand'][best_contrat[0]].extend(game_data['chien']) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
664 del game_data['chien'][:] |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
665 |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
666 if game_data['contrat'] == "Garde Sans": |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
667 #The chien go into attaquant's (attacker) levees |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
668 players_data[best_contrat[0]]['levees'].extend(game_data['chien']) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
669 del game_data['chien'][:] |
91 | 670 |
92 | 671 |
672 elif elt.name == 'chien': #we have received the chien | |
673 debug (_("tarot: chien received")) | |
674 data = {"attaquant":elt['attaquant']} | |
675 game_data['stage'] = "ecart" | |
676 game_data['attaquant'] = elt['attaquant'] | |
677 self.host.bridge.tarotGameShowCards(room_jid.userhost(), "chien", self.__xml_to_list(elt), data, profile) | |
678 | |
679 elif elt.name == 'cards_played': | |
680 if game_data['stage'] == "ecart": | |
681 #TODO: show atouts (trumps) if player put some in écart | |
682 assert (game_data['attaquant'] == elt['player']) #TODO: throw an xml error here | |
141
8c80d4dec7a8
mover Card class to tools/games and renamed it in TarotCard
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
683 list_cards = TarotCard.from_tuples(self.__xml_to_list(elt)) |
99
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
684 #we now check validity of card |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
685 invalid_cards = self.__invalid_cards(game_data, list_cards) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
686 if invalid_cards: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
687 mess = self.createGameElt(jid.JID(room_jid.userhost()+'/'+elt['player'])) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
688 mess.firstChildElement().addChild(self.__invalid_cards_elt(list_cards, invalid_cards, game_data['stage'])) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
689 self.host.profiles[profile].xmlstream.send(mess) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
690 return |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
691 |
95 | 692 #FIXME: gof: manage Garde Sans & Garde Contre cases |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
693 players_data[elt['player']]['levees'].extend(list_cards) #we add the chien to attaquant's levées |
95 | 694 for card in list_cards: |
695 game_data['hand'][elt['player']].remove(card) | |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
696 |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
697 self.__start_play(room_jid, game_data, profile) |
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
698 |
93 | 699 elif game_data['stage'] == "play": |
700 current_player = game_data['players'][game_data['current_player']] | |
141
8c80d4dec7a8
mover Card class to tools/games and renamed it in TarotCard
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
701 cards = TarotCard.from_tuples(self.__xml_to_list(elt)) |
94 | 702 |
703 if mess_elt['type'] == 'groupchat': | |
704 self.host.bridge.tarotGameCardsPlayed(room_jid.userhost(), elt['player'], self.__xml_to_list(elt), profile) | |
705 else: | |
99
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
706 #we first check validity of card |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
707 invalid_cards = self.__invalid_cards(game_data, cards) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
708 if invalid_cards: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
709 mess = self.createGameElt(jid.JID(room_jid.userhost()+'/'+current_player)) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
710 mess.firstChildElement().addChild(self.__invalid_cards_elt(cards, invalid_cards, game_data['stage'])) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
711 self.host.profiles[profile].xmlstream.send(mess) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
712 return |
93 | 713 #the card played is ok, we forward it to everybody |
94 | 714 #first we remove it from the hand and put in on the table |
93 | 715 game_data['hand'][current_player].remove(cards[0]) |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
716 players_data[current_player]['played'] = cards[0] |
93 | 717 |
718 #then we forward the message | |
719 mess = self.createGameElt(room_jid) | |
720 playcard_elt = mess.firstChildElement().addChild(elt) | |
721 self.host.profiles[profile].xmlstream.send(mess) | |
722 | |
94 | 723 #Did everybody played ? |
724 played = [players_data[player]['played'] for player in game_data['players']] | |
95 | 725 if all(played): |
726 #everybody has played | |
94 | 727 winner = self.__winner(game_data) |
728 debug (_('The winner of this trick is %s') % winner) | |
729 #the winner win the trick | |
730 self.__excuse_hack(game_data, played, winner) | |
731 players_data[elt['player']]['levees'].extend(played) | |
732 #nothing left on the table | |
733 for player in game_data['players']: | |
734 players_data[player]['played'] = None | |
735 if len(game_data['hand'][current_player]) == 0: | |
736 #no card lef: the game is finished | |
362
208107419b17
Quiz game: buzzer, timer, answer management
Goffi <goffi@goffi.org>
parents:
361
diff
changeset
|
737 to_jid = room_jid |
95 | 738 mess = self.createGameElt(to_jid) |
739 chien_elt = mess.firstChildElement().addChild(self.__give_scores(*self.__calculate_scores(game_data))) | |
740 self.host.profiles[profile].xmlstream.send(mess) | |
328 | 741 game_data['init_player'] = (game_data['init_player'] + 1) % len(game_data['players']) #we change the dealer |
742 for player in game_data['players']: | |
743 game_data['status'][player] = "init" | |
94 | 744 return |
745 #next player is the winner | |
746 next_player = game_data['first_player'] = self.__next_player(game_data, winner) | |
747 else: | |
748 next_player = self.__next_player(game_data) | |
749 | |
93 | 750 #finally, we tell to the next player to play |
362
208107419b17
Quiz game: buzzer, timer, answer management
Goffi <goffi@goffi.org>
parents:
361
diff
changeset
|
751 to_jid = jid.JID(room_jid.userhost()+"/"+next_player) |
93 | 752 mess = self.createGameElt(to_jid) |
753 yourturn_elt = mess.firstChildElement().addElement('your_turn') | |
754 self.host.profiles[profile].xmlstream.send(mess) | |
755 | |
92 | 756 elif elt.name == 'your_turn': |
757 self.host.bridge.tarotGameYourTurn(room_jid.userhost(), profile) | |
91 | 758 |
95 | 759 elif elt.name == 'score': |
760 form_elt = elt.elements(name='x',uri='jabber:x:data').next() | |
761 winners = [] | |
762 loosers = [] | |
563 | 763 for winner in elt.elements(name='winner', uri=NS_CG): |
95 | 764 winners.append(unicode(winner)) |
563 | 765 for looser in elt.elements(name='looser', uri=NS_CG): |
95 | 766 loosers.append(unicode(looser)) |
767 form = data_form.Form.fromElement(form_elt) | |
102 | 768 xml_data = dataForm2xml(form) |
95 | 769 self.host.bridge.tarotGameScore(room_jid.userhost(), xml_data, winners, loosers, profile) |
99
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
770 elif elt.name == 'error': |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
771 if elt['type'] == 'invalid_cards': |
563 | 772 played_cards = self.__xml_to_list(elt.elements(name='played',uri=NS_CG).next()) |
773 invalid_cards = self.__xml_to_list(elt.elements(name='invalid',uri=NS_CG).next()) | |
99
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
774 self.host.bridge.tarotGameInvalidCards(room_jid.userhost(), elt['phase'], played_cards, invalid_cards, profile) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
775 else: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
776 error (_('Unmanaged error type: %s') % elt['type']) |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
777 else: |
63c9067a1499
Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents:
98
diff
changeset
|
778 error (_('Unmanaged card game element: %s') % elt.name) |
95 | 779 |
90 | 780 def getHandler(self, profile): |
781 return CardGameHandler(self) | |
88 | 782 |
90 | 783 class CardGameHandler (XMPPHandler): |
784 implements(iwokkel.IDisco) | |
785 | |
786 def __init__(self, plugin_parent): | |
787 self.plugin_parent = plugin_parent | |
788 self.host = plugin_parent.host | |
789 | |
790 def connectionInitialized(self): | |
791 self.xmlstream.addObserver(CG_REQUEST, self.plugin_parent.card_game_cmd, profile = self.parent.profile) | |
792 | |
793 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): | |
98
dd556233a1b1
Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents:
96
diff
changeset
|
794 return [disco.DiscoFeature(NS_CG)] |
90 | 795 |
796 def getDiscoItems(self, requestor, target, nodeIdentifier=''): | |
797 return [] | |
798 |