Esempio n. 1
0
    def __init__(self, name, ip, port, serverip, serverport, mydata, friendsData):

        threading.Thread.__init__(self)

        self.name = name
        self.mydata = mydata
        self.friendsData = friendsData

        log(name + ": Running!")

        try:
            botSocket = nbipc.NetBotSocket(ip, port, serverip, serverport)
            self.botSocket = botSocket

            joinReply = botSocket.sendRecvMessage(
                {'type': 'joinRequest', 'name': name}, retries=300, delay=1, delayMultiplier=1)
            self.srvConf = joinReply['conf']

        except nbipc.NetBotSocketException as e:
            log(name + ": Is netbot server running at" + args.serverIP + ":" + str(args.serverPort) + "?")
            log(str(e), name + ": FAILURE")
            quit()

        log(name + ": Join server was successful. We are ready to play!")
        log(name + ": " + str(self.srvConf), "VERBOSE")
Esempio n. 2
0
def createController(ip, port, sip, sp):
    d = ViewerData()

    # POSSIBLE BUG (if you get triggered at the smallest "issues"):
    # log level for viewer are the same as they are for the bot.
    # setLogLevel(args.debug, args.verbose)
    # d.srvIP = args.serverIP
    # d.srvPort = args.serverPort
    d.srvIP = sip
    d.srvPort = sp

    log("Registering with Server: " + d.srvIP + ":" + str(d.srvPort) +
        " (this could take a few seconds)")

    try:
        d.viewerSocket = nbipc.NetBotSocket(ip, port, sip, sp)

        # this step is reeeeeally slow for some reason... must investigate
        reply = d.viewerSocket.sendRecvMessage({'type': 'addViewerRequest'})
        d.conf = reply['conf']
        log("Server Configuration: " + str(d.conf), "VERBOSE")
    except Exception as e:
        log(str(e), "FAILURE")
        quit()

    log("Server registration successful. Opening Window.")

    openWindow(d)

    return d
Esempio n. 3
0
def main():
    global d
    
    d = ViewerData()

    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,
                                    epilog="Note: pressing the space bar activates a 7 second long instant replay at the default step speed. "
                                     + "Live action will resume after the replay completes.")
    parser.add_argument('-ip', metavar='My IP', dest='myIP', type=nbipc.argParseCheckIPFormat, nargs='?',
                        default='127.0.0.1', help='My IP Address')
    parser.add_argument('-p', metavar='My Port', dest='myPort', type=int, nargs='?',
                        default=20010, help='My port number')
    parser.add_argument('-sip', metavar='Server IP', dest='serverIP', type=nbipc.argParseCheckIPFormat, nargs='?',
                        default='127.0.0.1', help='Server IP Address')
    parser.add_argument('-sp', metavar='Server Port', dest='serverPort', type=int, nargs='?',
                        default=20000, help='Server port number')
    parser.add_argument('-randcolors', dest='randomColors', action='store_true',
                        default=False, help='Randomizes bot colors in viewer')
    parser.add_argument('-debug', dest='debug', action='store_true',
                        default=False, help='Print DEBUG level log messages.')
    parser.add_argument('-verbose', dest='verbose', action='store_true',
                        default=False, help='Print VERBOSE level log messages. Note, -debug includes -verbose.')
    args = parser.parse_args()
    setLogLevel(args.debug, args.verbose)
    d.srvIP = args.serverIP
    d.srvPort = args.serverPort

    log("Registering with Server: " + d.srvIP + ":" + str(d.srvPort))

    try:
        d.viewerSocket = nbipc.NetBotSocket(args.myIP, args.myPort, d.srvIP, d.srvPort)
        reply = d.viewerSocket.sendRecvMessage({'type': 'addViewerRequest'}, retries=60, delay=1, delayMultiplier=1)
        d.conf = reply['conf']
        log("Server Configuration: " + str(d.conf), "VERBOSE")
    except Exception as e:
        log(str(e), "FAILURE")
        quit()

    log("Server registration successful. Opening Window.")
    
    if args.randomColors:
        random.shuffle(d.colors)
        
    openWindow(d)
