예제 #1
0
파일: battle.py 프로젝트: jacksyen/pyastd
class BattleThread(threading.Thread):
    
    def __init__(self,include,serverid,playerinfo,config):
        threading.Thread.__init__(self)        
        self.stoped     = False
        self.request    = Request(include)
        self.serverid   = serverid
        self.playerinfo = playerinfo
        self.config     = config
        self.timehelp   = TimeHelp()        
        self.armiesId   = self.request.include.legion_battle.get(self.config._defaultConfig.get("battle-legion"))
        
    def stop(self):
        self.request.include.logger.info(u"自动刷军团线程停止")
        if self.config._defaultConfig.get("battle-autoformat"):
            # 调整阵型为雁行阵
            formatThread = FormationThread(self.request.include,self.serverid,160)
            formatThread.start()
        self.stoped = True

    def isStoped(self):
        return self.stoped

    def run(self):
        self.request.include.logger.info(u"自动刷%s军团功能启动" %(self.config._defaultConfig.get("battle-legion")))
        # 调整阵型为:八卦阵
        if self.config._defaultConfig.get("battle-autoformat"):
            formatThread = FormationThread(self.request.include,self.serverid,120)
            formatThread.start()
        while True:
            if self.stoped:
                return
            if self.playerinfo.forces<=10000:
                draughtThread = DraughtThread(self.request.include,self.serverid,self.playerinfo)
                draughtThread.start()
            if self.playerinfo.token==0:
                self.request.include.logger.info(u"军令数量为0")                
                self.stop()
                return
            if self.playerinfo.tokencdflag==1:
                if self.playerinfo.tokencd>0:
                    chatSendThread = ChatSendThread(self.request.include,self.serverid,u"征战CD中,剩余:%s" %(self.timehelp.getDownTime(self.playerinfo.tokencd)),u"国家")
                    chatSendThread.start()
                    self.request.include.logger.info(u"征战CD中,剩余 %s" %(self.timehelp.getDownTime(self.playerinfo.tokencd)))
                    self.stop()
                    return
            # 获得征战队伍信息
            battleTeamInfo = self.getTeamInfo()
            role = None
            if len(battleTeamInfo.memberlist)>0:
                for member in battleTeamInfo.memberlist:
                    if member.playerid == int(self.playerinfo.playerid):
                        if member.role=="CREATER":
                            # 解散队伍
                            self.dismissTeam()
                        elif member.role=="COMMON":
                            # 退出队伍
                            self.quitTeam()
                        break
            # 重新获得队伍信息
            battleTeamInfo = self.getTeamInfo()
            # 判断是否存在合适的征战队伍,返回合适的队伍
            team = self.isExistsTeam(battleTeamInfo)
            if team:
                # 加入征战队伍
                if not self.joinTeam(team):
                    self.stop()
                    return 
                role = "COMMON"
            else:
                # 若配置文件中不可以创建征战队伍,就跳过继续等待加入队伍
                if not self.config._defaultConfig.get("battle-autocreate"):
                    while True:
                        battleTeamInfo = self.getTeamInfo()
                        team = self.isExistsTeam(battleTeamInfo)
                        if team:
                            # 加入征战队伍
                            if not self.joinTeam(team):
                                self.stop()
                                return
                            role = "COMMON"
                            break
                        time.sleep(3)
                else:
                    # 创建征战队伍
                    url = "http://s%d.as.yaowan.com/root/multiBattle!createTeam.action?%d" %(self.serverid,int(time.time()*1000))
                    data = {"rule":"4:0;2",
                            "armiesId":self.armiesId}
                    reqinfo = self.request.request(url,data,jsonFormat=False)
                    res = zlib.decompress(reqinfo.read())
                    print "create:",res
                    role = "CREATER"
            sendnum = 0
            battlePer = {}
            while True:
                battleTeamInfo = self.getTeamInfo()
                # 判断加入的队伍是否已经开始
                if battleTeamInfo.sceneevent:
                    playerbattleinfo = battleTeamInfo.sceneevent.playerbattleinfo
                    if playerbattleinfo:
                        self.playerinfo.token   = playerbattleinfo.token
                        self.playerinfo.tokencd = playerbattleinfo.tokencd
                        self.playerinfo.tokencdflag = playerbattleinfo.tokencdflag
                        self.playerinfo.forces  = playerbattleinfo.forces
                        #print "剩余总军工:",playerbattleinfo.jyungong
                        self.request.include.logger.info(u"剩余总军工:%d" %(playerbattleinfo.jyungong))
                        break

                # 判断加入的队伍是否存在
                if len(battleTeamInfo.memberlist)==0:
                    self.request.include.logger.info(u"征战队伍解散")
                    break
                if role=="CREATER":
                    for member in battleTeamInfo.memberlist:
                        if member.playername.find("u老鬼")>=0:
                            battlePer.setdefault("laogui",1)
                        elif member.playername.find(u"米粥")>=0:
                            battlePer.setdefault("mizhou",1)
                        elif member.playername.find(u"不停")>=0:
                            battlePer.setdefault("buting",1)
                        elif member.playername.find(u"豆包")>=0:
                            battlePer.setdefault("doubao",1)
                        elif member.playername.find(u"人民")>=0:
                            battlePer.setdefault("renming",1)
                        elif member.playername.find(u"猪猪")>=0:
                            battlePer.setdefault("zhuzhu",1)
                        elif member.playername.find(u"亚特")>=0:
                            battlePer.setdefault("yate",1)
                        elif member.playername.find(u"来时")>=0:
                            battlePer.setdefault("laishi",1)
                        elif member.playername.find(u"小馬")>=0:
                            battlePer.setdefault("xiaomage",1)
                        elif member.playername.find(u"睡觉")>=0:
                            battlePer.setdefault("shuijiao",1)
                    # 自己创建的队伍需要6个成员以上才能开启
                    if battleTeamInfo.currentnum>=5 or (len(battlePer.items())>=2 and battleTeamInfo.currentnum>=4):
                        # 开始征战,获得征战结果
                        battleInfo = self.getBattleInfo()
                        if battleInfo.sceneevent:
                            playerbattleinfo = battleInfo.sceneevent.playerbattleinfo
                            if playerbattleinfo:
                                self.playerinfo.token   = playerbattleinfo.token
                                self.playerinfo.tokencd = playerbattleinfo.tokencd
                                self.playerinfo.tokencdflag = playerbattleinfo.tokencdflag
                                self.playerinfo.forces  = playerbattleinfo.forces
                                print u"剩余总军工:",playerbattleinfo.jyungong
                                break
                    else:
                        print u"征战队伍已开启,需要%d个成员才能开始..." %(5-battleTeamInfo.currentnum)
                        if (5-battleTeamInfo.currentnum)<=1:
                            if sendnum<=1:
                                chatSendThread = ChatSendThread(self.request.include,self.serverid,u"闯王=%d" %(5-battleTeamInfo.currentnum),"国家")
                                chatSendThread.start()
                                sendnum = sendnum + 1
                    time.sleep(3)
                time.sleep(3)
                
            
            '''
            # 未知
            url = "http://s%d.as.yaowan.com/root/battle.action?%d "  %(self.serverid,int(time.time()*1000))
            reqinfo = self.request.request(url)
            res = zlib.decompress(reqinfo.read())
            print reqinfo            
            '''

    '''
    加入征战队伍
    team: 队伍信息
    '''
    def joinTeam(self,team):
        url = "http://s%d.as.yaowan.com/root/multiBattle!joinTeam.action?%d" %(self.serverid,int(time.time()*1000))
        data = {"teamId":team.teamid}
        reqinfo = self.request.request(url,data,jsonFormat=False)
        res = zlib.decompress(reqinfo.read())
        if res.find(u"军令还没有冷却")>=0:
            self.request.include.logger.warning(u"军令还没有冷却,不可以征战")
            return False
        self.request.include.logger.info(u"加入由玩家:%s 创建的征战队伍" %team.teamname)
        print 'join:',res
        return True

    '''
    退出队伍
    '''
    def quitTeam(self):
        self.request.include.logger.info(u"退出队伍")
        url = "http://s%d.as.yaowan.com/root/multiBattle!quit.action?%d" %(self.serverid,int(time.time()*1000))
        reqinfo = self.request.request(url)
        res = zlib.decompress(reqinfo.read())
        print 'quit:',res

    '''
    解散队伍
    '''
    def dismissTeam(self):
        self.request.include.logger.info(u"解散队伍")
        url = "http://s%d.as.yaowan.com/root/multiBattle!dismiss.action?%d" %(self.serverid,int(time.time()*1000))
        reqinfo = self.request.request(url)
        res = zlib.decompress(reqinfo.read())
        print 'dismiss:',res

    '''
    判断是否存在合适的征战队伍
    '''
    def isExistsTeam(self,battleTeamInfo):
        for team in battleTeamInfo.teamlist:
            if self.playerinfo.league==2:
                if team.condition.find(u"魏国")>=0 and (team.currentnum!=team.maxnum):
                    return team
            if team.condition.find(u"吴国")>=0 and (team.currentnum!=team.maxnum):
                return team
            if team.condition.find(u"英雄")>=0 and (team.currentnum!=team.maxnum):
                return team
        return None    
    '''
    玩家自己创建,获得征战结果
    返回BattleInfo对象
    '''
    def getBattleInfo(self):
        url = "http://s%d.as.yaowan.com/root/multiBattle!battle.action?%d"  %(self.serverid,int(time.time()*1000))
        reqinfo = self.request.request(url)
        res = zlib.decompress(reqinfo.read())
        if res:
            res = res[res.find("<?xml"):]            
            resXML = etree.XML(res)
            childli  = resXML.getchildren()
            battleInfo = BattleInfo()
            for child in childli:
                if child.tag=="state":
                    battleInfo.state = child.text
                if child.tag=="message":
                    battleInfo.message = child.text
                if child.tag=="sceneevent":
                    sceneevent = SceneEvent()
                    for cchild in child:
                        if cchild.tag=="scene":
                            sceneevent.scene = child.text
                        if cchild.tag=="kfzonestate":
                            sceneevent.kfzonestate = child.text
                        if cchild.tag=="playerbattleinfo":
                            print 'battle playerbattleinfo:',cchild.getchildren()
                            forces           = int(cchild.find("forces").text)
                            if cchild.findtext("jyungong"):
                                jyungong         = int(cchild.find("jyungong").text)
                            else:
                                jyungong     = -1
                            token            = int(cchild.find("token").text)
                            tokencd          = int(cchild.find("tokencd").text)
                            tokencdflag      = int(cchild.find("tokencdflag").text)
                            kfzonestate      = cchild.find("kfzonestate").text
                            playerbattleinfo = PlayerBattleInfo(forces,jyungong,token,tokencd,tokencdflag,kfzonestate)
                            sceneevent.playerbattleinfo = playerbattleinfo
                    battleInfo.sceneevent = sceneevent
            return battleInfo

    '''
    获得征战队伍信息
    '''
    def getTeamInfo(self):
        url = "http://s%d.as.yaowan.com/root/multiBattle!getTeamInfo.action?%d" %(self.serverid,int(time.time()*1000))
        data = {"armiesId":self.armiesId}
        reqinfo = self.request.request(url,data,jsonFormat=False)
        res = zlib.decompress(reqinfo.read())
        if res:
            res = res[res.find("<?xml"):]            
            resXML = etree.XML(res)
            childli  = resXML.getchildren()
            battleTeamInfo = BattleTeamInfo()
            teamlist = []
            memberlist = []
            for child in childli:
                if child.tag=="state":
                    battleTeamInfo.state = child.text
                if child.tag=="maxnum":
                    battleTeamInfo.maxnum = int(child.text)
                if child.tag=="currentnum":
                    battleTeamInfo.currentnum = int(child.text)
                if child.tag=="armies":                    
                    _id       = child.find("id").text
                    name      = child.find("name").text
                    level     = child.find("level").text
                    minplayer = child.find("minplayer").text
                    maxplayer = child.find("maxplayer").text
                    maxwinnum = child.find("maxwinnum").text
                    battlenum = child.find("battlenum").text
                    honor     = child.find("honor").text
                    itemname  = child.find("itemname").text
                    armynum   = child.find("armynum").text
                    _filter   = child.find("filter").text
                    itempic   = child.find("itempic").text
                    armies = Armies(_id,name,level,minplayer,maxplayer,maxwinnum,battlenum,honor,itemname,armynum,_filter,itempic)
                    battleTeamInfo.armies = armies
                if child.tag=="team":
                    teamid     = child.find("teamid").text
                    teamname   = child.find("teamname").text
                    maxnum     = int(child.find("maxnum").text)
                    targetname = child.find("targetname").text
                    currentnum = int(child.find("currentnum").text)
                    condition  = child.find("condition").text
                    team = Team(teamid,teamname,maxnum,targetname,currentnum,condition)
                    teamlist.append(team)
                if child.tag=="member":
                    playername    = child.find("playername").text
                    playerid      = int(child.find("playerid").text)
                    playerlevel   = child.find("playerlevel").text
                    role          = child.find("role").text
                    attlv         = child.find("attlv").text
                    deflv         = child.find("deflv").text
                    makemode      = child.find("makemode").text
                    maxsolidernum = child.find("maxsolidernum").text
                    solidernum    = child.find("solidernum").text
                    member = Member(playername,playerid,playerlevel,role,attlv,deflv,makemode,maxsolidernum,solidernum)
                    memberlist.append(member)
                if child.tag=="sceneevent":
                    sceneevent = SceneEvent()
                    for cchild in child:
                        if cchild.tag=="scene":
                            sceneevent.scene = child.text
                        if cchild.tag=="kfzonestate":
                            sceneevent.kfzonestate = child.text
                        if cchild.tag=="playerbattleinfo":
                            print 'playerbattleinfo:',cchild.getchildren()
                            if cchild.findtext("forces"):
                                forces           = int(cchild.find("forces").text)
                            else:
                                forces = -1
                            if cchild.findtext("jyungong"):
                                jyungong         = int(cchild.find("jyungong").text)
                            else:
                                jyungong = -1
                            if cchild.findtext("token"):
                                token = int(cchild.findtext("token"))
                            else:
                                token = -1
                            tokencd          = int(cchild.find("tokencd").text)
                            tokencdflag      = int(cchild.find("tokencdflag").text)                                
                            kfzonestate      = cchild.find("kfzonestate").text
                            playerbattleinfo = PlayerBattleInfo(forces,jyungong,token,tokencd,tokencdflag,kfzonestate)
                            sceneevent.playerbattleinfo = playerbattleinfo
                    battleTeamInfo.sceneevent = sceneevent
            battleTeamInfo.teamlist = teamlist
            battleTeamInfo.memberlist = memberlist
            
            return battleTeamInfo
