|
|
|
@ -87,13 +87,17 @@ class UnoPlay(ModuleBase):
|
|
|
|
|
# See if we play first
|
|
|
|
|
if "plays first..." in trailing:
|
|
|
|
|
message = trailing.split("The top card is")[1]
|
|
|
|
|
self.log.debug(">> we play first!")
|
|
|
|
|
self.log.info("we play first!")
|
|
|
|
|
self.current_card = self.parsecard(message)
|
|
|
|
|
self.log.debug(">> top card: %s" % str(self.current_card))
|
|
|
|
|
self.log.debug("top card: %s" % str(self.current_card))
|
|
|
|
|
|
|
|
|
|
if self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
|
|
|
|
|
|
# We need to choose a color
|
|
|
|
|
if "hoose a color %s" % self.bot.get_nick() in trailing:
|
|
|
|
|
self.pickcolor()
|
|
|
|
|
|
|
|
|
|
# See if someone passed to us
|
|
|
|
|
if "passes" in trailing and self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
@ -102,16 +106,17 @@ class UnoPlay(ModuleBase):
|
|
|
|
|
if "continuing with" in trailing and self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
|
|
|
|
|
|
# Parse misc played cards
|
|
|
|
|
# bug
|
|
|
|
|
if " plays " in trailing:
|
|
|
|
|
message = trailing.split(" plays ")[1].split(" ")[0]
|
|
|
|
|
self.current_card = self.parsecard(message)
|
|
|
|
|
self.log.debug(">> current card: %s" % str(self.current_card))
|
|
|
|
|
|
|
|
|
|
# After someone plays to us
|
|
|
|
|
if "to %s" % self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
|
# After color change by bot
|
|
|
|
|
if "Current player " in trailing and "and chooses" in trailing:
|
|
|
|
|
print("BOT WILD")
|
|
|
|
|
color = trailing.split(" and chooses ")[1].split(" Current ")[0].strip()
|
|
|
|
|
self.current_card[2]['color'] = {'Blue': 'b', 'Red': 'r', 'Yellow': 'y', 'Green': 'g'}[color]
|
|
|
|
|
self.current_card[2]['number'] = -1
|
|
|
|
|
self.current_card[2]['type'] = None
|
|
|
|
|
self.log.info("Color changed to %s " % self.current_card[2]['color'])
|
|
|
|
|
if "urrent player %s" % self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# After color change
|
|
|
|
|
if "play continues with " in trailing:
|
|
|
|
@ -119,30 +124,30 @@ class UnoPlay(ModuleBase):
|
|
|
|
|
self.current_card[2]['color'] = {'Blue': 'b', 'Red': 'r', 'Yellow': 'y', 'Green': 'g'}[color]
|
|
|
|
|
self.current_card[2]['number'] = -1
|
|
|
|
|
self.current_card[2]['type'] = None
|
|
|
|
|
self.log.info("Color changed to %s " % self.current_card[2]['color'])
|
|
|
|
|
|
|
|
|
|
self.log.debug("Color changed to %s " % self.current_card[2]['color'])
|
|
|
|
|
|
|
|
|
|
# After color change by bot
|
|
|
|
|
if "Current player " in trailing and "and chooses" in trailing:
|
|
|
|
|
color = trailing.split(" and chooses ")[1].split(" Current ")[0].strip()
|
|
|
|
|
self.current_card[2]['color'] = {'Blue': 'b', 'Red': 'r', 'Yellow': 'y', 'Green': 'g'}[color]
|
|
|
|
|
self.current_card[2]['number'] = -1
|
|
|
|
|
self.current_card[2]['type'] = None
|
|
|
|
|
self.log.debug("Color changed to %s " % self.current_card[2]['color'])
|
|
|
|
|
if "urrent player %s" % self.bot.get_nick() in trailing:
|
|
|
|
|
if self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# Parse misc played cards
|
|
|
|
|
# bug
|
|
|
|
|
if " plays " in trailing and "four cards" not in trailing:
|
|
|
|
|
message = trailing.split(" plays ")[1].split(" ")[0]
|
|
|
|
|
self.current_card = self.parsecard(message)
|
|
|
|
|
self.log.info("current card: %s" % str(self.current_card))
|
|
|
|
|
|
|
|
|
|
# After someone plays to us
|
|
|
|
|
if "to %s" % self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
|
|
|
|
|
|
# After color change to us
|
|
|
|
|
if "play continues with %s" % self.bot.get_nick() in trailing:
|
|
|
|
|
self.shouldgo = True
|
|
|
|
|
|
|
|
|
|
# We need to choose a color
|
|
|
|
|
if "hoose a color %s" % self.bot.get_nick() in trailing:
|
|
|
|
|
self.pickcolor()
|
|
|
|
|
|
|
|
|
|
# Reset
|
|
|
|
|
if " by Marky" in trailing or "cards played in" in trailing:
|
|
|
|
|
self.log.debug(">> Reset")
|
|
|
|
|
self.log.info("System reset")
|
|
|
|
|
self.current_card = None
|
|
|
|
|
self.shouldgo = False
|
|
|
|
|
self.has_drawn = False
|
|
|
|
@ -183,6 +188,8 @@ class UnoPlay(ModuleBase):
|
|
|
|
|
Find all legal permutations starting with the card in play based on our hand. The first card of the chain with
|
|
|
|
|
the highest point sum will be selected for play.
|
|
|
|
|
"""
|
|
|
|
|
start = time.time()
|
|
|
|
|
|
|
|
|
|
def chain_next(cards, chain):
|
|
|
|
|
"""
|
|
|
|
|
Given some cards, (Cards == list of card-like data structures)
|
|
|
|
@ -223,7 +230,9 @@ class UnoPlay(ModuleBase):
|
|
|
|
|
# Where chain is a list of card structs and chain_value is the point value of that chain.
|
|
|
|
|
# The list is sorted by chain_value
|
|
|
|
|
# pprint(chains)
|
|
|
|
|
self.log.info("Cards in hand: {}. Considering {} possible outcomes...".format(len(self.cards), len(chains)))
|
|
|
|
|
end = time.time()
|
|
|
|
|
self.log.info("Cards in hand: {}. Considered {} possible outcomes in {}ms..."
|
|
|
|
|
.format(len(self.cards), len(chains), round((end - start) * 1000, 2)))
|
|
|
|
|
|
|
|
|
|
if not chains:
|
|
|
|
|
return None # No valid moves :(
|
|
|
|
@ -260,7 +269,7 @@ class UnoPlay(ModuleBase):
|
|
|
|
|
mycolors = sorted(mycolors.items(), key=lambda x: x[1])
|
|
|
|
|
mycolors.reverse()
|
|
|
|
|
|
|
|
|
|
self.log.debug("Sorted: %s" % str(mycolors))
|
|
|
|
|
self.log.info("Color pick weights: %s" % str(mycolors))
|
|
|
|
|
|
|
|
|
|
self.sleep("beforepickcolor")
|
|
|
|
|
self.bot.act_PRIVMSG(self.config["unochannel"], "co %s" % mycolors[0][0])
|
|
|
|
@ -288,7 +297,7 @@ class UnoPlay(ModuleBase):
|
|
|
|
|
if self.config["enable_delays"]:
|
|
|
|
|
time.sleep(self.config["randomhuman_sleep"])
|
|
|
|
|
self.sleep("beforemove")
|
|
|
|
|
self.log.debug(">> playing %s" % move[0])
|
|
|
|
|
self.log.debug("playing %s" % move[0])
|
|
|
|
|
self.playcard(move[0])
|
|
|
|
|
|
|
|
|
|
def getbestmove(self):
|
|
|
|
|