Rationalized hole card format for flop games.
Also updated writehand() so flop hands are written OK. This breaks stud and draw--fixing them now.
This commit is contained in:
parent
e294314e25
commit
3234f89aad
|
@ -138,6 +138,29 @@ class Hand:
|
||||||
str = str + "\n%s =\n" % name + pprint.pformat(struct, 4)
|
str = str + "\n%s =\n" % name + pprint.pformat(struct, 4)
|
||||||
return str
|
return str
|
||||||
|
|
||||||
|
def addHoleCards(self, street, player, open=[], closed=[], shown=False, mucked=False, dealt=False):
|
||||||
|
"""\
|
||||||
|
Assigns observed holecards to a player.
|
||||||
|
cards list of card bigrams e.g. ['2h','Jc']
|
||||||
|
player (string) name of player
|
||||||
|
shown whether they were revealed at showdown
|
||||||
|
mucked whether they were mucked at showdown
|
||||||
|
dealt whether they were seen in a 'dealt to' line
|
||||||
|
"""
|
||||||
|
logging.debug("addHoleCards %s %s" % (open + closed, player))
|
||||||
|
try:
|
||||||
|
self.checkPlayerExists(player)
|
||||||
|
except FpdbParseError, e:
|
||||||
|
print "[ERROR] Tried to add holecards for unknown player: %s" % (player,)
|
||||||
|
return
|
||||||
|
|
||||||
|
if dealt: self.dealt.add(player)
|
||||||
|
if shown: self.shown.add(player)
|
||||||
|
if mucked: self.mucked.add(player)
|
||||||
|
|
||||||
|
print "stuff =", street, player, open, closed
|
||||||
|
self.holecards[street][player] = [open, closed]
|
||||||
|
|
||||||
def insert(self, db):
|
def insert(self, db):
|
||||||
""" Function to insert Hand into database
|
""" Function to insert Hand into database
|
||||||
Should not commit, and do minimal selects. Callers may want to cache commits
|
Should not commit, and do minimal selects. Callers may want to cache commits
|
||||||
|
@ -559,35 +582,13 @@ class HoldemOmahaHand(Hand):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def addHoleCards(self, cards, player, shown, mucked, dealt=False):
|
def addShownCards(self, cards, player, shown=True, mucked=False, dealt=False):
|
||||||
"""\
|
if player == self.hero: # we have hero's cards just update shown/mucked
|
||||||
Assigns observed holecards to a player.
|
if shown: self.shown.add(player)
|
||||||
cards list of card bigrams e.g. ['2h','Jc']
|
if mucked: self.mucked.add(player)
|
||||||
player (string) name of player
|
|
||||||
shown whether they were revealed at showdown
|
|
||||||
mucked whether they were mucked at showdown
|
|
||||||
dealt whether they were seen in a 'dealt to' line
|
|
||||||
"""
|
|
||||||
logging.debug("addHoleCards %s %s" % (cards, player))
|
|
||||||
try:
|
|
||||||
self.checkPlayerExists(player)
|
|
||||||
except FpdbParseError, e:
|
|
||||||
print "[ERROR] Tried to add holecards for unknown player: %s" % (player,)
|
|
||||||
return
|
|
||||||
|
|
||||||
cardset = set((self.card(c) for c in cards))
|
|
||||||
if len(cardset) == 0:
|
|
||||||
return
|
|
||||||
if dealt:
|
|
||||||
self.dealt.add(player)
|
|
||||||
if shown:
|
|
||||||
self.shown.add(player)
|
|
||||||
if mucked:
|
|
||||||
self.mucked.add(player)
|
|
||||||
if player in self.holecards['PREFLOP']:
|
|
||||||
self.holecards['PREFLOP'][player].update(cardset)
|
|
||||||
else:
|
else:
|
||||||
self.holecards['PREFLOP'][player] = cardset
|
self.addHoleCards('PREFLOP', player, open=[], closed=cards, shown=shown, mucked=mucked, dealt=dealt)
|
||||||
|
|
||||||
|
|
||||||
def writeHTMLHand(self, fh=sys.__stdout__):
|
def writeHTMLHand(self, fh=sys.__stdout__):
|
||||||
from nevow import tags as T
|
from nevow import tags as T
|
||||||
|
@ -701,10 +702,10 @@ dealt whether they were seen in a 'dealt to' line
|
||||||
|
|
||||||
print >>fh, ("*** HOLE CARDS ***")
|
print >>fh, ("*** HOLE CARDS ***")
|
||||||
for player in self.dealt:
|
for player in self.dealt:
|
||||||
print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player])))
|
print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player][1])))
|
||||||
if self.hero == "":
|
if self.hero == "":
|
||||||
for player in self.shown.difference(self.dealt):
|
for player in self.shown.difference(self.dealt):
|
||||||
print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player])))
|
print >>fh, ("Dealt to %s [%s]" %(player, " ".join(self.holecards['PREFLOP'][player][1])))
|
||||||
|
|
||||||
if self.actions['PREFLOP']:
|
if self.actions['PREFLOP']:
|
||||||
for act in self.actions['PREFLOP']:
|
for act in self.actions['PREFLOP']:
|
||||||
|
@ -743,7 +744,7 @@ dealt whether they were seen in a 'dealt to' line
|
||||||
elif self.gametype['category'] in ('holdem'):
|
elif self.gametype['category'] in ('holdem'):
|
||||||
numOfHoleCardsNeeded = 2
|
numOfHoleCardsNeeded = 2
|
||||||
if len(self.holecards['PREFLOP'][name]) == numOfHoleCardsNeeded:
|
if len(self.holecards['PREFLOP'][name]) == numOfHoleCardsNeeded:
|
||||||
print >>fh, ("%s shows [%s] (a hand...)" % (name, " ".join(self.holecards['PREFLOP'][name])))
|
print >>fh, ("%s shows [%s] (a hand...)" % (name, " ".join(self.holecards['PREFLOP'][name][1])))
|
||||||
|
|
||||||
# Current PS format has the lines:
|
# Current PS format has the lines:
|
||||||
# Uncalled bet ($111.25) returned to s0rrow
|
# Uncalled bet ($111.25) returned to s0rrow
|
||||||
|
@ -770,7 +771,7 @@ dealt whether they were seen in a 'dealt to' line
|
||||||
seatnum = player[0]
|
seatnum = player[0]
|
||||||
name = player[1]
|
name = player[1]
|
||||||
if name in self.collectees and name in self.shown:
|
if name in self.collectees and name in self.shown:
|
||||||
print >>fh, ("Seat %d: %s showed [%s] and won ($%s)" % (seatnum, name, " ".join(self.holecards['PREFLOP'][name]), self.collectees[name]))
|
print >>fh, ("Seat %d: %s showed [%s] and won ($%s)" % (seatnum, name, " ".join(self.holecards['PREFLOP'][name][1]), self.collectees[name]))
|
||||||
elif name in self.collectees:
|
elif name in self.collectees:
|
||||||
print >>fh, ("Seat %d: %s collected ($%s)" % (seatnum, name, self.collectees[name]))
|
print >>fh, ("Seat %d: %s collected ($%s)" % (seatnum, name, self.collectees[name]))
|
||||||
#~ elif name in self.shown:
|
#~ elif name in self.shown:
|
||||||
|
@ -779,9 +780,9 @@ dealt whether they were seen in a 'dealt to' line
|
||||||
print >>fh, ("Seat %d: %s folded" % (seatnum, name))
|
print >>fh, ("Seat %d: %s folded" % (seatnum, name))
|
||||||
else:
|
else:
|
||||||
if name in self.shown:
|
if name in self.shown:
|
||||||
print >>fh, ("Seat %d: %s showed [%s] and lost with..." % (seatnum, name, " ".join(self.holecards['PREFLOP'][name])))
|
print >>fh, ("Seat %d: %s showed [%s] and lost with..." % (seatnum, name, " ".join(self.holecards['PREFLOP'][name][1])))
|
||||||
elif name in self.mucked:
|
elif name in self.mucked:
|
||||||
print >>fh, ("Seat %d: %s mucked [%s] " % (seatnum, name, " ".join(self.holecards['PREFLOP'][name])))
|
print >>fh, ("Seat %d: %s mucked [%s] " % (seatnum, name, " ".join(self.holecards['PREFLOP'][name][1])))
|
||||||
else:
|
else:
|
||||||
print >>fh, ("Seat %d: %s mucked" % (seatnum, name))
|
print >>fh, ("Seat %d: %s mucked" % (seatnum, name))
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,7 @@ follow : whether to tail -f the input"""
|
||||||
self.re_BringIn = re.compile(r"^%s: brings[- ]in( low|) for \$?(?P<BRINGIN>[.0-9]+)" % player_re, re.MULTILINE)
|
self.re_BringIn = re.compile(r"^%s: brings[- ]in( low|) for \$?(?P<BRINGIN>[.0-9]+)" % player_re, re.MULTILINE)
|
||||||
self.re_PostBoth = re.compile(r"^%s: posts small \& big blinds \[\$? (?P<SBBB>[.0-9]+)" % player_re, re.MULTILINE)
|
self.re_PostBoth = re.compile(r"^%s: posts small \& big blinds \[\$? (?P<SBBB>[.0-9]+)" % player_re, re.MULTILINE)
|
||||||
self.re_HeroCards = re.compile(r"^Dealt to %s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % player_re, re.MULTILINE)
|
self.re_HeroCards = re.compile(r"^Dealt to %s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % player_re, re.MULTILINE)
|
||||||
|
# self.re_DealToCards = re.compile(r"^Dealt to %s(?: \[(?P<OLDCARDS>.+?)\])?( \[(?P<NEWCARDS>.+?)\])" % player_re, re.MULTILINE)
|
||||||
# self.re_Action = re.compile(r"^%s:(?P<ATYPE> bets| checks| raises| calls| folds| discards| stands pat)( \$?(?P<BET>[.\d]+))?( to \$?(?P<BETTO>[.\d]+))?( (?P<NODISCARDED>\d) cards?( \[(?P<DISCARDED>.+?)\])?)?" % player_re, re.MULTILINE)
|
# self.re_Action = re.compile(r"^%s:(?P<ATYPE> bets| checks| raises| calls| folds| discards| stands pat)( \$?(?P<BET>[.\d]+))?( to \$?(?P<BETTO>[.\d]+))?( (?P<NODISCARDED>\d) cards?( \[(?P<DISCARDED>.+?)\])?)?" % player_re, re.MULTILINE)
|
||||||
self.re_Action = re.compile(r"""^%s:(?P<ATYPE>\sbets|\schecks|\sraises|\scalls|\sfolds|\sdiscards|\sstands\spat)
|
self.re_Action = re.compile(r"""^%s:(?P<ATYPE>\sbets|\schecks|\sraises|\scalls|\sfolds|\sdiscards|\sstands\spat)
|
||||||
(\s\$?(?P<BET>[.\d]+))?(\sto\s\$?(?P<BETTO>[.\d]+))? # the number discarded goes in <BET>
|
(\s\$?(?P<BET>[.\d]+))?(\sto\s\$?(?P<BETTO>[.\d]+))? # the number discarded goes in <BET>
|
||||||
|
@ -265,18 +266,41 @@ follow : whether to tail -f the input"""
|
||||||
for a in self.re_PostBoth.finditer(hand.handText):
|
for a in self.re_PostBoth.finditer(hand.handText):
|
||||||
hand.addBlind(a.group('PNAME'), 'both', a.group('SBBB'))
|
hand.addBlind(a.group('PNAME'), 'both', a.group('SBBB'))
|
||||||
|
|
||||||
|
# def readHeroCards(self, hand):
|
||||||
|
# m = self.re_HeroCards.search(hand.handText)
|
||||||
|
# if(m == None):
|
||||||
|
# #Not involved in hand
|
||||||
|
# hand.involved = False
|
||||||
|
# else:
|
||||||
|
# hand.hero = m.group('PNAME')
|
||||||
|
# # "2c, qh" -> set(["2c","qc"])
|
||||||
|
# # Also works with Omaha hands.
|
||||||
|
# cards = m.group('NEWCARDS')
|
||||||
|
# cards = set(cards.split(' '))
|
||||||
|
# hand.addHoleCards(cards, m.group('PNAME'), shown=False, mucked=False, dealt=True)
|
||||||
|
|
||||||
def readHeroCards(self, hand):
|
def readHeroCards(self, hand):
|
||||||
m = self.re_HeroCards.search(hand.handText)
|
# streets PREFLOP, PREDRAW, and THIRD are special cases
|
||||||
if(m == None):
|
for street in ('PREFLOP', 'PREDRAW'):
|
||||||
#Not involved in hand
|
if street in hand.streets.keys():
|
||||||
|
print "text =", hand.streets[street]
|
||||||
|
m = self.re_HeroCards.search(hand.streets[street])
|
||||||
|
if m == None:
|
||||||
hand.involved = False
|
hand.involved = False
|
||||||
else:
|
else:
|
||||||
hand.hero = m.group('PNAME')
|
hand.hero = m.group('PNAME')
|
||||||
# "2c, qh" -> set(["2c","qc"])
|
newcards = m.group('NEWCARDS').split(' ')
|
||||||
# Also works with Omaha hands.
|
hand.addHoleCards(street, hand.hero, closed=newcards, shown=False, mucked=False, dealt=True)
|
||||||
cards = m.group('NEWCARDS')
|
|
||||||
cards = set(cards.split(' '))
|
# def readHeroCards(self, hand):
|
||||||
hand.addHoleCards(cards, m.group('PNAME'), shown=False, mucked=False, dealt=True)
|
# for street, text in hand.streets.iteritems():
|
||||||
|
# m = self.re_HeroCards.search(hand.handText)
|
||||||
|
# if(m == None):
|
||||||
|
# #Not involved in hand
|
||||||
|
# hand.involved = False
|
||||||
|
# else:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def readDrawCards(self, hand, street):
|
def readDrawCards(self, hand, street):
|
||||||
logging.debug("readDrawCards")
|
logging.debug("readDrawCards")
|
||||||
|
@ -357,9 +381,9 @@ follow : whether to tail -f the input"""
|
||||||
|
|
||||||
|
|
||||||
def readShowdownActions(self, hand):
|
def readShowdownActions(self, hand):
|
||||||
|
# TODO: pick up mucks also
|
||||||
for shows in self.re_ShowdownAction.finditer(hand.handText):
|
for shows in self.re_ShowdownAction.finditer(hand.handText):
|
||||||
cards = shows.group('CARDS')
|
cards = shows.group('CARDS').split(' ')
|
||||||
cards = set(cards.split(' '))
|
|
||||||
hand.addShownCards(cards, shows.group('PNAME'))
|
hand.addShownCards(cards, shows.group('PNAME'))
|
||||||
|
|
||||||
def readCollectPot(self,hand):
|
def readCollectPot(self,hand):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user