annotate src/plugins/plugin_misc_tarot.py @ 1316:8adcdf2cdfe1 frontends_multi_profiles

core: added a "profileConnecting" method check: if a plugin has a profileConnecting method, it will be called when the profile is being connected but before the client stream is started. That can be usefull if things need to be done before the communication is started: e.g. putting triggers, loading PersistentDict, etc.
author Goffi <goffi@goffi.org>
date Mon, 09 Feb 2015 21:39:51 +0100
parents 83ed877541e3
children 83127a4c89ce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
88
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/python
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
Goffi <goffi@goffi.org>
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
4 # SAT plugin for managing French Tarot game
811
1fe00f0c9a91 dates update
Goffi <goffi@goffi.org>
parents: 771
diff changeset
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org)
88
Goffi <goffi@goffi.org>
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
7 # This program is free software: you can redistribute it and/or modify
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
10 # (at your option) any later version.
88
Goffi <goffi@goffi.org>
parents:
diff changeset
11
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
12 # This program is distributed in the hope that it will be useful,
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
15 # GNU Affero General Public License for more details.
88
Goffi <goffi@goffi.org>
parents:
diff changeset
16
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 594
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
88
Goffi <goffi@goffi.org>
parents:
diff changeset
19
771
bfabeedbf32e core: i18n refactoring:
Goffi <goffi@goffi.org>
parents: 761
diff changeset
20 from sat.core.i18n import _
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 878
diff changeset
21 from sat.core.constants import Const as C
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
22 from sat.core.log import getLogger
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
23 log = getLogger(__name__)
88
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from twisted.words.xish import domish
563
da6eaa2af092 plugin Tarot: fixed plugin
Goffi <goffi@goffi.org>
parents: 536
diff changeset
25 from twisted.words.protocols.jabber import jid
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
26 from twisted.internet import defer
717
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
27 from wokkel import data_form
88
Goffi <goffi@goffi.org>
parents:
diff changeset
28
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
29 from sat.memory import memory
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
30 from sat.tools import xml_tools
719
56aa0e98c92e frontends tools: moved src/tools/frontends to frontends/src/tools
souliane <souliane@mailoo.org>
parents: 718
diff changeset
31 from sat_frontends.tools.games import TarotCard
717
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
32 import random
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
88
Goffi <goffi@goffi.org>
parents:
diff changeset
34
90
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
35 NS_CG = 'http://www.goffi.org/protocol/card_game'
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
36 CG_TAG = 'card_game'
88
Goffi <goffi@goffi.org>
parents:
diff changeset
37
Goffi <goffi@goffi.org>
parents:
diff changeset
38 PLUGIN_INFO = {
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
39 "name": "Tarot cards plugin",
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
40 "import_name": "Tarot",
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
41 "type": "Misc",
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
42 "protocols": [],
718
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
43 "dependencies": ["XEP-0045", "XEP-0249", "ROOM-GAME"],
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
44 "main": "Tarot",
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
45 "handler": "yes",
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
46 "description": _("""Implementation of Tarot card game""")
88
Goffi <goffi@goffi.org>
parents:
diff changeset
47 }
Goffi <goffi@goffi.org>
parents:
diff changeset
48
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
49
718
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
50 class Tarot(object):
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
51
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
52 def inheritFromRoomGame(self, host):
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
53 global RoomGame
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
54 RoomGame = host.plugins["ROOM-GAME"].__class__
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
55 self.__class__ = type(self.__class__.__name__, (self.__class__, RoomGame, object), {})
88
Goffi <goffi@goffi.org>
parents:
diff changeset
56
Goffi <goffi@goffi.org>
parents:
diff changeset
57 def __init__(self, host):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
58 log.info(_("Plugin Tarot initialization"))
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
59 self._sessions = memory.Sessions()
718
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
60 self.inheritFromRoomGame(host)
074970227bc0 plugin tools: turn src/plugin/games.py into a plugin and move it to src/plugins/plugin_misc_room_game.py
souliane <souliane@mailoo.org>
parents: 717
diff changeset
61 RoomGame._init_(self, host, PLUGIN_INFO, (NS_CG, CG_TAG),
717
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
62 game_init={'hand_size': 18, 'init_player': 0, 'current_player': None, 'contrat': None, 'stage': None},
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
63 player_init={'score': 0})
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
64 self.contrats = [_('Passe'), _('Petite'), _('Garde'), _('Garde Sans'), _('Garde Contre')]
1257
83ed877541e3 plugin misc_room_game, radiocol, tarot: fixes bridge method "prepareRoom" declaration (add "async=True")
souliane <souliane@mailoo.org>
parents: 993
diff changeset
65 host.bridge.addMethod("tarotGameLaunch", ".plugin", in_sign='asss', out_sign='', method=self.prepareRoom, async=True) # args: players, room_jid, profile
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
66 host.bridge.addMethod("tarotGameCreate", ".plugin", in_sign='sass', out_sign='', method=self.createGame) # args: room_jid, players, profile
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
67 host.bridge.addMethod("tarotGameReady", ".plugin", in_sign='sss', out_sign='', method=self.playerReady) # args: player, referee, profile
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
68 host.bridge.addMethod("tarotGamePlayCards", ".plugin", in_sign='ssa(ss)s', out_sign='', method=self.play_cards) # args: player, referee, cards, profile
717
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
69 host.bridge.addSignal("tarotGamePlayers", ".plugin", signature='ssass') # args: room_jid, referee, players, profile
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
70 host.bridge.addSignal("tarotGameStarted", ".plugin", signature='ssass') # args: room_jid, referee, players, profile
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
71 host.bridge.addSignal("tarotGameNew", ".plugin", signature='sa(ss)s') # args: room_jid, hand, profile
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
72 host.bridge.addSignal("tarotGameChooseContrat", ".plugin", signature='sss') # args: room_jid, xml_data, profile
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
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
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
74 host.bridge.addSignal("tarotGameCardsPlayed", ".plugin", signature='ssa(ss)s') # args: room_jid, player, type ["chien", "poignée",...], cards, data[dict], profile
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
75 host.bridge.addSignal("tarotGameYourTurn", ".plugin", signature='ss') # args: room_jid, profile
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
76 host.bridge.addSignal("tarotGameScore", ".plugin", signature='ssasass') # args: room_jid, xml_data, winners (list of nicks), loosers (list of nicks), profile
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
77 host.bridge.addSignal("tarotGameInvalidCards", ".plugin", signature='ssa(ss)a(ss)s') # args: room_jid, game phase, played_cards, invalid_cards, profile
88
Goffi <goffi@goffi.org>
parents:
diff changeset
78 self.deck_ordered = []
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
79 for value in ['excuse'] + map(str, range(1, 22)):
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
80 self.deck_ordered.append(TarotCard(("atout", value)))
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
81 for suit in ["pique", "coeur", "carreau", "trefle"]:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
82 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
83 self.deck_ordered.append(TarotCard((suit, value)))
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
84 self.__choose_contrat_id = host.registerCallback(self._contratChoosed, with_data=True)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
85 self.__score_id = host.registerCallback(self._scoreShowed, with_data=True)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
86
88
Goffi <goffi@goffi.org>
parents:
diff changeset
87
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
88 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
89 """Convert a card list to domish element"""
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
90 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
91 for card in cards_list:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
92 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
93 card_elt['suit'] = card.suit
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
94 card_elt['value'] = card.value
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
95 cards_list_elt.addChild(card_elt)
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
96 return cards_list_elt
90
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
97
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
98 def __xml_to_list(self, cards_list_elt):
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
99 """Convert a domish element with cards to a list of tuples"""
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
100 cards_list = []
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
101 for card in cards_list_elt.elements():
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
102 cards_list.append((card['suit'], card['value']))
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
103 return cards_list
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
104
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
105 def __ask_contrat(self):
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
106 """Create a element for asking contrat"""
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
107 contrat_elt = domish.Element((None, 'contrat'))
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
108 form = data_form.Form('form', title=_('contrat selection'))
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
109 field = data_form.Field('list-single', 'contrat', options=map(data_form.Option, self.contrats), required=True)
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
110 form.addField(field)
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
111 contrat_elt.addChild(form.toElement())
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
112 return contrat_elt
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
113
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
114 def __give_scores(self, scores, winners, loosers):
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
115 """Create an element to give scores
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
116 @param scores: unicode (can contain line feed)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
117 @param winners: list of unicode nicks of winners
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
118 @param loosers: list of unicode nicks of loosers"""
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
119
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
120 score_elt = domish.Element((None, 'score'))
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
121 form = data_form.Form('form', title=_('scores'))
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
122 for line in scores.split('\n'):
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
123 field = data_form.Field('fixed', value=line)
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
124 form.addField(field)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
125 score_elt.addChild(form.toElement())
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
126 for winner in winners:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
127 winner_elt = domish.Element((None, 'winner'))
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
128 winner_elt.addContent(winner)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
129 score_elt.addChild(winner_elt)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
130 for looser in loosers:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
131 looser_elt = domish.Element((None, 'looser'))
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
132 looser_elt.addContent(looser)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
133 score_elt.addChild(looser_elt)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
134 return score_elt
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
135
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
136 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
137 """Create a element for invalid_cards error
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
138 @param list_cards: list of Card
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
139 @param game_phase: phase of the game ['ecart', 'play']"""
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
140 error_elt = domish.Element((None, 'error'))
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
141 played_elt = self.__card_list_to_xml(played_cards, 'played')
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
142 invalid_elt = self.__card_list_to_xml(invalid_cards, 'invalid')
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
143 error_elt['type'] = 'invalid_cards'
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
144 error_elt['phase'] = game_phase
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
145 error_elt.addChild(played_elt)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
146 error_elt.addChild(invalid_elt)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
147 return error_elt
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
148
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
149 def __next_player(self, game_data, next_pl=None):
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
150 """Increment player number & return player name
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
151 @param next_pl: if given, then next_player is forced to this one
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
152 """
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
153 if next_pl:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
154 game_data['current_player'] = game_data['players'].index(next_pl)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
155 return next_pl
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
156 else:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
157 pl_idx = game_data['current_player'] = (game_data['current_player'] + 1) % len(game_data['players'])
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
158 return game_data['players'][pl_idx]
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
159
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
160 def __winner(self, game_data):
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
161 """give the nick of the player who win this trick"""
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
162 players_data = game_data['players_data']
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
163 first = game_data['first_player']
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
164 first_idx = game_data['players'].index(first)
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
165 suit_asked = None
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
166 strongest = None
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
167 winner = None
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
168 for idx in [(first_idx + i) % 4 for i in range(4)]:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
169 player = game_data['players'][idx]
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
170 card = players_data[player]['played']
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
171 if card.value == "excuse":
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
172 continue
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
173 if suit_asked is None:
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
174 suit_asked = card.suit
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
175 if (card.suit == suit_asked or card.suit == "atout") and card > strongest:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
176 strongest = card
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
177 winner = player
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
178 assert winner
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
179 return winner
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
180
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
181 def __excuse_hack(self, game_data, played, winner):
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
182 """give a low card to other team and keep excuse if trick is lost
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
183 @param game_data: data of the game
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
184 @param played: cards currently on the table
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
185 @param winner: nick of the trick winner"""
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
186 #TODO: manage the case where excuse is played on the last trick (and lost)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
187 players_data = game_data['players_data']
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
188 excuse = TarotCard(("atout", "excuse"))
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
189
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
190 #we first check if the Excuse was already played
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
191 #and if somebody is waiting for a card
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
192 for player in game_data['players']:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
193 if players_data[player]['wait_for_low']:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
194 #the excuse owner has to give a card to somebody
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
195 if winner == player:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
196 #the excuse owner win the trick, we check if we have something to give
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
197 for card in played:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
198 if card.points == 0.5:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
199 pl_waiting = players_data[player]['wait_for_low']
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
200 played.remove(card)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
201 players_data[pl_waiting]['levees'].append(card)
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
202 log.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
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
203 return
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
204 return
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
205
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
206 if not excuse in played:
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
207 #the Excuse is not on the table, nothing to do
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
208 return
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
209
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
210 excuse_player = None # Who has played the Excuse ?
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
211 for player in game_data['players']:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
212 if players_data[player]['played'] == excuse:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
213 excuse_player = player
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
214 break
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
215
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
216 if excuse_player == winner:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
217 return # the excuse player win the trick, nothing to do
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
218
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
219 #first we remove the excuse from played cards
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
220 played.remove(excuse)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
221 #then we give it back to the original owner
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
222 owner_levees = players_data[excuse_player]['levees']
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
223 owner_levees.append(excuse)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
224 #finally we give a low card to the trick winner
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
225 low_card = None
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
226 #We look backward in cards won by the Excuse owner to
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
227 #find a low value card
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
228 for card_idx in range(len(owner_levees) - 1, -1, -1):
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
229 if owner_levees[card_idx].points == 0.5:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
230 low_card = owner_levees[card_idx]
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
231 del owner_levees[card_idx]
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
232 players_data[winner]['levees'].append(low_card)
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
233 log.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})
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
234 break
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
235 if not low_card: # The player has no low card yet
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
236 #TODO: manage case when player never win a trick with low card
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
237 players_data[excuse_player]['wait_for_low'] = winner
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
238 log.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})
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
239
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
240 def __draw_game(self, game_data):
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
241 """The game is draw, no score change
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
242 @param game_data: data of the game
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
243 @return: tuple with (string victory message, list of winners, list of loosers)"""
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
244 players_data = game_data['players_data']
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
245 scores_str = _('Draw game')
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
246 scores_str += '\n'
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
247 for player in game_data['players']:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
248 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']}
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
249 log.debug(scores_str)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
250
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
251 return (scores_str, [], [])
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
252
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
253 def __calculate_scores(self, game_data):
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
254 """The game is finished, time to know who won :)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
255 @param game_data: data of the game
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
256 @return: tuple with (string victory message, list of winners, list of loosers)"""
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
257 players_data = game_data['players_data']
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
258 levees = players_data[game_data['attaquant']]['levees']
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
259 score = 0
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
260 nb_bouts = 0
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
261 bouts = []
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
262 for card in levees:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
263 if card.bout:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
264 nb_bouts += 1
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
265 bouts.append(card.value)
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
266 score += card.points
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
267
161
c37826d80f2a plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents: 147
diff changeset
268 #We we do a basic check on score calculation
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
269 check_score = 0
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
270 defenseurs = game_data['players'][:]
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
271 defenseurs.remove(game_data['attaquant'])
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
272 for defenseur in defenseurs:
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
273 for card in players_data[defenseur]['levees']:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
274 check_score += card.points
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
275 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
276 for card in game_data['chien']:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
277 check_score += card.points
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
278 assert (score + check_score == 91)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
279
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
280 point_limit = None
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
281 if nb_bouts == 3:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
282 point_limit = 36
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
283 elif nb_bouts == 2:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
284 point_limit = 41
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
285 elif nb_bouts == 1:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
286 point_limit = 51
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
287 else:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
288 point_limit = 56
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
289 if game_data['contrat'] == 'Petite':
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
290 contrat_mult = 1
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
291 elif game_data['contrat'] == 'Garde':
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
292 contrat_mult = 2
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
293 elif game_data['contrat'] == 'Garde Sans':
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
294 contrat_mult = 4
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
295 elif game_data['contrat'] == 'Garde Contre':
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
296 contrat_mult = 6
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
297 else:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
298 log.error(_('INTERNAL ERROR: contrat not managed (mispelled ?)'))
161
c37826d80f2a plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents: 147
diff changeset
299 assert(False)
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
300
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
301 victory = (score >= point_limit)
161
c37826d80f2a plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents: 147
diff changeset
302 margin = abs(score - point_limit)
c37826d80f2a plugin tarot: fixed bad score calculation
Goffi <goffi@goffi.org>
parents: 147
diff changeset
303 points_defenseur = (margin + 25) * contrat_mult * (-1 if victory else 1)
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
304 winners = []
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
305 loosers = []
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
306 player_score = {}
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
307 for player in game_data['players']:
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
308 #TODO: adjust this for 3 and 5 players variants
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
309 #TODO: manage bonuses (petit au bout, poignée, chelem)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
310 player_score[player] = points_defenseur if player != game_data['attaquant'] else points_defenseur * -3
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
311 players_data[player]['score'] += player_score[player] # we add score of this game to the global score
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
312 if player_score[player] > 0:
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
313 winners.append(player)
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
314 else:
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
315 loosers.append(player)
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
316
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
317 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'}
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
318 scores_str += '\n'
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
319 for player in game_data['players']:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
320 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']}
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
321 log.debug(scores_str)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
322
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
323 return (scores_str, winners, loosers)
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
324
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
325 def __invalid_cards(self, game_data, cards):
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
326 """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
327 @param game_data: Game data
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
328 @param cards: cards the player want to play
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
329 @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
330 forbidden_cards = []
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
331 if game_data['stage'] == 'ecart':
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
332 for card in cards:
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
333 if card.bout or card.value == "roi":
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
334 forbidden_cards.append(card)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
335 #TODO: manage case where atouts (trumps) are in the dog
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
336 elif game_data['stage'] == 'play':
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
337 biggest_atout = None
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
338 suit_asked = None
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
339 players = game_data['players']
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
340 players_data = game_data['players_data']
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
341 idx = players.index(game_data['first_player'])
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
342 current_idx = game_data['current_player']
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
343 current_player = players[current_idx]
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
344 if idx == current_idx:
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
345 #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
346 return forbidden_cards
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
347 while (idx != current_idx):
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
348 player = players[idx]
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
349 played_card = players_data[player]['played']
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
350 if not suit_asked and played_card.value != "excuse":
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
351 suit_asked = played_card.suit
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
352 if played_card.suit == "atout" and played_card > biggest_atout:
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
353 biggest_atout = played_card
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
354 idx = (idx + 1) % len(players)
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
355 has_suit = False # True if there is one card of the asked suit in the hand of the player
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
356 has_atout = False
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
357 biggest_hand_atout = None
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
358
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
359 for hand_card in game_data['hand'][current_player]:
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
360 if hand_card.suit == suit_asked:
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
361 has_suit = True
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
362 if hand_card.suit == "atout":
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
363 has_atout = True
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
364 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
365 biggest_hand_atout = hand_card
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
366
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
367 assert len(cards) == 1
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
368 card = cards[0]
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
369 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
370 forbidden_cards.append(card)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
371 return forbidden_cards
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
372 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
373 forbidden_cards.append(card)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
374 return forbidden_cards
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
375 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
376 forbidden_cards.append(card)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
377 else:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
378 log.error(_('Internal error: unmanaged game stage'))
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
379 return forbidden_cards
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
380
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
381 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
382 """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
383 game_data['stage'] = "play"
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
384 next_player_idx = game_data['current_player'] = (game_data['init_player'] + 1) % len(game_data['players']) # the player after the dealer start
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
385 game_data['first_player'] = next_player = game_data['players'][next_player_idx]
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
386 to_jid = jid.JID(room_jid.userhost() + "/" + next_player) # FIXME: gof:
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
387 self.send(to_jid, 'your_turn', profile=profile)
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
388
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
389 def _contratChoosed(self, raw_data, profile):
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
390 """Will be called when the contrat is selected
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
391 @param raw_data: contains the choosed session id and the chosen contrat
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
392 @param profile_key: profile
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
393 """
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
394 try:
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
395 session_data = self._sessions.profileGet(raw_data["session_id"], profile)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
396 except KeyError:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
397 log.warning(_("session id doesn't exist, session has probably expired"))
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
398 # TODO: send error dialog
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
399 return defer.succeed({})
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
400
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
401 room_jid_s = session_data['room_jid'].userhost()
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
402 referee = self.games[room_jid_s]['referee']
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
403 player = self.host.plugins["XEP-0045"].getRoomNick(room_jid_s, profile)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
404 data = xml_tools.XMLUIResult2DataFormResult(raw_data)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
405 contrat = data['contrat']
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
406 log.debug(_('contrat [%(contrat)s] choosed by %(profile)s') % {'contrat': contrat, 'profile': profile})
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
407 d = self.send(jid.JID(referee), ('', 'contrat_choosed'), {'player': player}, content=contrat, profile=profile)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
408 d.addCallback(lambda ignore: {})
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
409 del self._sessions[raw_data["session_id"]]
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
410 return d
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
411
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
412 def _scoreShowed(self, raw_data, profile):
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
413 """Will be called when the player closes the score dialog
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
414 @param raw_data: nothing to retrieve from here but the session id
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
415 @param profile_key: profile
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
416 """
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
417 try:
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
418 session_data = self._sessions.profileGet(raw_data["session_id"], profile)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
419 except KeyError:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
420 log.warning(_("session id doesn't exist, session has probably expired"))
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
421 # TODO: send error dialog
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
422 return defer.succeed({})
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
423
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
424 room_jid_s = session_data['room_jid'].userhost()
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
425 # XXX: empty hand means to the frontend "reset the display"...
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
426 self.host.bridge.tarotGameNew(room_jid_s, [], profile)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
427 del self._sessions[raw_data["session_id"]]
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
428 return defer.succeed({})
88
Goffi <goffi@goffi.org>
parents:
diff changeset
429
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 878
diff changeset
430 def play_cards(self, player, referee, cards, profile_key=C.PROF_KEY_NONE):
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
431 """Must be call by player when the contrat is selected
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
432 @param player: player's name
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
433 @param referee: arbiter jid
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
434 @cards: cards played (list of tuples)
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
435 @profile_key: profile
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
436 """
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
437 profile = self.host.memory.getProfileName(profile_key)
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
438 if not profile:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
439 log.error(_("profile %s is unknown") % profile_key)
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
440 return
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
441 log.debug(_('Cards played by %(profile)s: [%(cards)s]') % {'profile': profile, 'cards': cards})
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
442 elem = self.__card_list_to_xml(TarotCard.from_tuples(cards), 'cards_played')
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
443 self.send(jid.JID(referee), elem, {'player': player}, profile=profile)
88
Goffi <goffi@goffi.org>
parents:
diff changeset
444
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
445 def newRound(self, room_jid, profile):
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
446 game_data = self.games[room_jid.userhost()]
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
447 players = game_data['players']
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
448 game_data['first_player'] = None # first player for the current trick
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
449 game_data['contrat'] = None
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
450 common_data = {'contrat': None,
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
451 'levees': [], # cards won
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
452 'played': None, # card on the table
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
453 'wait_for_low': None # Used when a player wait for a low card because of excuse
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
454 }
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
455
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
456 hand = game_data['hand'] = {}
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
457 hand_size = game_data['hand_size']
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
458 chien = game_data['chien'] = []
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
459 deck = self.deck_ordered[:]
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
460 random.shuffle(deck)
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
461 for i in range(4):
88
Goffi <goffi@goffi.org>
parents:
diff changeset
462 hand[players[i]] = deck[0:hand_size]
Goffi <goffi@goffi.org>
parents:
diff changeset
463 del deck[0:hand_size]
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
464 chien.extend(deck)
88
Goffi <goffi@goffi.org>
parents:
diff changeset
465 del(deck[:])
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
466 msg_elts = {}
88
Goffi <goffi@goffi.org>
parents:
diff changeset
467 for player in players:
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
468 msg_elts[player] = self.__card_list_to_xml(hand[player], 'hand')
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
469
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
470 RoomGame.newRound(self, room_jid, (common_data, msg_elts), profile)
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
471
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
472 pl_idx = game_data['current_player'] = (game_data['init_player'] + 1) % len(players) # the player after the dealer start
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
473 player = players[pl_idx]
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
474 to_jid = jid.JID(room_jid.userhost() + "/" + player) # FIXME: gof:
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
475 self.send(to_jid, self.__ask_contrat(), profile=profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
476
717
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
477 def room_game_cmd(self, mess_elt, profile):
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
478 """
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
479 @param mess_elt: instance of twisted.words.xish.domish.Element
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
480 """
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
481 from_jid = jid.JID(mess_elt['from'])
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
482 room_jid = jid.JID(from_jid.userhost())
826
71f8e996f765 plugins radiocol_tarot: do not process received messages for MUC users that are actually not playing the game + fix for testing purpose
souliane <souliane@mailoo.org>
parents: 825
diff changeset
483 nick = self.host.plugins["XEP-0045"].getRoomNick(room_jid.userhost(), profile)
71f8e996f765 plugins radiocol_tarot: do not process received messages for MUC users that are actually not playing the game + fix for testing purpose
souliane <souliane@mailoo.org>
parents: 825
diff changeset
484
90
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
485 game_elt = mess_elt.firstChildElement()
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
486 game_data = self.games[room_jid.userhost()]
826
71f8e996f765 plugins radiocol_tarot: do not process received messages for MUC users that are actually not playing the game + fix for testing purpose
souliane <souliane@mailoo.org>
parents: 825
diff changeset
487 is_player = self.isPlayer(room_jid.userhost(), nick)
717
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
488 if 'players_data' in game_data:
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
489 players_data = game_data['players_data']
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
490
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
491 for elt in game_elt.elements():
826
71f8e996f765 plugins radiocol_tarot: do not process received messages for MUC users that are actually not playing the game + fix for testing purpose
souliane <souliane@mailoo.org>
parents: 825
diff changeset
492 if not is_player and (elt.name not in ('started', 'players')):
71f8e996f765 plugins radiocol_tarot: do not process received messages for MUC users that are actually not playing the game + fix for testing purpose
souliane <souliane@mailoo.org>
parents: 825
diff changeset
493 continue # user is in the room but not playing
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
494
826
71f8e996f765 plugins radiocol_tarot: do not process received messages for MUC users that are actually not playing the game + fix for testing purpose
souliane <souliane@mailoo.org>
parents: 825
diff changeset
495 if elt.name in ('started', 'players'): # new game created and/or players list updated
90
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
496 players = []
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
497 for player in elt.elements():
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
498 players.append(unicode(player))
717
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
499 signal = self.host.bridge.tarotGameStarted if elt.name == 'started' else self.host.bridge.tarotGamePlayers
358018c5c398 plugins (games): more factorization and flexibility for launching and joining games:
souliane <souliane@mailoo.org>
parents: 714
diff changeset
500 signal(room_jid.userhost(), from_jid.full(), players, profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
501
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
502 elif elt.name == 'player_ready': # ready to play
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
503 player = elt['player']
90
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
504 status = self.games[room_jid.userhost()]['status']
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
505 nb_players = len(self.games[room_jid.userhost()]['players'])
4020931569b8 Tarot Game: session initialization
Goffi <goffi@goffi.org>
parents: 89
diff changeset
506 status[player] = 'ready'
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
507 log.debug(_('Player %(player)s is ready to start [status: %(status)s]') % {'player': player, 'status': status})
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
508 if status.values().count('ready') == nb_players: # everybody is ready, we can start the game
683
75e4f5e2cc65 plugins radiocol, card_game, quiz: code factorization
souliane <souliane@mailoo.org>
parents: 682
diff changeset
509 self.newRound(room_jid, profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
510
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
511 elif elt.name == 'hand': # a new hand has been received
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
512 self.host.bridge.tarotGameNew(room_jid.userhost(), self.__xml_to_list(elt), profile)
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
513
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
514 elif elt.name == 'contrat': # it's time to choose contrat
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
515 form = data_form.Form.fromElement(elt.firstChildElement())
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
516 session_id, session_data = self._sessions.newSession(profile=profile)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
517 session_data["room_jid"] = room_jid
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
518 xml_data = xml_tools.dataForm2XMLUI(form, self.__choose_contrat_id, session_id).toXml()
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
519 self.host.bridge.tarotGameChooseContrat(room_jid.userhost(), xml_data, profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
520
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
521 elif elt.name == 'contrat_choosed':
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
522 #TODO: check we receive the contrat from the right person
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
523 #TODO: use proper XEP-0004 way for answering form
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
524 player = elt['player']
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
525 players_data[player]['contrat'] = unicode(elt)
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
526 contrats = [players_data[player]['contrat'] for player in game_data['players']]
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
527 if contrats.count(None):
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
528 #not everybody has choosed his contrat, it's next one turn
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
529 player = self.__next_player(game_data)
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
530 to_jid = jid.JID(room_jid.userhost() + "/" + player) # FIXME: gof:
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
531 self.send(to_jid, self.__ask_contrat(), profile=profile)
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
532 else:
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
533 best_contrat = [None, "Passe"]
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
534 for player in game_data['players']:
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
535 contrat = players_data[player]['contrat']
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
536 idx_best = self.contrats.index(best_contrat[1])
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
537 idx_pl = self.contrats.index(contrat)
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
538 if idx_pl > idx_best:
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
539 best_contrat[0] = player
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
540 best_contrat[1] = contrat
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
541 if best_contrat[1] == "Passe":
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
542 log.debug(_("Everybody is passing, round ended"))
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
543 to_jid = jid.JID(room_jid.userhost())
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
544 self.send(to_jid, self.__give_scores(*self.__draw_game(game_data)), profile=profile)
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
545 game_data['init_player'] = (game_data['init_player'] + 1) % len(game_data['players']) # we change the dealer
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
546 for player in game_data['players']:
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
547 game_data['status'][player] = "init"
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
548 return
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
549 log.debug(_("%(player)s win the bid with %(contrat)s") % {'player': best_contrat[0], 'contrat': best_contrat[1]})
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
550 game_data['contrat'] = best_contrat[1]
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
551
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
552 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
553 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
554 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
555 else:
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
556 #Time to show the chien to everybody
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
557 to_jid = jid.JID(room_jid.userhost()) # FIXME: gof:
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
558 elem = self.__card_list_to_xml(game_data['chien'], 'chien')
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
559 self.send(to_jid, elem, {'attaquant': best_contrat[0]}, profile=profile)
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
560 #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
561 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
562 del game_data['chien'][:]
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
563
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
564 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
565 #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
566 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
567 del game_data['chien'][:]
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
568
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
569 elif elt.name == 'chien': # we have received the chien
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
570 log.debug(_("tarot: chien received"))
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
571 data = {"attaquant": elt['attaquant']}
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
572 game_data['stage'] = "ecart"
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
573 game_data['attaquant'] = elt['attaquant']
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
574 self.host.bridge.tarotGameShowCards(room_jid.userhost(), "chien", self.__xml_to_list(elt), data, profile)
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
575
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
576 elif elt.name == 'cards_played':
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
577 if game_data['stage'] == "ecart":
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
578 #TODO: show atouts (trumps) if player put some in écart
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
579 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
580 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
581 #we now check validity of card
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
582 invalid_cards = self.__invalid_cards(game_data, list_cards)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
583 if invalid_cards:
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
584 elem = self.__invalid_cards_elt(list_cards, invalid_cards, game_data['stage'])
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
585 self.send(jid.JID(room_jid.userhost() + '/' + elt['player']), elem, profile=profile)
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
586 return
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
587
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
588 #FIXME: gof: manage Garde Sans & Garde Contre cases
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
589 players_data[elt['player']]['levees'].extend(list_cards) # we add the chien to attaquant's levées
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
590 for card in list_cards:
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
591 game_data['hand'][elt['player']].remove(card)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
592
98
dd556233a1b1 Tarot Plugin: Garde Sans and Garde Contre are now managed
Goffi <goffi@goffi.org>
parents: 96
diff changeset
593 self.__start_play(room_jid, game_data, profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
594
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
595 elif game_data['stage'] == "play":
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
596 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
597 cards = TarotCard.from_tuples(self.__xml_to_list(elt))
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
598
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
599 if mess_elt['type'] == 'groupchat':
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
600 self.host.bridge.tarotGameCardsPlayed(room_jid.userhost(), elt['player'], self.__xml_to_list(elt), profile)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
601 else:
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
602 #we first check validity of card
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
603 invalid_cards = self.__invalid_cards(game_data, cards)
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
604 if invalid_cards:
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
605 elem = self.__invalid_cards_elt(cards, invalid_cards, game_data['stage'])
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
606 self.send(jid.JID(room_jid.userhost() + '/' + current_player), elem, profile=profile)
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
607 return
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
608 #the card played is ok, we forward it to everybody
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
609 #first we remove it from the hand and put in on the table
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
610 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
611 players_data[current_player]['played'] = cards[0]
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
612
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
613 #then we forward the message
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
614 self.send(room_jid, elt, profile=profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
615
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
616 #Did everybody played ?
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
617 played = [players_data[player]['played'] for player in game_data['players']]
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
618 if all(played):
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
619 #everybody has played
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
620 winner = self.__winner(game_data)
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
621 log.debug(_('The winner of this trick is %s') % winner)
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
622 #the winner win the trick
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
623 self.__excuse_hack(game_data, played, winner)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
624 players_data[elt['player']]['levees'].extend(played)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
625 #nothing left on the table
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
626 for player in game_data['players']:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
627 players_data[player]['played'] = None
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
628 if len(game_data['hand'][current_player]) == 0:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
629 #no card lef: the game is finished
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
630 elem = self.__give_scores(*self.__calculate_scores(game_data))
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
631 self.send(room_jid, elem, profile=profile)
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
632 game_data['init_player'] = (game_data['init_player'] + 1) % len(game_data['players']) # we change the dealer
328
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
633 for player in game_data['players']:
809733b8d9be Tarot game:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
634 game_data['status'][player] = "init"
94
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
635 return
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
636 #next player is the winner
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
637 next_player = game_data['first_player'] = self.__next_player(game_data, winner)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
638 else:
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
639 next_player = self.__next_player(game_data)
1eb5ccead43c Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 93
diff changeset
640
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
641 #finally, we tell to the next player to play
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
642 to_jid = jid.JID(room_jid.userhost() + "/" + next_player)
714
ecc5a5b34ee1 plugins (games): add a method to send messages more easily
souliane <souliane@mailoo.org>
parents: 712
diff changeset
643 self.send(to_jid, 'your_turn', profile=profile)
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 92
diff changeset
644
92
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
645 elif elt.name == 'your_turn':
2503de7fb4c7 Tarot game: chien/écart stage
Goffi <goffi@goffi.org>
parents: 91
diff changeset
646 self.host.bridge.tarotGameYourTurn(room_jid.userhost(), profile)
91
39c672544593 Tarot: bidding phase
Goffi <goffi@goffi.org>
parents: 90
diff changeset
647
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
648 elif elt.name == 'score':
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
649 form_elt = elt.elements(name='x', uri='jabber:x:data').next()
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
650 winners = []
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
651 loosers = []
563
da6eaa2af092 plugin Tarot: fixed plugin
Goffi <goffi@goffi.org>
parents: 536
diff changeset
652 for winner in elt.elements(name='winner', uri=NS_CG):
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
653 winners.append(unicode(winner))
563
da6eaa2af092 plugin Tarot: fixed plugin
Goffi <goffi@goffi.org>
parents: 536
diff changeset
654 for looser in elt.elements(name='looser', uri=NS_CG):
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
655 loosers.append(unicode(looser))
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
656 form = data_form.Form.fromElement(form_elt)
878
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
657 session_id, session_data = self._sessions.newSession(profile=profile)
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
658 session_data["room_jid"] = room_jid
36c6495d86b0 plugin card_game: update to use the new XMLUI mechanism:
souliane <souliane@mailoo.org>
parents: 828
diff changeset
659 xml_data = xml_tools.dataForm2XMLUI(form, self.__score_id, session_id).toXml()
95
be206a3d1a9b Tarot game: score calculation
Goffi <goffi@goffi.org>
parents: 94
diff changeset
660 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
661 elif elt.name == 'error':
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
662 if elt['type'] == 'invalid_cards':
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
663 played_cards = self.__xml_to_list(elt.elements(name='played', uri=NS_CG).next())
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
664 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
665 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
666 else:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
667 log.error(_('Unmanaged error type: %s') % elt['type'])
99
63c9067a1499 Tarot game: invalid cards management
Goffi <goffi@goffi.org>
parents: 98
diff changeset
668 else:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
669 log.error(_('Unmanaged card game element: %s') % elt.name)
825
e3f4d80f987d plugins room_games, radiocol: better synchronization after a user joins a running game
souliane <souliane@mailoo.org>
parents: 811
diff changeset
670
828
8f335c03eebb plugins room_games, radiocol, libervia: small changes like refactorization to ease the maintenance
souliane <souliane@mailoo.org>
parents: 826
diff changeset
671 def getSyncDataForPlayer(self, room_jid_s, nick):
8f335c03eebb plugins room_games, radiocol, libervia: small changes like refactorization to ease the maintenance
souliane <souliane@mailoo.org>
parents: 826
diff changeset
672 return []