Esempio n. 4
0
def main():
    global botSocket  # This is global so quit() can print stats in botSocket
    global robotName

    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('-ip', metavar='My IP', dest='myIP', type=nbipc.argParseCheckIPFormat, nargs='?',
                        default='127.0.0.1', help='My IP Address')
    parser.add_argument('-p', metavar='My Port', dest='myPort', type=int, nargs='?',
                        default=20010, help='My port number')
    parser.add_argument('-sip', metavar='Server IP', dest='serverIP', type=nbipc.argParseCheckIPFormat, nargs='?',
                        default='127.0.0.1', help='Server IP Address')
    parser.add_argument('-sp', metavar='Server Port', dest='serverPort', type=int, nargs='?',
                        default=20000, help='Server port number')
    parser.add_argument('-debug', dest='debug', action='store_true',
                        default=False, help='Print DEBUG level log messages.')
    parser.add_argument('-verbose', dest='verbose', action='store_true',
                        default=False, help='Print VERBOSE level log messages. Note, -debug includes -verbose.')
    args = parser.parse_args()
    setLogLevel(args.debug, args.verbose)

    try:
        botSocket = nbipc.NetBotSocket(args.myIP, args.myPort, args.serverIP, args.serverPort)
        joinReply = botSocket.sendRecvMessage({'type': 'joinRequest', 'name': robotName}, retries=300, delay=1, delayMultiplier=1)
    except nbipc.NetBotSocketException as e:
        log("Is netbot server running at" + args.serverIP + ":" + str(args.serverPort) + "?")
        log(str(e), "FAILURE")
        quit()

    log("Join server was successful. We are ready to play!")

    # the server configuration tells us all about how big the arena is and other useful stuff.
    srvConf = joinReply['conf']
    log(str(srvConf), "VERBOSE")

    # Now we can play, but we may have to wait for a game to start.
    play(botSocket, srvConf)
