incompatibilities - OpenHoldem/openholdembot GitHub Wiki
The original main goal of the OpenHoldem development team was the attempt to create a WinHoldem-compatible botting-platform to support existing bots, DLLs and TableMaps. However there has been functionality such as “Teaming”, that always has been a tabu for the OpenHoldem development team. Other functionality did never get implemented due to lack of documentation and practical relevance. And now that OpenHoldem is far more advanced and WinHoldem is practically dead, backward-compatibility is no longer such an important issue. Recently the development team revisits some features that look a bit mal-designed and tries to improve them carefully, trying to affect the end-user as little as possible. This chapter will tell you about such incompatibilities.
OpenHoldem does not support any kind of collusion. There is no support for WinHoldems WinTellem-server and card-sharing either because such activities are simply illegal in every country of the world, and — even more important — because we consider them unfair too.

Table Maps are in a different format due to hypothetical copyright-issues. For some time it was possible to convert a WinHoldem profile to an OpenHoldem Table Map with OpenScrape. But this is no longer of any practical relevance, as all WinHoldem-”profiles” are supposed to be outdated and there is no longer any maintenance going on. So finally we removed support for WinHoldem-tablemaps completely.
The formula is saved in a single file instead of two. It uses the extension *.ohf instead of *.whf and *.whx. Old WH-formulae could be converted for some time, but as there was no longer any demand for this feature we were happy to simplify OpenHoldems code. OpenHoldem does still use a plain-text-format, so *.ohf-files can be edited using your favourite text-editor. or the built-in formula-editor.
ManualMode is not directly integrated into OpenHoldem, but became a stand-alone application. This did simplify the GUI of OpenHoldem extremely and made it far more easy to use.
Calculating expectation values is only one possible way (out of many) to implement a poker bot, but not necessary in general. Furthermore it proved to be cumbersome and unpopular. So the functions f$evrais and f$evcall from WinHoldems demo-bot have been degraded to user-defined-functions.
The function f$play has been a quite messy concept to handle sitting in, sitting out and leaving the table. Some extra coution was necessary to avoid multiple button-clicks within a short time-frame on identical or outdated game-states. With OpenHoldem 4.0.0 f$play got replaced by three indivudal functions: f$sitin, f$sitout and f$leave, which get executed exactly once every 4 seconds. Furthermore we added a f$close-function to click the [x] in the titlebar of a window if the user desires to leave a table.
f$swag (short for “stated wager”) was WinHoldems way to define the betsize for No-Limit games. As online casinos interpret your input in at least three different ways some adjustment was necessary, including:
f$srai | the desired amount to raise (the part which exceeds the bet of the aggressor) |
---|---|
f$swag | the final amount to be entered into the software |
f$swag_adjust | the casino-specific adjustment between f$srai and f$swag |
swagtextmethod | the casino-specific way to interpret swag, as defined in the tablemap |
sraimin | the smallest possible raise |
sraimax | the largest possible raise. |
sraiprev | the difference between the two largest unique wagers |
All these computations had to be done by the user at the formula level. With OpenHoldem 4.0.0 this mess got replaced by a single function f$betsize and OpenHoldem cares about all the rest automatically (depending on the swagtextmethod specified in your tablemap, but that is all work that’s left). The supporting tablemap symbols got renamed.
Former TM-symbol | New TM-symbol |
---|---|
swagselectionmethod | betsizeselectionmethod |
swagdeletionmethodmethod | betsizedeletionmethodmethod |
swagconfirmationmethod | betsizeconfirmationmethod |
swagtextmethod | betsizeinterpretationmethod |
The symbols to calculate “risk of ruin” have never been implemented due to lack of documentation and lack of practical relevance. As of OpenHoldem 2.0.0 the risk-of-ruin-symbols are officially abolished and removed from the code-base. The original documentation for these symbols can be found here:
-
WinHoldEm Help - Formula Editor (http://www.winholdem.net/help/help-formula.html)
-
WinHoldem-Forum: Risk Of Ruin (http://forum.winholdem.net/wbb/viewtopic.php?t=2120)
OpenHoldem is now half a dozen years old. During these long period of usage it became noticeable that some symbols and features of WinHoldem were unnecessary (risk of ruin), some others unusable, some undocumented (versus2), and some even undesired.
Symbol | Explanation | Reason for removal |
---|---|---|
nfriendsdealt | 1 if you are dealt, 0 otherwise (0-1) | |
1-2 nfriendsblind | 1 if you are in a blind, 0 otherwise (0-1) | |
1-2 friendsseatedbits | bits 9-0: 1=seated 0=unseated, you only | |
1-2 friendsactivebits | bits 9-0: 1=active 0=inactive, you only | |
1-2 friendsdealtbits | bits 9-0: 1=dealt 0=notdealt, you only | |
1-2 friendsplayingbits | bits 9-0: 1=playing 0=notplaying, you only | |
1-2 friendsblindbits | bits 9-0: 1=blind 0=notblind, you only | |
swagdelay | Autoplayer delay in milliseconds between swag keystrokes and button click as defined in Preferences (formerly TableMap) | |
1-2 allidelay | Autoplayer delay in milliseconds between alli slider jam and button click as defined in Preferences (formerly TableMap); | |
allinmethod | used to detrmine which method to use for allin |
OpenHoldem will now automatically chose an appropriate method
This new behaviour tries the most fail-safe and most human-like methods first and in addition reacts flexibly on the options available. |
islistcall | true if your hand is in list 0 | |
1-2 islistrais | true if your hand is in list 1 | |
1-2 islistalli | true if your hand is in list 7 | |
1-2 isemptylistcall | true if the call list is empty | |
1-2 isemptylistrais | true if the rais list is empty | |
1-2 isemptylistalli | true if the alli list is empty | |
1-2 nlistmax | highest list number in which your hand is listed | |
1-2 nlistmin | lowest list number in which your hand is listed | |
handnumber | the site hand number if available |
Removing formula symbol handnumber for various reasons from the formula level:
Handnumber gets now used only internally to trigger handresets. |
isfiveofakind | true when you have a five of a kind | |
1-2 fiveofakind | 0xff000000 (pokerval constant) | |
isppro | true if you’re connected to a ppro server | |
1-2 site | 0=user/ppro 1=scraped | |
bankroll | the user defined, real world bankroll | |
1-2 rake | percentage amount added/subtracted to/from the pot | |
defcon |
defense level is typically used in the f$P formula, which defines the adapted number of opponents to be used in standard prwin. defcon therefore controls the optimism of the prwin-simulation. 0.000=maxoffense 1.000=maxdefense The Formula Editor parameters dialog uses values 0-10 |
|
1-2 isdefmode | true when defcon is at max | |
1-2 isaggmode | true when defcon is at min | |
clocks | number of CPU clocks since the last screen scrape | Useless information and always a fraction of a second |
nclockspersecond | number of CPU clocks per second | |
1-2 ncps | synonym for nclockspersecond | |
nflopc | short for ncommoncardsknow | |
1-2 br | short for betround | |
1-2 ncps | short for nclockspersecond | |
1-2 oppdealt | short for nopponentsdealt | |
isbring | true if OpenHoldem is attached to a Bring client window | |
1-2 ismanual | true if you’re in manual mode, false otherwise | |
handrank | one of the handrank-symbols based on the option specified in preferences | Getting rid of the symbol handrank and the option symbols->Value of Handrank. We have handrank169, handrank1000, handrank1326, handrank2625 and handrankp at the formula level. So the user can clearly specify what he wants. But these symbols can hardly get used interchangeably, so this option was only confusing and superfluos. |
randomround1 ... randomround4 | random number in the range [0.000..1.000) for round 1 - 4. Value is calculated only once in that round. | Removed the symbols randomround1..randomround4 from the codebase, because we have randomround for the current betting round and additionally randomhand, randomheartbeat and random, which gets calculated each time new. This simplified the code and looks more clean. |
callshort | total amount that will be added to the pot if all players call | |
1-2 raisshort | callshort + bet * nplayersplaying | |
seatposition | your seat position relative to the dealer | Removing the symbol seatposition which counted both active and inactive players and even empty chairs and was of no real use for practical play. |
elapsed1970 | time in seconds since 1970-01-01 00:00:00 GMT (Thursday) | Removing the symbol elapsed1970 because there was no real use for it. |
ncommoncardspresent | number of common cards present (normal or highlighted) | Removing the symbol ncommoncardspresent, because it was never implemented correctly, but always had the same value as ncommoncardsknown. Furthermore its value would only differ at some casinos and at showdown (highlighted cards / bad scrapes), but this point of time is pretty meaningless for both OH-script and OpenPPL, which evaluate mainly on the users turn, whereas DLLers still have access to all info. |
ac_pf_bets |
1.1. Only valid when betround == 1 |
Removed the symbols ac_pf_bets, because it was for fixed limit only, worked only on the first orbit preflop, because that task can be done with other symbols and finally we have the OpenPPL-library, so there is really no longer any need for that. |
ac_aggressor | which chair was aggressor (might be from previous round) | Removed, as it was duplicate functionality to raischair |
nplayersblind | number of players blind (including you) (0-10) | |
1-2 nopponentsblind | number of opponents blind (not including you) (0-9) | |
1-2 playersblindbits | bits 9-0: 1=blind 0=not blind | |
1-2 opponentsblindbits | bits 9-0: 1=blind 0=not blind | |
1-2 bblindbits | bits 9-0: 1=big blind 0=not big blind | |
ron$ / run$ symbols | These symbols report the total number of possible river endings for the opponent (ron$) and the user (run$). A value of zero means that type of poker hand is not possible. Any non-zero value means that type of poker hand will be seen that many times | |
1-2 ron$royfl | river opponent number : possible royal flush | |
1-2 ron$strfl | river opponent number : possible straight flush | |
1-2 ron$4kind | river opponent number : possible four of a kind | |
1-2 ron$fullh | river opponent number : possible full house | |
1-2 ron$flush | river opponent number : possible flush | |
1-2 ron$strai | river opponent number : possible straight | |
1-2 ron$3kind | river opponent number : possible three of a kind | |
1-2 ron$2pair | river opponent number : possible two pair | |
1-2 ron$1pair | river opponent number : possible one pair | |
1-2 ron$hcard | river opponent number : possible high card | |
1-2 ron$total | river opponent number : sum of all possible river endings | |
1-2 ron$pokervalmax | the maximum possible pokerval for the opponent | |
1-2 ron$prnuts | opponent chances of hitting the nuts on or before the river | |
1-2 ron$prbest | opponent chances of hitting pokervalmax on or before the river | |
1-2 ron$clocks | total number of cpu clocks used to calculate the ron$ symbols | |
1-2 run$... | similar like the ron$symbols above, just for the user |
Some supporting functions and symbols for the PrWin-simulations got renamed in OpenHoldem 4.0.0 to achieve more verbosity and better formula-grouping in the editor.
Former Name | New Name |
---|---|
f$P | f$prwin_number_of_opponents |
NIT | f$prwin_number_of_iterations |
f$topclip | f$prwin_topclip |
f$mustplay | f$prwin_mustplay |
f$willplay | f$prwin_willplay |
f$wontplay | f$prwin_wontplay |