예제 #2
0
파일: trade.py 프로젝트: jacksyen/pyastd
class TradeThread(threading.Thread):

    """
    include: include对象
    serverid: 服务器ID
    playerinfo: playerinfo对象
    userconfig: 用户配置对象
    """

    def __init__(self, include, serverid, playerinfo, config):
        threading.Thread.__init__(self)
        self.stoped = False
        self.include = include
        self.request = Request(include)
        self.config = config
        self.serverid = serverid
        self.playerinfo = playerinfo
        self.timehelp = TimeHelp()

    def stop(self):
        self.stoped = True

    def isStoped(self):
        return self.stoped

    def run(self):
        # 获得玩家的委派商人信息
        playerMerchant = self.getPlayerMerchant()
        # 判断钱币是否达到最低限制和是否正在CD中
        mincoins = self.config._defaultConfig.get("coins-minlimit")
        if int(self.playerinfo.copper) < mincoins:
            print "钱币小于%d,停止委派" % (mincoins)
            self.stoped = True
        print "auto market cdflag:", int(playerMerchant.cdflag), ",cd:", int(playerMerchant.cd)
        if int(playerMerchant.cdflag) == 1 and int(playerMerchant.cd) > 0:
            print "委派CD中,停止委派,剩余:%s" % (self.timehelp.getDownTime(int(playerMerchant.cd)))
            self.include.tradeCD = int(playerMerchant.cd)
            self.include.tradeCDFlag = True
            self.stoped = True
        while True:
            if self.stoped:
                print "自动委派线程停止"
                return
            # 委派马商
            if not playerMerchant:
                self.stoped = True
                print "委派失败,返回值为空"
                return
            playerMerchant = self.marketTrade(playerMerchant)
            if not playerMerchant.tradesn:
                print "委派失败,未获取到委派结果"
                self.stoped = True
                return
            print playerMerchant.message
            marketresult = self.marketConfirm(playerMerchant)
            if marketresult:  # 卖出货物成功
                # 判断委派返回的玩家钱币是否达到最低限制,true:则停止委派
                if int(marketresult.playerupdateinfo.copper) < mincoins:
                    print "钱币小于%d,停止委派" % (mincoins)
                    self.stoped = True
                    return
            else:  # 卖出货物失败
                if playerMerchant.playerupdateinfo and playerMerchant.playerupdateinfo.copper:
                    if int(playerMerchant.playerupdateinfo.copper) < mincoins:
                        print "钱币小于%d,停止委派" % (mincoins)
                        self.stoped = True
                        return

            if int(playerMerchant.cdflag) == 1:
                msg = "委派CD中,停止委派,剩余:%s" % (self.timehelp.getDownTime(int(playerMerchant.cd)))
                print msg
                self.include.tradeCD = int(playerMerchant.cd)
                self.include.tradeCDFlag = True
                self.stoped = True
                return
            time.sleep(1)

    """
    获得玩家的马商信息
    """

    def getPlayerMerchant(self):
        url = "http://s%d.as.yaowan.com/root/market!getPlayerMerchant.action?%d" % (
            self.serverid,
            long(time.time() * 1000),
        )
        reqinfo = self.request.request(url)
        res = zlib.decompress(reqinfo.read())
        print "market res:", res
        # get xml str
        return self.resolveMerXML(res)

    """
    解析玩家的马商信息和委派过后的马商信息
    content: 要解析的内容
    返回 PlayerMerchant 对象
    """

    def resolveMerXML(self, content):
        res = content[content.find("<?xml") :]
        if not res:
            return None
        results = etree.XML(res)
        childli = results.getchildren()
        playerMerchant = PlayerMerchant()
        merchantlist = []
        for child in childli:
            # 委派结果
            if child.tag == "merchandise":
                merchandiseid = child.find("merchandiseid").text
                merchandisename = unicode(child.find("merchandisename").text).encode("utf-8")
                merchandiselv = child.find("merchandiselv").text
                merchandisequality = child.find("merchandisequality").text
                limitlv = child.find("limitlv").text
                pic = child.find("pic").text
                equiptype = child.find("equiptype").text
                attribute = child.find("attribute").text
                hp = child.find("hp").text
                cost = child.find("cost").text
                stagename = child.find("stagename").text
                merchandise = Merchandise(
                    merchandiseid,
                    merchandisename,
                    merchandiselv,
                    merchandisequality,
                    limitlv,
                    pic,
                    equiptype,
                    attribute,
                    hp,
                    cost,
                    stagename,
                )
                playerMerchant.merchandise = merchandise

            if child.tag == "merchant":
                merchantid = child.find("merchantid").text
                merchantname = unicode(child.find("merchantname").text).encode("utf-8")
                merchantintro = child.find("merchantintro").text
                cost = child.find("cost").text
                nextcharge = child.find("nextcharge").text
                merchant = Merchant(merchantid, merchantname, merchantintro, cost, nextcharge)
                merchantlist.append(merchant)
            if child.tag == "playerupdateinfo":
                # print 'trade playerupdateinfo:',child.getchildren()
                if child.find("copper"):
                    copper = child.find("copper").text
                    updateinfo = PlayerUpdateInfo()
                    updateinfo.copper = copper
                    playerMerchant.playerupdateinfo = updateinfo
            if child.tag == "state":
                state = child.text
                playerMerchant.state = state
            if child.tag == "cd":
                cd = child.text
                playerMerchant.cd = cd
            if child.tag == "cdflag":
                cdflag = child.text
                playerMerchant.cdflag = cdflag
            if child.tag == "free":
                free = child.text
                playerMerchant.free = free
            if child.tag == "gold":
                gold = child.text
                playerMerchant.gold = gold
            if child.tag == "tradesn":
                tradesn = child.text
                playerMerchant.tradesn = tradesn
            if child.tag == "message":
                message = unicode(child.text).encode("utf-8")
                playerMerchant.message = message
        playerMerchant.merchantlist = merchantlist
        return playerMerchant

    """
    马商委派
    """

    def marketTrade(self, param):
        # 得到marketfile中最高的那个商人
        merchant = param.merchantlist[0]
        for i in range(len(param.merchantlist)):
            if int(param.merchantlist[i].merchantid) == 5:
                merchant = param.merchantlist[i - 1]
                break

        data = {"merchantId": int(merchant.merchantid), "gold": int(param.gold)}
        url = "http://s%d.as.yaowan.com/root/market!trade.action?%d" % (self.serverid, long(time.time() * 1000))
        reqinfo = self.request.request(url, data, jsonFormat=False)
        res = zlib.decompress(reqinfo.read())
        # 得到返回的委派货物和商人信息
        playerMerchant = self.resolveMerXML(res)
        return playerMerchant

    """
    判断委派的货物是否需要卖出
    """

    def marketConfirm(self, playerMerchant):
        if (int(playerMerchant.merchandise.limitlv) < self.config._defaultConfig.get("trade-limitlv")) or (
            int(playerMerchant.merchandise.attribute) < self.config._defaultConfig.get("trade-attribute")
        ):
            # 卖出货物
            data = {"tradeSN": playerMerchant.tradesn}
            url = "http://s%d.as.yaowan.com/root/market!confirm.action?%d" % (self.serverid, long(time.time() * 1000))
            reqinfo = self.request.request(url, data, jsonFormat=False)
            res = zlib.decompress(reqinfo.read())
            res = res[res.find("<?xml") :]
            if not res:
                print "卖出货物%s失败" % (playerMerchant.merchandise.merchandisename)
                return None
            results = etree.XML(res)
            childli = results.getchildren()
            # 返回结果对象
            marketresult = MarketResult()
            for child in childli:
                if child.tag == "state":
                    state = child.text
                    if int(state) != 1:
                        print "卖出货物%s失败" % (playerMerchant.merchandise.merchandisename)
                        return None
                    marketresult.state = state
                if child.tag == "usesize":  # 使用大小
                    usesize = child.text
                    marketresult.usesize = usesize
                if child.tag == "cost":
                    cost = child.text
                    marketresult.cost = cost
                if child.tag == "playerupdateinfo":
                    copper = child.find("copper").text
                    updateinfo = PlayerUpdateInfo()
                    updateinfo.copper = copper
                    marketresult.playerupdateinfo = updateinfo
            msg = "卖出货物%s成功,获得%d钱币" % (playerMerchant.merchandise.merchandisename, int(cost))
            print msg
            return marketresult
        else:
            msg = "货物%s属性或级别大于配置参数,没有卖出" % (playerMerchant.merchandise.merchandisename)
            print msg
            return None