Winamax: Bring 90% in line with Forrest.

Still fails 2 regression tests for rake, but that is the fault of DerivedStats - not Winamax
This commit is contained in:
Worros 2010-10-08 14:56:32 +08:00
parent 717c1e61bc
commit 018b806cf3

View File

@ -125,6 +125,7 @@ class Winamax(HandHistoryConverter):
subst = {'PLYR': player_re, 'CUR': self.sym[hand.gametype['currency']]} subst = {'PLYR': player_re, 'CUR': self.sym[hand.gametype['currency']]}
self.re_PostSB = re.compile('%(PLYR)s posts small blind (%(CUR)s)?(?P<SB>[\.0-9]+)(%(CUR)s)?' % subst, re.MULTILINE) self.re_PostSB = re.compile('%(PLYR)s posts small blind (%(CUR)s)?(?P<SB>[\.0-9]+)(%(CUR)s)?' % subst, re.MULTILINE)
self.re_PostBB = re.compile('%(PLYR)s posts big blind (%(CUR)s)?(?P<BB>[\.0-9]+)(%(CUR)s)?' % subst, re.MULTILINE) self.re_PostBB = re.compile('%(PLYR)s posts big blind (%(CUR)s)?(?P<BB>[\.0-9]+)(%(CUR)s)?' % subst, re.MULTILINE)
self.re_DenySB = re.compile('(?P<PNAME>.*) deny SB' % subst, re.MULTILINE)
self.re_Antes = re.compile(r"^%(PLYR)s: posts the ante (%(CUR)s)?(?P<ANTE>[\.0-9]+)(%(CUR)s)?" % subst, re.MULTILINE) self.re_Antes = re.compile(r"^%(PLYR)s: posts the ante (%(CUR)s)?(?P<ANTE>[\.0-9]+)(%(CUR)s)?" % subst, re.MULTILINE)
self.re_BringIn = re.compile(r"^%(PLYR)s: brings[- ]in( low|) for (%(CUR)s)?(?P<BRINGIN>[\.0-9]+(%(CUR)s)?)" % subst, re.MULTILINE) self.re_BringIn = re.compile(r"^%(PLYR)s: brings[- ]in( low|) for (%(CUR)s)?(?P<BRINGIN>[\.0-9]+(%(CUR)s)?)" % subst, re.MULTILINE)
self.re_PostBoth = re.compile('(?P<PNAME>.*): posts small \& big blind \( (%(CUR)s)?(?P<SBBB>[\.0-9]+)(%(CUR)s)?\)' % subst) self.re_PostBoth = re.compile('(?P<PNAME>.*): posts small \& big blind \( (%(CUR)s)?(?P<SBBB>[\.0-9]+)(%(CUR)s)?\)' % subst)
@ -256,11 +257,13 @@ class Winamax(HandHistoryConverter):
hand.setCommunityCards(street, m.group('CARDS').split(' ')) hand.setCommunityCards(street, m.group('CARDS').split(' '))
def readBlinds(self, hand): def readBlinds(self, hand):
if not self.re_DenySB.search(hand.handText):
try:
m = self.re_PostSB.search(hand.handText) m = self.re_PostSB.search(hand.handText)
if m:
hand.addBlind(m.group('PNAME'), 'small blind', m.group('SB')) hand.addBlind(m.group('PNAME'), 'small blind', m.group('SB'))
else: except exceptions.AttributeError: # no small blind
log.warning(_("readBlinds in noSB exception - no SB created")) log.warning( _("readBlinds in noSB exception - no SB created")+str(sys.exc_info()) )
#hand.addBlind(None, None, None)
for a in self.re_PostBB.finditer(hand.handText): for a in self.re_PostBB.finditer(hand.handText):
hand.addBlind(a.group('PNAME'), 'big blind', a.group('BB')) hand.addBlind(a.group('PNAME'), 'big blind', a.group('BB'))
for a in self.re_PostDead.finditer(hand.handText): for a in self.re_PostDead.finditer(hand.handText):
@ -332,25 +335,37 @@ class Winamax(HandHistoryConverter):
# Winamax has unfortunately thinks that a sidepot is created # Winamax has unfortunately thinks that a sidepot is created
# when there is uncalled money in the pot - something that can # when there is uncalled money in the pot - something that can
# only happen when a player is all-in # only happen when a player is all-in
# The first side pot mentioned is always the uncalled money, so we can remove it.
# If there is only 1 collected line, then add it
hand.totalPot()
collectees = []
for m in self.re_CollectPot.finditer(hand.handText):
collectees.append([m.group('PNAME'), m.group('POT')])
# Becuase of this, we need to do the same calculations as class Pot()
# and determine if the amount returned is the same as the amount collected
# if so then the collected line is invalid
total = sum(hand.pot.committed.values()) + sum(hand.pot.common.values())
# Return any uncalled bet.
committed = sorted([ (v,k) for (k,v) in hand.pot.committed.items()]) committed = sorted([ (v,k) for (k,v) in hand.pot.committed.items()])
#print "DEBUG: committed: %s" % committed
#ERROR below. lastbet is correct in most cases, but wrong when
# additional money is committed to the pot in cash games
# due to an additional sb being posted. (Speculate that
# posting sb+bb is also potentially wrong)
returned = {}
lastbet = committed[-1][0] - committed[-2][0] lastbet = committed[-1][0] - committed[-2][0]
if lastbet > 0: # uncalled if lastbet > 0: # uncalled
returnto = committed[-1][1] returnto = committed[-1][1]
#print "DEBUG: returning %f to %s" % (lastbet, returnto)
total -= lastbet
returned[returnto] = lastbet
collectees = []
for m in self.re_CollectPot.finditer(hand.handText):
collectees.append([m.group('PNAME'), m.group('POT')])
for plyr, p in collectees: for plyr, p in collectees:
if plyr == returnto and p == lastbet: if plyr in returned.keys() and Decimal(p) - returned[plyr] == 0:
pass p = Decimal(p) - returned[plyr]
else: if p > 0:
print "DEBUG: addCollectPot(%s, %s)" %(plyr, p)
hand.addCollectPot(player=plyr,pot=p)
else:
for plyr, p in collectees[1:]:
print "DEBUG: addCollectPot(%s,%s)" %(plyr, p) print "DEBUG: addCollectPot(%s,%s)" %(plyr, p)
hand.addCollectPot(player=plyr,pot=p) hand.addCollectPot(player=plyr,pot=p)