plugin card_game: update to use the new XMLUI mechanism:
TODO: the new round is not starting after the scores have been displayed
This commit is contained in:
parent
e8f6c14436
commit
5b3d5a2f42
3 changed files with 71 additions and 36 deletions
|
|
@ -249,6 +249,13 @@ class CardGame(QuickCardGame, urwid.WidgetWrap):
|
|||
|
||||
def newGame(self, hand):
|
||||
"""Start a new game, with given hand"""
|
||||
if hand is []: # reset the display after the scores have been showed
|
||||
self.resetRound()
|
||||
for location in ['top', 'left', 'bottom', 'right']:
|
||||
self.table.putCard(location, None)
|
||||
self.parent.host.redraw()
|
||||
self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile)
|
||||
return
|
||||
QuickCardGame.newGame(self, hand)
|
||||
self.hand_wid.update(self.hand)
|
||||
self.parent.host.redraw()
|
||||
|
|
@ -260,10 +267,9 @@ class CardGame(QuickCardGame, urwid.WidgetWrap):
|
|||
QuickCardGame.contratSelected(self, contrat)
|
||||
|
||||
def chooseContrat(self, xml_data):
|
||||
"""Called when the player as to select his contrat
|
||||
"""Called when the player has to select his contrat
|
||||
@param xml_data: SàT xml representation of the form"""
|
||||
misc = {'callback': self.contratSelected}
|
||||
form = XMLUI(self.parent.host, xml_data, title=_('Please choose your contrat'), options=['NO_CANCEL'], misc=misc)
|
||||
form = XMLUI(self.parent.host, xml_data, title=_('Please choose your contrat'), flags=['NO_CANCEL'])
|
||||
form.show(valign='top')
|
||||
|
||||
def showCards(self, game_stage, cards, data):
|
||||
|
|
@ -276,19 +282,13 @@ class CardGame(QuickCardGame, urwid.WidgetWrap):
|
|||
QuickCardGame.myTurn(self)
|
||||
|
||||
def showScores(self, xml_data, winners, loosers):
|
||||
"""Called when the player as to select hist contrat
|
||||
"""Called when the round is over, display the scores
|
||||
@param xml_data: SàT xml representation of the form"""
|
||||
def _new_game(ignore):
|
||||
self.resetRound()
|
||||
for location in ['top', 'left', 'bottom', 'right']:
|
||||
self.table.putCard(location, None)
|
||||
self.parent.host.redraw()
|
||||
self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile)
|
||||
if not winners and not loosers:
|
||||
title = _("Draw game")
|
||||
else:
|
||||
title = _('You win \o/') if self.player_nick in winners else _('You loose :(')
|
||||
form = XMLUI(self.parent.host, xml_data, title=title, options=['NO_CANCEL'], misc={'callback': _new_game})
|
||||
form = XMLUI(self.parent.host, xml_data, title=title, flags=['NO_CANCEL'])
|
||||
form.show()
|
||||
|
||||
def invalidCards(self, phase, played_cards, invalid_cards):
|
||||
|
|
|
|||
|
|
@ -85,6 +85,11 @@ class CardPanel(QuickCardGame, wx.Panel):
|
|||
|
||||
def newGame(self, hand):
|
||||
"""Start a new game, with given hand"""
|
||||
if hand is []: # reset the display after the scores have been showed
|
||||
self.resetRound()
|
||||
self.Refresh()
|
||||
self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile)
|
||||
return
|
||||
QuickCardGame.newGame(self, hand)
|
||||
self._recalc_ori()
|
||||
self.Refresh()
|
||||
|
|
@ -97,24 +102,18 @@ class CardPanel(QuickCardGame, wx.Panel):
|
|||
QuickCardGame.contratSelected(self, contrat)
|
||||
|
||||
def chooseContrat(self, xml_data):
|
||||
"""Called when the player as to select his contrat
|
||||
"""Called when the player has to select his contrat
|
||||
@param xml_data: SàT xml representation of the form"""
|
||||
misc = {'callback': self.contratSelected}
|
||||
form = XMLUI(self.parent.host, xml_data, title = _('Please choose your contrat'), options = ['NO_CANCEL'], misc = misc)
|
||||
XMLUI(self.parent.host, xml_data, title=_('Please choose your contrat'), flags=['NO_CANCEL'])
|
||||
|
||||
def showScores(self, xml_data, winners, loosers):
|
||||
"""Called when the player as to select hist contrat
|
||||
"""Called when the round is over, display the scores
|
||||
@param xml_data: SàT xml representation of the form"""
|
||||
def _new_game(ignore):
|
||||
self.resetRound()
|
||||
self.Refresh()
|
||||
self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile)
|
||||
|
||||
if not winners and not loosers:
|
||||
title = _("Draw game")
|
||||
else:
|
||||
title = _('You win \o/') if self.player_nick in winners else _('You loose :(')
|
||||
form = XMLUI(self.parent.host, xml_data, title = title, options = ['NO_CANCEL'], misc={'callback':_new_game})
|
||||
XMLUI(self.parent.host, xml_data, title=title, flags=['NO_CANCEL'])
|
||||
|
||||
def cardsPlayed(self, player, cards):
|
||||
"""A card has been played by player"""
|
||||
|
|
|
|||
|
|
@ -21,9 +21,11 @@ from sat.core.i18n import _
|
|||
from logging import debug, info, warning, error
|
||||
from twisted.words.xish import domish
|
||||
from twisted.words.protocols.jabber import jid
|
||||
from twisted.internet import defer
|
||||
from wokkel import data_form
|
||||
|
||||
from sat.tools.xml_tools import dataForm2XMLUI
|
||||
from sat.memory import memory
|
||||
from sat.tools import xml_tools
|
||||
from sat_frontends.tools.games import TarotCard
|
||||
from time import time
|
||||
import random
|
||||
|
|
@ -53,6 +55,7 @@ class Tarot(object):
|
|||
|
||||
def __init__(self, host):
|
||||
info(_("Plugin Tarot initialization"))
|
||||
self._sessions = memory.Sessions()
|
||||
self.inheritFromRoomGame(host)
|
||||
RoomGame._init_(self, host, PLUGIN_INFO, (NS_CG, CG_TAG),
|
||||
game_init={'hand_size': 18, 'init_player': 0, 'current_player': None, 'contrat': None, 'stage': None},
|
||||
|
|
@ -61,7 +64,6 @@ class Tarot(object):
|
|||
host.bridge.addMethod("tarotGameLaunch", ".plugin", in_sign='asss', out_sign='', method=self.prepareRoom) # args: players, room_jid, profile
|
||||
host.bridge.addMethod("tarotGameCreate", ".plugin", in_sign='sass', out_sign='', method=self.createGame) # args: room_jid, players, profile
|
||||
host.bridge.addMethod("tarotGameReady", ".plugin", in_sign='sss', out_sign='', method=self.playerReady) # args: player, referee, profile
|
||||
host.bridge.addMethod("tarotGameContratChoosed", ".plugin", in_sign='ssss', out_sign='', method=self.contratChoosed) # args: player, referee, contrat, profile
|
||||
host.bridge.addMethod("tarotGamePlayCards", ".plugin", in_sign='ssa(ss)s', out_sign='', method=self.play_cards) # args: player, referee, cards, profile
|
||||
host.bridge.addSignal("tarotGamePlayers", ".plugin", signature='ssass') # args: room_jid, referee, players, profile
|
||||
host.bridge.addSignal("tarotGameStarted", ".plugin", signature='ssass') # args: room_jid, referee, players, profile
|
||||
|
|
@ -78,6 +80,9 @@ class Tarot(object):
|
|||
for suit in ["pique", "coeur", "carreau", "trefle"]:
|
||||
for value in map(str, range(1, 11)) + ["valet", "cavalier", "dame", "roi"]:
|
||||
self.deck_ordered.append(TarotCard((suit, value)))
|
||||
self.__choose_contrat_id = host.registerCallback(self._contratChoosed, with_data=True)
|
||||
self.__score_id = host.registerCallback(self._scoreShowed, with_data=True)
|
||||
|
||||
|
||||
def __card_list_to_xml(self, cards_list, elt_name):
|
||||
"""Convert a card list to domish element"""
|
||||
|
|
@ -380,19 +385,46 @@ class Tarot(object):
|
|||
to_jid = jid.JID(room_jid.userhost() + "/" + next_player) # FIXME: gof:
|
||||
self.send(to_jid, 'your_turn', profile=profile)
|
||||
|
||||
def contratChoosed(self, player, referee, contrat, profile_key='@NONE@'):
|
||||
"""Must be call by player when the contrat is selected
|
||||
@param player: player's name
|
||||
@param referee: arbiter jid
|
||||
@contrat: contrat choosed (must be the exact same string than in the give list options)
|
||||
@profile_key: profile
|
||||
def _contratChoosed(self, raw_data, profile):
|
||||
"""Will be called when the contrat is selected
|
||||
@param raw_data: contains the choosed session id and the chosen contrat
|
||||
@param profile_key: profile
|
||||
"""
|
||||
profile = self.host.memory.getProfileName(profile_key)
|
||||
if not profile:
|
||||
error(_("profile %s is unknown") % profile_key)
|
||||
return
|
||||
try:
|
||||
session_data = self._sessions.profileGet(raw_data["session_id"], profile)
|
||||
except KeyError:
|
||||
warning(_("session id doesn't exist, session has probably expired"))
|
||||
# TODO: send error dialog
|
||||
return defer.succeed({})
|
||||
|
||||
room_jid_s = session_data['room_jid'].userhost()
|
||||
referee = self.games[room_jid_s]['referee']
|
||||
player = self.host.plugins["XEP-0045"].getRoomNick(room_jid_s, profile)
|
||||
data = xml_tools.XMLUIResult2DataFormResult(raw_data)
|
||||
contrat = data['contrat']
|
||||
debug(_('contrat [%(contrat)s] choosed by %(profile)s') % {'contrat': contrat, 'profile': profile})
|
||||
self.send(jid.JID(referee), ('', 'contrat_choosed'), {'player': player}, content=contrat, profile=profile)
|
||||
d = self.send(jid.JID(referee), ('', 'contrat_choosed'), {'player': player}, content=contrat, profile=profile)
|
||||
d.addCallback(lambda ignore: {})
|
||||
del self._sessions[raw_data["session_id"]]
|
||||
return d
|
||||
|
||||
def _scoreShowed(self, raw_data, profile):
|
||||
"""Will be called when the player closes the score dialog
|
||||
@param raw_data: nothing to retrieve from here but the session id
|
||||
@param profile_key: profile
|
||||
"""
|
||||
try:
|
||||
session_data = self._sessions.profileGet(raw_data["session_id"], profile)
|
||||
except KeyError:
|
||||
warning(_("session id doesn't exist, session has probably expired"))
|
||||
# TODO: send error dialog
|
||||
return defer.succeed({})
|
||||
|
||||
room_jid_s = session_data['room_jid'].userhost()
|
||||
# XXX: empty hand means to the frontend "reset the display"...
|
||||
self.host.bridge.tarotGameNew(room_jid_s, [], profile)
|
||||
del self._sessions[raw_data["session_id"]]
|
||||
return defer.succeed({})
|
||||
|
||||
def play_cards(self, player, referee, cards, profile_key='@NONE@'):
|
||||
"""Must be call by player when the contrat is selected
|
||||
|
|
@ -480,7 +512,9 @@ class Tarot(object):
|
|||
|
||||
elif elt.name == 'contrat': # it's time to choose contrat
|
||||
form = data_form.Form.fromElement(elt.firstChildElement())
|
||||
xml_data = dataForm2XMLUI(form, "").toXml()
|
||||
session_id, session_data = self._sessions.newSession(profile=profile)
|
||||
session_data["room_jid"] = room_jid
|
||||
xml_data = xml_tools.dataForm2XMLUI(form, self.__choose_contrat_id, session_id).toXml()
|
||||
self.host.bridge.tarotGameChooseContrat(room_jid.userhost(), xml_data, profile)
|
||||
|
||||
elif elt.name == 'contrat_choosed':
|
||||
|
|
@ -619,7 +653,9 @@ class Tarot(object):
|
|||
for looser in elt.elements(name='looser', uri=NS_CG):
|
||||
loosers.append(unicode(looser))
|
||||
form = data_form.Form.fromElement(form_elt)
|
||||
xml_data = dataForm2XMLUI(form, "").toXml()
|
||||
session_id, session_data = self._sessions.newSession(profile=profile)
|
||||
session_data["room_jid"] = room_jid
|
||||
xml_data = xml_tools.dataForm2XMLUI(form, self.__score_id, session_id).toXml()
|
||||
self.host.bridge.tarotGameScore(room_jid.userhost(), xml_data, winners, loosers, profile)
|
||||
elif elt.name == 'error':
|
||||
if elt['type'] == 'invalid_cards':
|
||||
|
|
|
|||
Loading…
Reference in a new issue