Tarot game

- Tarot plugin: game session start, first draft
- wix: Tarot: names of players are now printed
- wix: Tarot: game session start first draft
- wix : Tarot: card can be compared and sorted
This commit is contained in:
Goffi 2010-05-11 23:58:32 +09:30
commit 5d458899dc
3 changed files with 92 additions and 17 deletions

View file

@ -47,6 +47,7 @@ class QuickApp():
self.bridge.register("roomUserLeft", self.roomUserLeft)
self.bridge.register("roomNewSubject", self.roomNewSubject)
self.bridge.register("tarotGameStarted", self.tarotGameStarted)
self.bridge.register("tarotGameNew", self.tarotGameNew)
self.bridge.register("subscribe", self.subscribe)
self.bridge.register("paramUpdate", self.paramUpdate)
self.bridge.register("contactDeleted", self.contactDeleted)
@ -250,15 +251,23 @@ class QuickApp():
def tarotGameStarted(self, room_jid, players, profile):
if not self.__check_profile(profile):
return
print "Tarot Game Started \o/"
debug (_("Tarot Game Started \o/"))
if self.chat_wins.has_key(room_jid):
self.chat_wins[room_jid].startGame("Tarot")
debug (_("new Tarot game started in room [%(room_jid)s]") % {'room_jid':room_jid})
self.chat_wins[room_jid].startGame("Tarot", players)
debug (_("new Tarot game started in room [%(room_jid)s] with %(players)s") % {'room_jid':room_jid, 'players':[str(player) for player in players]})
def tarotGameNew(self, room_jid, hand, profile):
if not self.__check_profile(profile):
return
debug (_("New Tarot Game"))
print "hand:", hand
if self.chat_wins.has_key(room_jid):
self.chat_wins[room_jid].getGame("Tarot").newGame(hand)
def subscribe(self, type, raw_jid, profile):
"""Called when a subsciption maangement signal is received"""
"""Called when a subsciption management signal is received"""
if not self.__check_profile(profile):
return
entity = JID(raw_jid)

View file

@ -23,7 +23,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import wx
import os.path, glob
import random
import pdb
from logging import debug, info, error
from tools.jid import JID
@ -35,6 +34,9 @@ CARD_HEIGHT = 136
MIN_WIDTH = 950 #Minimum size of the panel
MIN_HEIGHT = 500
families_order = ['pique', 'coeur', 'trefle', 'carreau', 'atout'] #I have swith the usual order 'trefle' and 'carreau' because card are more easy to see if couleur change (black, red, black, red)
values_order = map(str,range(1,11))+["valet","cavalier","dame","roi"]
class Card():
"""This class is used to represent a card, graphically and logically"""
@ -47,6 +49,28 @@ class Card():
print "Carte:",self.family, self.value, self.bout
def __cmp__(self, other):
if other == None:
return 1
if self.family != other.family:
idx1 = families_order.index(self.family)
idx2 = families_order.index(other.family)
return idx1.__cmp__(idx2)
if self.family == 'atout':
if self.value == other.value == 'excuse':
return 0
if self.value == 'excuse':
return -1
if other.value == 'excuse':
return 1
return int(self.value).__cmp__(int(other.value))
#at this point we have the same family which is not 'atout'
idx1 = values_order.index(self.value)
idx2 = values_order.index(other.value)
return idx1.__cmp__(idx2)
def __str__(self):
return "[%s,%s]" % (self.family, self.value)
def draw(self, dc, x, y):
"""Draw the card on the device context
@ -59,14 +83,25 @@ class Card():
class CardPanel(wx.Panel):
"""This class is used to display the cards"""
def __init__(self, parent):
def __init__(self, parent, players, user):
wx.Panel.__init__(self, parent)
self.players = players
self.user = user
self.bottom_nick = self.user
idx = self.players.index(self.user)
idx = (idx + 1) % len(self.players)
self.right_nick = self.players[idx]
idx = (idx + 1) % len(self.players)
self.top_nick = self.players[idx]
idx = (idx + 1) % len(self.players)
self.left_nick = self.players[idx]
self.SetMinSize(wx.Size(MIN_WIDTH, MIN_HEIGHT))
self.load_cards("/home/goffi/dev/divers/images/cards/")
self.selected = None #contain the card to highlight
self.hand_size = 13 #number of cards in a hand
self.visible_size = CARD_WIDTH/2 #number of pixels visible for cards
self.hand = random.sample(self.deck, self.hand_size)
self.hand = []
self.my_turn = False
self.SetBackgroundColour(wx.GREEN)
self.Bind(wx.EVT_SIZE, self.onResize)
self.Bind(wx.EVT_PAINT, self.onPaint)
@ -93,6 +128,14 @@ class CardPanel(wx.Panel):
for value in map(str,range(1,11))+["valet","cavalier","dame","roi"]:
self.idx_cards.append(self.cards[family, value])""" #XXX: no need to sort the cards !
def newGame(self, hand):
"""Start a new game, with given hand"""
assert (len(self.hand) == 0)
for family, value in hand:
self.hand.append(self.cards[family, value])
self.hand.sort()
self.my_turn = True
def _is_on_hand(self, pos_x, pos_y):
"""Return True if the coordinate are on the hand cards"""
if pos_x > self.orig_x and pos_y > self.orig_y \
@ -112,9 +155,24 @@ class CardPanel(wx.Panel):
def onPaint(self, event):
dc = wx.PaintDC(self)
#We print the names to know who play where TODO: print avatars when available
max_x, max_y = self.GetSize()
border = 10 #border between nick and end of panel
right_y = left_y = 200
right_width, right_height = dc.GetTextExtent(self.right_nick)
right_x = max_x - right_width - border
left_x = border
top_width, top_height = dc.GetTextExtent(self.top_nick)
top_x = (max_x - top_width) / 2
top_y = border
dc.DrawText(self.right_nick, right_x, right_y)
dc.DrawText(self.top_nick, top_x, top_y)
dc.DrawText(self.left_nick, left_x, left_y)
x=self.orig_x
for card in self.hand:
card.draw(dc,x,self.orig_y - 30 if card == self.selected else self.orig_y)
card.draw(dc,x,self.orig_y - 30 if self.my_turn and card == self.selected else self.orig_y)
x+=self.visible_size
def onMouseMove(self, event):

