def DetectTurns(logMessage): global fieldCardsInfo tagChangeEntityData = re.search( "TAG_CHANGE Entity=(.+?) tag=STEP value=(.+?) \n", logMessage) if tagChangeEntityData != None: LogManager.PrintLog( "TagChangeEntityObserver", "DetectTurns", "entity: " + tagChangeEntityData.group(1) + " value: " + tagChangeEntityData.group(2), DefineManager.LOG_LEVEL_INFO) if tagChangeEntityData.group(2) == "MAIN_READY": fieldCardsInfo = {} LogManager.PrintLog("TagChangeEntityObserver", "DetectTurns", "Print field status", DefineManager.LOG_LEVEL_INFO) elif tagChangeEntityData.group(2) == "MAIN_START": AdvancedPrintManager.PrintFieldStatus(fieldCardsInfo) FieldObserver.FieldMainObserver(fieldCardsInfo) LogManager.PrintLog("TagChangeEntityObserver", "DetectTurns", "MAIN_START_TRIGGERS", DefineManager.LOG_LEVEL_INFO) else: LogManager.PrintLog("TagChangeEntityObserver", "DetectTurns", "not rdy tag value", DefineManager.LOG_LEVEL_WARN) else: return
def CheckHideEntity(logMessage): foundedEntityGroup = re.search(" HIDE_ENTITY - Entity=(.+?) tag=(.+?) value=(.+?)\n", logMessage) if foundedEntityGroup != None: hideEntityData = [foundedEntityGroup.group(1), foundedEntityGroup.group(2), foundedEntityGroup.group(3)] # LogManager.PrintLog("HideEntityObserver", "CheckHideEntity", "entity: " + hideEntityData[0] + " tag: " + hideEntityData[1] + " value: " + hideEntityData[2], DefineManager.LOG_LEVEL_INFO) hideEntityDetail = re.search("name=(.+?) id=(.+?) zone=(.+?) zonePos=(.+?) cardId=(.+?) player=(.+?)]", hideEntityData[0]) if hideEntityDetail != None: hideEntityData[0] = [hideEntityDetail.group(1), hideEntityDetail.group(2), hideEntityDetail.group(3), hideEntityDetail.group(4), hideEntityDetail.group(5), hideEntityDetail.group(6)] # LogManager.PrintLog("HideEntityObserver", "CheckHideEntity", # "entity: " + hideEntityData[0] + " tag: " + hideEntityData[1] + " value: " + # hideEntityData[2], DefineManager.LOG_LEVEL_INFO) LogManager.PrintLog("HideEntityObserver", "CheckHideEntity", "entity: " + " ".join(hideEntityData[0]) + " tag: " + hideEntityData[1] + " value: " + hideEntityData[2], DefineManager.LOG_LEVEL_INFO) if hideEntityData[1] == "ZONE": LogManager.PrintLog("HideEntityObserver", "CheckHideEntity", "Card state " + hideEntityData[0][2] + " -> " + hideEntityData[2], DefineManager.LOG_LEVEL_INFO) return hideEntityData else: LogManager.PrintLog("HideEntityObserver", "CheckHideEntity", "Unkown tag", DefineManager.LOG_LEVEL_WARN) return None else: LogManager.PrintLog("HideEntityObserver", "CheckHideEntity", "wrong entity accepted", DefineManager.LOG_LEVEL_WARN) return None
def ParseFieldStatus(fieldData): fieldStatusPlayer1 = ["", "", "", "", "", "", "", ""] fieldStatusPlayer2 = ["", "", "", "", "", "", "", ""] fieldPrintFormat = "{0:>10} |{1:>10} |{2:>10} |{3:>10} |{4:>10} |{5:>10} |{6:>10} |{7:>10} |" for indexOfFieldNumber, indexOfCard in fieldData.iteritems(): if indexOfCard[0][3] != 0: playerNumber = int( indexOfCard[0][DefineManager.PLAYER_NUMBER_SAVED_POINT]) zonePosition = int(indexOfCard[0][3]) if playerNumber == 1: fieldStatusPlayer1[zonePosition] = indexOfCard[0][4] elif playerNumber == 2: fieldStatusPlayer2[zonePosition] = indexOfCard[0][4] else: LogManager.PrintLog("FieldObserver", "ParseFieldStatus", "unknown player", DefineManager.LOG_LEVEL_WARN) fieldOfPlayer1 = fieldPrintFormat.format(*fieldStatusPlayer1) fieldOfPlayer2 = fieldPrintFormat.format(*fieldStatusPlayer2) LogManager.PrintLog("FieldObserver", "ParseFieldStatus", "player1: " + fieldOfPlayer1, DefineManager.LOG_LEVEL_INFO) LogManager.PrintLog("FieldObserver", "ParseFieldStatus", "player2: " + fieldOfPlayer2, DefineManager.LOG_LEVEL_INFO) return [fieldStatusPlayer1, fieldStatusPlayer2]
def StaticLoader(targetFilePath = DefineManager.DEFAULT_LOG_FILE_SAVED_PATH): LogManager.PrintLog("FileIO", "StaticLoader", "Load file path: " + targetFilePath, DefineManager.LOG_LEVEL_INFO) hearthStoneLogFile = open(targetFilePath) DeckObserver.GameObservingInit() while True: logMessage = hearthStoneLogFile.readline() # if ExceptionManager.DetectOutOfLog(logMessage): # DirectoryManager.FindLatestLogFile() # DirectoryManager.MakeNewDirectory(DefineManager.DEFAULT_HEARTH_STONE_LOG_FILES_PATH, "test") # DirectoryManager.MoveFileToDirectory(DefineManager.DEFAULT_HEARTH_STONE_LOG_FILES_PATH, # "hearthstone_2017_07_17_11_17_09.log", # "hearthstone_2017_07_17_11_17_09") if not logMessage: LogManager.PrintLog("FileIO", "StaticLoader", "File read process ended", DefineManager.LOG_LEVEL_INFO) break else: # LogManager.PrintLog("FileIO", "StaticLoader", logMessage, DefineManager.LOG_LEVEL_INFO) # DeckObserver.IsShowEntityModeStartPoint(logMessage) DeckObserver.ParseShowEntity(logMessage, targetFilePath)
def IsShowEntityModeStartPoint(logMessage): global indexOfCardInfo if GetIsShowEntityMode() == False: searchedLogMessage = re.search( "SHOW_ENTITY - Updating Entity=(.+?) CardID=(.+?)\n", logMessage) if searchedLogMessage != None: # LogManager.PrintLog("ShowEntityObserver", "IsShowEntityModeStartPoint", "entity detail: " + foundedEntityDetailResult[0], DefineManager.LOG_LEVEL_INFO) SetIsShowEntityMode(True) foundedResult = [ searchedLogMessage.group(1), searchedLogMessage.group(2) ] LogManager.PrintLog( "ShowEntityObserver", "IsShowEntityModeStartPoint", "entity: " + foundedResult[0] + " card: " + foundedResult[1], DefineManager.LOG_LEVEL_INFO) indexOfCardInfo["CARD_ID"] = foundedResult[1] return foundedResult else: LogManager.PrintLog("ShowEntityObserver", "IsShowEntityModeStartPoint", "Show entity mode already true", DefineManager.LOG_LEVEL_WARN) return []
def FindSquareObjectFromContourData(contourDatas): for indexOfContour in contourDatas: peri = cv2.arcLength(indexOfContour, True) approx = cv2.approxPolyDP(indexOfContour, 0.02 * peri, True) if len(approx) == Setting.DefineManager.SQUARE_CORNER_NUM: squareContourData = approx LogManager.PrintLog("ObjectDetect", "FindSquareObjectFromContourData", "Square Contour Data Founded", DefineManager.LOG_LEVEL_INFO) return squareContourData LogManager.PrintLog("ObjectDetect", "FindSquareObjectFromContourData", "Square Contour Data Not Founded", DefineManager.LOG_LEVEL_WARN) return None
def CalculateProcess(fieldData): LogManager.PrintLog("FieldHelper", "CalculateProcess", "player field data accepted", DefineManager.LOG_LEVEL_INFO) BestCardSwap(fieldData, 0) BestCardSwap(fieldData, 1) return
def RealtimeLoader(targetFilePath = DefineManager.DEFAULT_HEARTH_STONE_LOG_FILES_PATH): targetFilePath = DirectoryManager.FindLatestLogFile(targetFilePath) LogManager.PrintLog("FileIO", "RealtimeLoader", "Load file path: " + targetFilePath, DefineManager.LOG_LEVEL_INFO) hearthStoneLogFile = subprocess.Popen(['tail', '-F', targetFilePath], stdout = subprocess.PIPE, stderr = subprocess.PIPE) while True: logMessage = hearthStoneLogFile.stdout.readline() if not logMessage: LogManager.PrintLog("FileIO", "RealtimeLoader", "File read process ended", DefineManager.LOG_LEVEL_INFO) break else: # LogManager.PrintLog("FileIO", "RealtimeLoader", logMessage, DefineManager.LOG_LEVEL_INFO) DeckObserver.ParseShowEntity(logMessage, targetFilePath)
def GetBestSwap(playerNumber): global maxScore global bestCardSwap defenderNumber = (playerNumber + 1) % 2 cardPlayerField = ', '.join(str(e) for e in bestCardSwap[playerNumber]) cardDefenderField = ', '.join(str(e) for e in bestCardSwap[defenderNumber]) LogManager.PrintLog( "FieldHelper", "GetBestSwap", "max score: " + str(maxScore) + "player: " + cardPlayerField + "\ndefender: " + cardDefenderField, DefineManager.LOG_LEVEL_INFO)
def DetectGameStatus(logMessage): tagChangeEntityData = re.search( "TAG_CHANGE Entity=(.+?) tag=PLAYSTATE value=(.+?)\n", logMessage) if tagChangeEntityData != None: LogManager.PrintLog( "TagChangeEntityObserver", "DetectGameStatus", "entity: " + tagChangeEntityData.group(1) + " value: " + tagChangeEntityData.group(2), DefineManager.LOG_LEVEL_INFO) return [tagChangeEntityData.group(1), tagChangeEntityData.group(2)] return None
def IsGameComplete(logMessage): checkedStatusValue = DetectGameStatus(logMessage) if checkedStatusValue != None: if checkedStatusValue[1] == "LOST" or checkedStatusValue[1] == "WON": LogManager.PrintLog( "TagChangeEntityObserver", "IsGameComplete", "End of Game, Player " + " ".join(checkedStatusValue), DefineManager.LOG_LEVEL_INFO) return True return False
def BestCardSwap(fieldData, playerNumber): global maxScore global bestCardSwap bestCardSwap = [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]] swapCase = [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]] maxScore = -987654321 LogManager.PrintLog( "FieldHelper", "BestCardSwap", "calculate best card swap player : " + str(playerNumber), DefineManager.LOG_LEVEL_INFO) RecursiveSearcher(playerNumber, fieldData, 1, swapCase) return
def DetectFieldCard(logMessage): global fieldCardsInfo tagChangeEntityData = re.search( "TAG_CHANGE Entity=(.+?) tag=NUM_TURNS_IN_PLAY value=(.+?)\n", logMessage) if tagChangeEntityData != None: LogManager.PrintLog( "TagChangeEntityObserver", "DetectFieldCard", "entity: " + tagChangeEntityData.group(1) + " value: " + tagChangeEntityData.group(2), DefineManager.LOG_LEVEL_INFO) entityDetailData = re.search( "entityName=(.+?) id=(.+?) zone=(.+?) zonePos=(.+?) cardId=(.+?) player=(.+?)", tagChangeEntityData.group(1)) if entityDetailData != None: entityDetailArray = [ entityDetailData.group(1), entityDetailData.group(2), entityDetailData.group(3), entityDetailData.group(4), entityDetailData.group(5), entityDetailData.group(6) ] # (player number - 1) * limit of field card num + card field position fieldCardsInfoSavePoint = (int(entityDetailArray[5]) - 1) * 7 + int(entityDetailArray[3]) fieldCardsInfo[fieldCardsInfoSavePoint] = [ entityDetailArray, tagChangeEntityData.group(2) ] LogManager.PrintLog( "TagChangeEntityObserver", "DetectFieldCard", "entity detail: " + " ".join(entityDetailArray), DefineManager.LOG_LEVEL_INFO)
def RecursiveSearcher(playerNumber, fieldData, level, cardField): global maxScore global bestCardSwap if level > 7: return 0 i = 0 defenderNumber = (playerNumber + 1) % 2 if level == DefineManager.MAXIMUM_FIELD_CARD_NUM: if cardField[defenderNumber] == [0, 3, 0, 3, 0, 0, 0, 0]: i = 0 resultSum = SimulateCardSwap(fieldData, playerNumber, cardField[playerNumber], cardField[defenderNumber]) if resultSum > maxScore: maxScore = resultSum for i in range(1, DefineManager.MAXIMUM_FIELD_CARD_NUM + 1): bestCardSwap[playerNumber][i] = cardField[playerNumber][i] bestCardSwap[defenderNumber][i] = cardField[defenderNumber][i] cardPlayerField = ', '.join( str(e) for e in bestCardSwap[playerNumber]) cardDefenderField = ', '.join( str(e) for e in bestCardSwap[defenderNumber]) LogManager.PrintLog( "FieldHelper", "RecursiveSearcher", "max score: " + str(maxScore) + "player: " + cardPlayerField + "\ndefender: " + cardDefenderField, DefineManager.LOG_LEVEL_INFO) cardField[playerNumber][level] = 0 cardField[defenderNumber][level] = 0 return 0 for i in range(1, DefineManager.MAXIMUM_FIELD_CARD_NUM + 1): if fieldData[playerNumber][level][0] != DefineManager.NOT_AVAILABLE: cardField[playerNumber][level] = level if fieldData[defenderNumber][i][0] != DefineManager.NOT_AVAILABLE: cardField[defenderNumber][level] = i else: cardField[defenderNumber][level] = 0 else: cardField[playerNumber][level] = 0 cardField[defenderNumber][level] = 0 RecursiveSearcher(playerNumber, fieldData, level + 1, cardField) cardField[playerNumber][level] = 0 cardField[defenderNumber][level] = 0 return 0
def IsGameStart(logMessage): if logMessage.find("CREATE_GAME") != DefineManager.NOT_AVAILABLE: LogManager.PrintLog("TagChangeEntityObserver", "IsGameStart", "Start of Game", DefineManager.LOG_LEVEL_INFO) return True return False
def ParseShowEntity(logMessage, targetFilePath=None): global deckObserverPlayer1 global deckObserverPlayer2 if TagChangeEntityObserver.IsGameStart(logMessage): if targetFilePath != None: DirectoryManager.RemoveFile(targetFilePath) GameObservingInit() TagChangeEntityObserver.IsGameComplete(logMessage) TagChangeEntityObserver.DetectFieldCard(logMessage) TagChangeEntityObserver.DetectTurns(logMessage) # found show entity start point if ShowEntityObserver.GetIsShowEntityMode() == False: ShowEntityObserver.IsShowEntityModeStartPoint(logMessage) # crawl card tag datas else: selectedCardInfo = ShowEntityObserver.GetShowEntityModeTagAndValue( logMessage) if selectedCardInfo != None: if selectedCardInfo.has_key("CONTROLLER"): if selectedCardInfo[ "CONTROLLER"] == DefineManager.PLAYER_NUMBER_1: deckObserverPlayer1[ selectedCardInfo["ENTITY_ID"]] = selectedCardInfo LogManager.PrintLog( "DeckObserver", "ParseShowEntity", "player#1 selected card#" + selectedCardInfo["ENTITY_ID"] + ": " + selectedCardInfo["CARD_ID"], DefineManager.LOG_LEVEL_INFO) else: deckObserverPlayer2[ selectedCardInfo["ENTITY_ID"]] = selectedCardInfo LogManager.PrintLog( "DeckObserver", "ParseShowEntity", "player#2 selected card#" + selectedCardInfo["ENTITY_ID"] + ": " + selectedCardInfo["CARD_ID"], DefineManager.LOG_LEVEL_INFO) else: if selectedCardInfo.has_key( "ENTITY_ID") and selectedCardInfo.has_key("CARD_ID"): LogManager.PrintLog( "DeckObserver", "ParseShowEntity", "whose card is this? card#" + selectedCardInfo["ENTITY_ID"] + ": " + selectedCardInfo["CARD_ID"], DefineManager.LOG_LEVEL_WARN) else: try: LogManager.PrintLog( "DeckObserver", "ParseShowEntity", "wrong card accepted\n" + json.dumps(selectedCardInfo), DefineManager.LOG_LEVEL_WARN) except: LogManager.PrintLog("DeckObserver", "ParseShowEntity", "cannot print wrong card", DefineManager.LOG_LEVEL_ERROR) # found hide entity hideCardInfo = HideEntityObserver.CheckHideEntity(logMessage)
def FieldSpecObserver(fieldSpecStatusData): fieldSpecPlayer1 = fieldSpecStatusData[0] fieldSpecPlayer2 = fieldSpecStatusData[1] fieldStatusPlayer1 = ["", "", "", "", "", "", "", ""] fieldStatusPlayer2 = ["", "", "", "", "", "", "", ""] fieldInfoPlayer1 = [ [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ] ] fieldInfoPlayer2 = [ [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ], [ DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE, DefineManager.NOT_AVAILABLE ] ] fieldPrintFormat = "{0:>10} |{1:>10} |{2:>10} |{3:>10} |{4:>10} |{5:>10} |{6:>10} |{7:>10} |" for indexCounter in fieldSpecPlayer1: indexOfCardSpec = fieldSpecPlayer1[indexCounter] if indexOfCardSpec != None: try: if indexOfCardSpec.has_key( u"attack") and indexOfCardSpec.has_key( u"health") and indexOfCardSpec.has_key(u"cost"): attackValue = indexOfCardSpec[u"attack"] healthValue = indexOfCardSpec[u"health"] costValue = indexOfCardSpec[u"cost"] fieldInfoPlayer1[indexCounter] = [ attackValue, healthValue, costValue ] fieldStatusPlayer1[indexCounter] = str( attackValue) + "/" + str(healthValue) + "/" + str( costValue) except: fieldStatusPlayer1[indexCounter] = "?/?/?" for indexCounter in fieldSpecPlayer2: indexOfCardSpec = fieldSpecPlayer2[indexCounter] if indexOfCardSpec != None: try: if indexOfCardSpec.has_key( u"attack") and indexOfCardSpec.has_key( u"health") and indexOfCardSpec.has_key(u"cost"): attackValue = indexOfCardSpec[u"attack"] healthValue = indexOfCardSpec[u"health"] costValue = indexOfCardSpec[u"cost"] fieldInfoPlayer2[indexCounter] = [ attackValue, healthValue, costValue ] fieldStatusPlayer2[indexCounter] = str( attackValue) + "/" + str(healthValue) + "/" + str( costValue) except: fieldStatusPlayer2[indexCounter] = "?/?/?" fieldOfPlayer1 = fieldPrintFormat.format(*fieldStatusPlayer1) fieldOfPlayer2 = fieldPrintFormat.format(*fieldStatusPlayer2) LogManager.PrintLog("FieldObserver", "FieldSpecObserver", "player1: " + fieldOfPlayer1, DefineManager.LOG_LEVEL_INFO) LogManager.PrintLog("FieldObserver", "FieldSpecObserver", "player2: " + fieldOfPlayer2, DefineManager.LOG_LEVEL_INFO) return [fieldInfoPlayer1, fieldInfoPlayer2]