Exemple #1
0
class Game:
    def __init__(self, account):
        self.username = account['username']
        self.password = account['password']
        self.server = account['server']

        self.shipClasses = { }
        self.ships = { }
        self.fleets = [ None, None, None, None ]
        self.expeditions = { }
        self.repairYards = [ None, None, None, None ]
        self.maxShipNum = 0
        self.errorCodes = { }

        self.packer = Packer(self)

        Log.i('Initializing game...')
        self.conn = Connection()
        self.gameData = self.conn.get('/index/getInitConfigs/')

        for shipClassData in self.gameData['shipCard']:
            if int(shipClassData['npc']) == 0 and int(shipClassData['release']) == 1:
                shipClass = self.packer.makeShipClass(shipClassData)
                self.shipClasses[shipClass.id] = shipClass

        for expeditionData in self.gameData['pveExplore']:
            expedition = self.packer.makeExpedition(expeditionData)
            self.expeditions[expedition.id] = expedition

        Log.errorCodes = { int(k) : v for k, v in self.gameData['errorCode'].items() }

        Log.i('Logging in...')
        loginData = self.conn.httpsGet('/index/passportLogin/%s/%s/' % (self.username, self.password))
        self.conn.setServer(self.server)
        time.sleep(1)
        self.conn.get('//index/login/' + loginData['userId'])

        Log.i('Initializing user data...')
        self.userData = self.conn.get('/api/initGame/')
        self.conn.get('/pevent/getPveData/')
        self.conn.get('/pve/getPveData/')
        time.sleep(5)
        self.conn.get('/active/getUserData/')
        self.conn.get('/campaign/getUserData/')
        self.conn.get('/pve/getUserData/')

        for shipData in self.userData['userShipVO']:
            ship = self.packer.makeShip(shipData)
            self.ships[ship.id] = ship

        for fleetData in self.userData['fleetVo']:
            fleet = self.packer.makeFleet(fleetData)
            self.fleets[fleet.id - 1] = fleet

        for expStatusData in self.userData['pveExploreVo']['levels']:
            exp = self.expeditions[int(expStatusData['exploreId'])]
            fleet = self.fleets[int(expStatusData['fleetId']) - 1]
            endTime = datetime.fromtimestamp(int(expStatusData['endTime']))
            exp.setStatus(fleet, endTime)

        for repairYardData in self.userData['repairDockVo']:
            ry = self.packer.makeRepairYard(repairYardData)
            self.repairYards[ry.id - 1] = ry

        self.maxShipNum = int(self.userData['userVo']['detailInfo']['shipNumTop'])

        Log.i('Done')

    def restart(self):
        self.conn = Connection()
        self.conn.get('/index/getInitConfigs/')
        loginData = self.conn.get('/index/passportLogin/%s/%s/' % (self.username, self.password))
        self.conn.setServer(self.server)
        self.conn.get('//index/login/' + loginData['userId'])
        self.conn.get('/api/initGame/')
        Log.i('Game restarted')

    def getShipClass(self, id_):
        return self.shipClasses[id_]

    def getShip(self, id_):
        return self.ships[id_]

    def findShip(self, name, lv = None):
        ret = None
        for ship in self.ships.values():
            if ship.getName() == name:
                if lv is not None and ship.lv == lv:
                    Log.i('Found ship %s of level %d, id: %d' % (name, ship.lv, ship.id))
                    return ship
                if ret is None or ret.lv < ship.lv:
                    ret = ship
        return ret

    def getFleet(self, id_):
        return self.fleets[id_ - 1]

    def isDormFull(self):
        return len(self.ships) >= self.maxShipNum

    def addShip(self, ship):
        self.ships[ship.id] = ship

    def addResource(self, res):
        pass # TODO

    def removeShip(self, ship):
        del self.ships[ship.id]

    # Ship

    def repair(self, ship, repairYard):
        data = self.conn.get('/boat/repair/%d/%d/' % (ship.id, repairYard.id))
        for ryData in data['repairDockVo']:
            if int(ryData['id']) == repairYard.id:
                return datetime.fromtimestamp(int(ryData['endTime']))

    def repairComplete(self, repairYard):
        self.conn.get('/boat/repairComplete/%d/%d/' % (repairYard.id, repairYard.ship.id))

    def instantRepair(self, ship):
        self.conn.get('/boat/instantRepairShips/[%d]/' % ship.id)

    def dismantleShip(self, ship, keepEquipt = True):
        self.conn.get('/dock/dismantleBoat/[%d]/%d/' % (ship.id, (0 if keepEquipt else 1)))

    # Fleet

    def changeShips(self, fleet, ships):
        ships = [ ship.id for ship in ships ]
        ships = str(ships).replace(' ', '')
        self.conn.get('/boat/instantFleet/%d/%s/' % (fleet.id, ships))

    def changeShip(self, fleet, pos, ship):
        self.conn.get('/boat/changeBoat/%d/%d/%d/' % (fleet.id, ship.id, pos))

    def fill(self, fleet):
        ships = [ ship.id for ship in fleet.ships ]
        ships = str(ships).replace(' ', '')
        self.conn.get('/boat/supplyBoats/%s/' % ships)

    # Expedition

    def startExpedition(self, exp, fleet):
        data = self.conn.post('/explore/start/%d/%d/' % (fleet.id, exp.id), 'pve_level=1')
        for expData in data['pveExploreVo']['levels']:
            if int(expData['exploreId']) == exp.id:
                return datetime.fromtimestamp(int(expData['endTime']))
        Log.e('startExpedition: unexpected response')

    def getExpeditionResult(self, exp):
        data = self.conn.get('/explore/getResult/%d/' % exp.id)
        return (int(data['bigSuccess']) == 1), self.packer.makeResource(data['newAward'])

    # Battle

    def startStage(self, stageId, fleet):
        self.conn.post('/pve/challenge/%d/%d/0/' % (stageId, fleet.id), 'pve_level=1')

    def quitStage(self):
        # faking official client
        self.conn.get('/active/getUserData/')
        self.conn.get('/pve/getUserData/')
        self.conn.get('/campaign/getUserData/')

    def nextSpot(self):
        data = self.conn.get('/pve/next/')
        return int(data['node'])

    def searchEnemy(self, spot):
        data = self.conn.get('/pve/spy/')
        if int(data['enemyVO']['isFound']) == 0:
            return [ ]
        return [ int(ship['type']) for ship in data['enemyVO']['enemyShips'] ]

    def startBattle(self, spot, fleet, formation):
        data = self.conn.get('/pve/deal/%d/%d/%d/' % (spot, fleet.id, formation))
        selfHp = data['warReport']['hpBeforeNightWarSelf']
        enemyHp = data['warReport']['hpBeforeNightWarEnemy']
        lastSpot = (int(data['pveLevelEnd']) == 1)
        return selfHp, enemyHp, lastSpot

    def getBattleResult(self, doNightBattle):
        data = self.conn.get('/pve/getWarResult/%d/' % (1 if doNightBattle else 0))

        newShip = None
        if 'newShipVO' in data:
            newShip = self.packer.makeShip(data['newShipVO'][0])

        ships = None
        if type(data['shipVO']) is list:
            ships = [ self.packer.makeShip(shipData) for shipData in data['shipVO'] ]
        else:
            ships = [ self.packer.makeShip(data['shipVO']) ]

        return newShip, ships