View file

@ -108,15 +108,21 @@ class Chat(wx.Frame, QuickChat):
self.__createMenus_O2O()
self.historyPrint(profile=self.host.profile)
def startGame(self, game_type):
def startGame(self, game_type, players):
"""Configure the chat window to start a game"""
if game_type=="Tarot":
debug (_("configure chat window for Tarot game"))
tarot_panel = CardPanel(self)
self.sizer.Prepend(tarot_panel, 0, flag=wx.EXPAND)
self.tarot_panel = CardPanel(self, players, self.nick)
self.sizer.Prepend(self.tarot_panel, 0, flag=wx.EXPAND)
self.sizer.Layout()
self.Fit()
def getGame(self, game_type):
"""Return class managing the game type"""
#TODO: check that the game is launched, and manage errors
if game_type=="Tarot":
return self.tarot_panel
def setPresents(self, nicks):
"""Set the users presents in the contact list for a group chat
@ -128,8 +134,7 @@ class Chat(wx.Frame, QuickChat):
return
for nick in nicks:
self.present_panel.presents.replace(nick)
if nick != self.nick:
self.occupants.add(nick)
self.occupants.add(nick)
def replaceUser(self, nick):
@ -139,8 +144,7 @@ class Chat(wx.Frame, QuickChat):
error (_("[INTERNAL] trying to replace user for a non group chat window"))
return
self.present_panel.presents.replace(nick)
if nick != self.nick:
self.occupants.add(nick)
self.occupants.add(nick)
def removeUser(self, nick):
"""Remove a user from the group list"""
@ -240,4 +244,8 @@ class Chat(wx.Frame, QuickChat):
def onStartTarot(self, e):
debug (_("Starting Tarot game"))
warning (_("FIXME: temporary menu, must be changed"))
self.host.bridge.createTarotGame(self.id, list(self.occupants), self.host.profile)
if len(self.occupants) != 4:
err_dlg = wx.MessageDialog(self, _("You need to be exactly 4 peoples in the room to start a Tarot game"), _("Can't start game"), style = wx.OK | wx.ICON_ERROR) #FIXME: gof: temporary only, need to choose the people with who the game has to be started
err_dlg.ShowModal()
else:
self.host.bridge.createTarotGame(self.id, list(self.occupants), self.host.profile)