Esempio n. 5
0
def main():
    global d  # d is global so quit() can access it.
    d = SrvData()

    random.seed()

    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('-ip', metavar='Server_IP', dest='serverIP', type=nbipc.argParseCheckIPFormat,
                        default='127.0.0.1', help='My IP Address')
    parser.add_argument('-p', metavar='Server_Port', dest='serverPort', type=int,
                        default=20000, help='My port number')
    parser.add_argument('-name', metavar='Server_Name', dest='serverName', type=str,
                        default="Netbots Server", help='Name displayed by connected viewers.')
    parser.add_argument('-games', metavar='int', dest='gamesToPlay', type=int,
                        default=10, help='Games server will play before quiting.')
    parser.add_argument('-bots', metavar='int', dest='botsInGame', type=int,
                        default=4, help='Number of bots required to join before game can start.')
    parser.add_argument('-stepsec', metavar='sec', dest='stepSec', type=float,
                        default=0.05, help='How many seconds between server steps.')
    parser.add_argument('-stepmax', metavar='int', dest='stepMax', type=int,
                        default=1000, help='Max steps in one game.')
    parser.add_argument('-droprate', metavar='int', dest='dropRate', type=int,
                        default=11, help='Drop over nth message, best to use primes. 0 == no drop.')
    parser.add_argument('-msgperstep', metavar='int', dest='botMsgsPerStep', type=int,
                        default=4, help='Number of msgs from a bot that server will respond to each step.')
    parser.add_argument('-arenasize', dest='arenaSize', type=int, min=100, max=32767, action=Range,
                        default=1000, help='Size of arena.')
    parser.add_argument('-botradius', metavar='int', dest='botRadius', type=int,
                        default=25, help='Radius of robots.')
    parser.add_argument('-explradius', metavar='int', dest='explRadius', type=int,
                        default=75, help='Radius of explosions.')
    parser.add_argument('-botmaxspeed', metavar='int', dest='botMaxSpeed', type=int,
                        default=5, help="Robot distance traveled per step at 100%% speed")
    parser.add_argument('-botaccrate', metavar='float', dest='botAccRate', type=float,
                        default=2.0, help='%% robot can accelerate (or decelerate) per step')
    parser.add_argument('-shellspeed', metavar='int', dest='shellSpeed', type=int,
                        default=40, help='Distance traveled by shell per step.')
    parser.add_argument('-hitdamage', metavar='int', dest='hitDamage', type=int,
                        default=10, help='Damage a robot takes from hitting wall or another bot.')
    parser.add_argument('-expldamage', metavar='int', dest='explDamage', type=int,
                        default=10, help='Damage bot takes from direct hit from shell.')
    parser.add_argument('-obstacles', metavar='int', dest='obstacles', type=int,
                        default=0, help='How many obstacles does the arena have.')
    parser.add_argument('-obstacleradius', metavar='int', dest='obstacleRadius', type=int,
                        default=5, help='Radius of obstacles as %% of arenaSize.')
    parser.add_argument('-jamzones', metavar='int', dest='jamZones', type=int,
                        default=0, help='How many jam zones does the arena have.')
    parser.add_argument('-allowclasses', dest='allowClasses', action='store_true',
                        default=False, help='Allow robots to specify a class other than default.')
    parser.add_argument('-simplecollisions', dest='simpleCollisions', action='store_true',
                        default=False, help='Uses the simple collision system, damage taken is the same as -hitdamage')
    parser.add_argument('-startperms', dest='startPermutations', action='store_true',
                        default=False, help='Use all permutations of each set of random start locations.')
    parser.add_argument('-scanmaxdistance', metavar='int', dest='scanMaxDistance', type=int,
                        default=1415, help='Maximum distance a scan can detect a robot.')
    parser.add_argument('-noviewers', dest='noViewers', action='store_true',
                        default=False, help='Do not allow viewers.')
    parser.add_argument('-maxsecstojoin', metavar='int', dest='maxSecsToJoin', type=int,
                        default=300, help='Max seconds server will wait for all bots to join before quiting.')
    parser.add_argument('-onlylastsb', dest='onlyLastSb', action='store_true',
                        default=False, help='Only print the scoreboard when the server quits.')
    parser.add_argument('-jsonsb', metavar='filename', dest='jsonScoreboard', type=str,
                        default=False, help='Save json formatted server data to filename before quiting.')
    parser.add_argument('-debug', dest='debug', action='store_true',
                        default=False, help='Print DEBUG level log messages.')
    parser.add_argument('-verbose', dest='verbose', action='store_true',
                        default=False, help='Print VERBOSE level log messages. Note, -debug includes -verbose.')
    args = parser.parse_args()

    setLogLevel(args.debug, args.verbose)
    d.conf['serverName'] = args.serverName
    d.conf['gamesToPlay'] = args.gamesToPlay
    d.conf['botsInGame'] = args.botsInGame
    d.conf['stepSec'] = args.stepSec
    d.conf['stepMax'] = args.stepMax
    d.conf['dropRate'] = args.dropRate
    d.state['dropNext'] = args.dropRate
    d.conf['botMsgsPerStep'] = args.botMsgsPerStep
    d.conf['arenaSize'] = args.arenaSize
    d.conf['botRadius'] = args.botRadius
    d.conf['explRadius'] = args.explRadius
    d.conf['botMaxSpeed'] = args.botMaxSpeed
    d.conf['botAccRate'] = args.botAccRate
    d.conf['shellSpeed'] = args.shellSpeed
    d.conf['hitDamage'] = args.hitDamage
    d.conf['explDamage'] = args.explDamage
    d.conf['obstacleRadius'] = args.obstacleRadius
    d.conf['obstacles'] = mkObstacles(d, args.obstacles)
    d.conf['jamZones'] = mkJamZones(d, args.jamZones)
    d.conf['allowClasses'] = args.allowClasses
    d.conf['simpleCollisions'] = args.simpleCollisions
    d.conf['startPermutations'] = args.startPermutations
    d.conf['scanMaxDistance'] = args.scanMaxDistance
    d.conf['noViewers'] = args.noViewers
    d.conf['maxSecsToJoin'] = args.maxSecsToJoin
    d.state['onlyLastSb'] = args.onlyLastSb
    d.state['jsonScoreboard'] = args.jsonScoreboard

    mkStartLocations(d)

    log("Server Name: " + d.conf['serverName'])
    log("Server Version: " + d.conf['serverVersion'])
    log("Argument List:" + str(sys.argv))

    log("Server Configuration: " + str(d.conf), "VERBOSE")

    try:
        d.srvSocket = nbipc.NetBotSocket(args.serverIP, args.serverPort)
    except Exception as e:
        log(str(e), "FAILURE")
        quit()

    nextStepAt = time.perf_counter() + d.conf['stepSec']
    while True:
        aliveBots = 0
        for src, bot in d.bots.items():
            if bot['health'] != 0:
                aliveBots += 1

        # only count slow steps if we actually process a step this time around.
        countSlowStep = False

        if aliveBots > 0:  # if there is an ongoing game
            countSlowStep = True
            step(d)
        elif len(d.bots) == d.conf['botsInGame']:  # if we have enough bots to start playing
            if not d.state['tourStartTime']:
                d.state['tourStartTime'] = time.time()

            if d.conf['gamesToPlay'] != d.state['gameNumber']:
                if not d.state['onlyLastSb']:
                    logScoreboard(d)
                initGame(d)
            else:
                log("All games have been played.")
                jsonScoreboard(d)
                quit()
        elif d.conf['maxSecsToJoin'] < float(time.time() - d.state['startTime']): 
            log("Not enough bots joined game before max seconds to join (" + str(d.conf['maxSecsToJoin']) + " secs).", "ERROR")
            if len(d.bots) >= 2:
                d.conf['botsInGame'] = len(d.bots)
                log("Starting game with only " + str(d.conf['botsInGame']) + " bots.", "WARNING")
            else:
                log("Cannot start game with less than 2 bots. Exiting.", "FAILURE")
                quit()

        recvReplyMsgs(d)

        sendToViwers(d)

        ptime = time.perf_counter()
        if ptime < nextStepAt:
            d.state['sleepCount'] += 1
            d.state['sleepTime'] += nextStepAt - ptime
            while ptime < nextStepAt:
                ptime = time.perf_counter()
        elif countSlowStep:
            d.state['longStepCount'] += 1
            log("Server running slower than " + str(d.conf['stepSec']) + " sec/step.", "VERBOSE")

        nextStepAt = ptime + d.conf['stepSec']
