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:
parent
f335cb60a7
commit
5d458899dc
3 changed files with 92 additions and 17 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue