Пример #1
0
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
Пример #2
0
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
Пример #3
0
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]
Пример #4
0
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)
Пример #5
0
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 []
Пример #6
0
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
Пример #7
0
def CalculateProcess(fieldData):
    LogManager.PrintLog("FieldHelper", "CalculateProcess",
                        "player field data accepted",
                        DefineManager.LOG_LEVEL_INFO)
    BestCardSwap(fieldData, 0)
    BestCardSwap(fieldData, 1)
    return
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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
Пример #13
0
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)
Пример #14
0
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
Пример #15
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
Пример #16
0
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)
Пример #17
0
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]