Esempio n. 6
0
def main():
    q = Queue()  # mouse event queue
    arenaSize = 0
    mouseDown = False  # whether mouse button is pressed
    waiting = False  # whether waiting for explosion
    global botSocket  # This is global so quit() can print stats in botSocket
    global robotName
    global upKey
    global downKey
    global leftKey
    global rightKey
    global steering
    global controller

    # mmmmmm closure why do I do this?
    def mousePressHandler(event):
        nonlocal q
        nonlocal arenaSize
        nonlocal mouseDown
        nonlocal waiting
        global controller
        mousePos = {"x": 0, "y": 0}

        mouseDown = True

        # event.x and event.y are in canvas coordinates, which are from
        # the top left corner and are in terms of the canvas size. We want
        # a location within arenaSize
        ratio = arenaSize / controller.canvas.winfo_width()

        mousePos["x"] = event.x * ratio

        # TOP left corner, remember?
        mousePos["y"] = (controller.canvas.winfo_width() - event.y) * ratio

        q.put({"mousePos": mousePos})
        q.put({"mouseDown": True})  # put this after or weird things happen

    def mouseMoveHandler(event):
        nonlocal arenaSize
        nonlocal mouseDown
        global controller
        mousePos = {"x": 0, "y": 0}

        if (mouseDown):
            canvasSize = controller.canvas.winfo_width()
            ratio = arenaSize / canvasSize
            mousePos["x"] = event.x * ratio
            mousePos["y"] = (canvasSize - event.y) * ratio
            q.put({"mousePos": mousePos})

    def mouseReleaseHandler(event):
        nonlocal mouseDown

        mouseDown = False
        q.put({"mouseDown": False})

    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('-ip',
                        metavar='My IP',
                        dest='myIP',
                        type=nbipc.argParseCheckIPFormat,
                        nargs='?',
                        default='127.0.0.1',
                        help='My IP Address')
    parser.add_argument('-p',
                        metavar='My Port',
                        dest='myPort',
                        type=int,
                        nargs='?',
                        default=20010,
                        help='My port number')
    parser.add_argument('-sip',
                        metavar='Server IP',
                        dest='serverIP',
                        type=nbipc.argParseCheckIPFormat,
                        nargs='?',
                        default='127.0.0.1',
                        help='Server IP Address')
    parser.add_argument('-sp',
                        metavar='Server Port',
                        dest='serverPort',
                        type=int,
                        nargs='?',
                        default=20000,
                        help='Server port number')
    parser.add_argument('-debug',
                        dest='debug',
                        action='store_true',
                        default=False,
                        help='Print DEBUG level log messages.')
    parser.add_argument(
        '-verbose',
        dest='verbose',
        action='store_true',
        default=False,
        help='Print VERBOSE level log messages. Note, -debug includes -verbose.'
    )
    parser.add_argument("-vp",
                        metavar="Viewer/Controller Port",
                        dest="viewerPort",
                        type=int,
                        nargs="?",
                        default=20018,
                        help="Viewer/Controller port number")

    # account for movement keys
    parser.add_argument("-up",
                        metavar="Up Key",
                        dest="upKey",
                        type=str,
                        nargs="?",
                        default="Up",
                        help="Up movement key")
    parser.add_argument("-down",
                        metavar="Down Key",
                        dest="downKey",
                        type=str,
                        nargs="?",
                        default="Down",
                        help="Down movement key")
    parser.add_argument("-left",
                        metavar="Left Key",
                        dest="leftKey",
                        type=str,
                        nargs="?",
                        default="Left",
                        help="Left movement key")
    parser.add_argument("-right",
                        metavar="Right Key",
                        dest="rightKey",
                        type=str,
                        nargs="?",
                        default="Right",
                        help="Right movement key")

    # determine whether should use directional movement or steering
    parser.add_argument('-directional',
                        dest='directional',
                        action='store_true',
                        default=False,
                        help='Use directional movement instead of steering')

    args = parser.parse_args()
    setLogLevel(args.debug, args.verbose)

    upKey = args.upKey
    downKey = args.downKey
    leftKey = args.leftKey
    rightKey = args.rightKey
    if (args.directional):
        steering = False

    try:
        botSocket = nbipc.NetBotSocket(args.myIP, args.myPort, args.serverIP,
                                       args.serverPort)
        joinReply = botSocket.sendRecvMessage({
            'type': 'joinRequest',
            'name': robotName
        })
    except nbipc.NetBotSocketException as e:
        log("Is netbot server running at" + args.serverIP + ":" +
            str(args.serverPort) + "?")
        log(str(e), "FAILURE")
        quit()

    log("Join server was successful. We are ready to play!")

    #the server configuration tells us all about how big the arena is and other useful stuff.
    srvConf = joinReply['conf']
    log(str(srvConf), "VERBOSE")

    # controller is a viewer that needs information: but the IP and port
    # info must NOT BE THE SAME as the bot's, otherwise the server will boot us
    controller = botctrl.createController(args.myIP, args.viewerPort,
                                          args.serverIP, args.serverPort)

    # Don't snitch to Ms. Wear that I didn't use proper encapsulation
    controller.window.title("NetBots (Controlling " + robotName + ")")

    # set key handling functions
    controller.setKeyPressHandler(keyPressHandler)
    controller.setKeyReleaseHandler(keyReleaseHandler)
    arenaSize = srvConf["arenaSize"]
    controller.setMousePressHandler(mousePressHandler)
    controller.setMouseMoveHandler(mouseMoveHandler)
    controller.setMouseReleaseHandler(mouseReleaseHandler)

    #Now we can play, but we may have to wait for a game to start.
    playThread = threading.Thread(target=play, args=(botSocket, srvConf, q))
    playThread.start()

    # start updating window
    # use controller.window.mainloop() for a simpler click to shoot, and no dir lines
    # otherwise you probably want something like:
    # while(playThread.is_alive()):
    #     # optional: dir line should go here
    #     controller.window.update()
    controller.window.mainloop()

    # I have no idea what happens here. I think this is what you do...
    playThread.join()
    controller.window.destroy()
Esempio n. 7
0
def main():
    d = ViewerData()

    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('-ip',
                        metavar='My IP',
                        dest='myIP',
                        type=nbipc.argParseCheckIPFormat,
                        nargs='?',
                        default='127.0.0.1',
                        help='My IP Address')
    parser.add_argument('-p',
                        metavar='My Port',
                        dest='myPort',
                        type=int,
                        nargs='?',
                        default=20010,
                        help='My port number')
    parser.add_argument('-sip',
                        metavar='Server IP',
                        dest='serverIP',
                        type=nbipc.argParseCheckIPFormat,
                        nargs='?',
                        default='127.0.0.1',
                        help='Server IP Address')
    parser.add_argument('-sp',
                        metavar='Server Port',
                        dest='serverPort',
                        type=int,
                        nargs='?',
                        default=20000,
                        help='Server port number')
    parser.add_argument('-debug',
                        dest='debug',
                        action='store_true',
                        default=False,
                        help='Print DEBUG level log messages.')
    parser.add_argument(
        '-verbose',
        dest='verbose',
        action='store_true',
        default=False,
        help='Print VERBOSE level log messages. Note, -debug includes -verbose.'
    )
    args = parser.parse_args()
    setLogLevel(args.debug, args.verbose)
    d.srvIP = args.serverIP
    d.srvPort = args.serverPort

    log("Registering with Server: " + d.srvIP + ":" + str(d.srvPort))

    try:
        d.viewerSocket = nbipc.NetBotSocket(args.myIP, args.myPort, d.srvIP,
                                            d.srvPort)
        reply = d.viewerSocket.sendRecvMessage({'type': 'addViewerRequest'})
        d.conf = reply['conf']
        log("Server Configuration: " + str(d.conf), "VERBOSE")
    except Exception as e:
        log(str(e), "FAILURE")
        quit()

    log("Server registration successful. Opening Window.")

    openWindow(d)