Example #1
0
def startgame():
    """Start off the game."""
    global playerorder, currentplayer
    
    if phase != "Pregame":
        return False
    if len(players) < 2:
        riskgui.set_status("Not enough players")
        return False
    if len(players) > 6:
        riskgui.set_status("Too many players - 6 maximum")
        return False
    
    setphase("Preposition")
    
    createcards()
    for pl in players.values():
        pl.freeArmies = 50 - 5 * len(players)
    playerorder = players.values()[:]
    random.shuffle(playerorder)
    currentplayer = playerorder[0]
    riskgui.relistplayers(playerorder)
    riskgui.playersturn(currentplayer.name)
    riskgui.set_armies(currentplayer.freeArmies)
    
    while currentplayer.ai is not None and currentplayer.freeArmies > 0:
        currentplayer.ai.run_preplace(currentplayer)
        rotateplayers()
        riskgui.set_armies(currentplayer.freeArmies)
    
    if currentplayer.ai is not None:
        resetturn()
        nextturn()
    
    return True
Example #2
0
def handle_network():
    """Repeatedly handle input from the network"""
    global line
    if am_server:
        for s in sockets:
            while 1:
                lin = None
                try:
                    lin = s.readline()
                except:
                    (ErrorType, ErrorValue, ErrorTB)=sys.exc_info()
                    riskgui.set_status("A client disconnected.")
                if lin:
                    server_receive_message(lin, s)
                else:
                    break
    if am_client:
        while 1:
            lin = None
            try:
                lin = serv_sock.readline()
            except:
                (ErrorType, ErrorValue, ErrorTB)=sys.exc_info()
                riskgui.set_status("Connection broken.")
                return
            if lin:
                client_receive_message(lin, serv_sock)
            else:
                break  
    riskgui.root.after(50, handle_network)
Example #3
0
def turnincards(player, cards):
    """Turn in a set of cards."""
    if phase != "Place":
        return
    
    for c in cards:
        if not c in player.cards:
            return
    
    cards.sort(lambda a, b: cmp(a.picture, b.picture))
    
    card_set = CardSet(cards)
    value = card_set.value()
    if value is None: return
    
    for c in cards:
        if territories[c.territory].player == player:
            value += 2
    
    player.freeArmies += value
    
    for c in cards:
        allcards.append(c)
        for ca in player.cards:
            if c == ca:
                player.cards.remove(ca)
    
    riskgui.set_status("[%s] Card Set: %d" % (player.name, value))
    riskgui.set_armies(currentplayer.freeArmies)
Example #4
0
def real_nextturn():
    """Hidden method to really move on."""
    global phase, selected
    
    if selected is not None:
        riskgui.drawterritory(selected, 0)
        selected = None
    
    if currentplayer.conqueredTerritory == 1:
        if len(allcards) != 0: #too bad otherwise
            handcard = random.choice(allcards)
            currentplayer.cards.append(handcard)
            allcards.remove(handcard)
        currentplayer.conqueredTerritory = 0
        
    rotateplayers()
    riskgui.set_status("=== %s's Turn ===" % currentplayer.name)
    
    currentplayer.freeArmies += len(currentplayer.territories()) // 3
    for c in continents.values():
        existing = [t for t in territories.values() if t.continent == c]
        unowned = [t for t in existing if t.player != currentplayer]
        if len(existing) != 0 and len(unowned) == 0 :
            currentplayer.freeArmies += c.value
    
    riskgui.set_status("[%s] armies from territories: %d" % (currentplayer.name, currentplayer.freeArmies))
    riskgui.set_armies(currentplayer.freeArmies)
    
    setphase("Place")
Example #5
0
def real_nextturn():
    """Hidden method to really move on."""
    global phase, selected

    if selected is not None:
        riskgui.drawterritory(selected, 0)
        selected = None

    if currentplayer.conqueredTerritory == 1:
        if len(allcards) != 0:  #too bad otherwise
            handcard = random.choice(allcards)
            currentplayer.cards.append(handcard)
            risknetwork.add_card(handcard, currentplayer)
            allcards.remove(handcard)
        currentplayer.conqueredTerritory = 0

    rotateplayers()
    riskgui.set_status("It is now " + currentplayer.name + "'s turn.")

    currentplayer.freeArmies += max(3, len(currentplayer.territories()) // 3)
    for c in continents:
        existing = [x for x in territories.values() if x.continent == c[0]]
        unowned = [x for x in existing if x.player != currentplayer]
        if len(existing) != 0 and len(unowned) == 0:
            currentplayer.freeArmies += c[1]
    riskgui.set_armies(currentplayer.freeArmies)

    setphase("Place")
Example #6
0
def real_nextturn():
    """Hidden method to really move on."""
    global phase, selected
    
    if selected is not None:
        riskgui.drawterritory(selected, 0)
        selected = None
    
    if currentplayer.conqueredTerritory == 1:
        if len(allcards) != 0: #too bad otherwise
            handcard = random.choice(allcards)
            currentplayer.cards.append(handcard)
            risknetwork.add_card(handcard, currentplayer)
            allcards.remove(handcard)
        currentplayer.conqueredTerritory = 0
        
    rotateplayers()
    riskgui.set_status("It is now " + currentplayer.name + "'s turn.")
    
    currentplayer.freeArmies += max(3, len(currentplayer.territories()) // 3)
    for c in continents:
        existing = [x for x in territories.values() if x.continent == c[0]]
        unowned = [x for x in existing if x.player != currentplayer]
        if len(existing) != 0 and len(unowned) == 0 :
            currentplayer.freeArmies += c[1]
    riskgui.set_armies(currentplayer.freeArmies)            
            
    setphase("Place")
Example #7
0
def load_game(filename):
    """Load a previously-saved game."""
    global currentplayer, phase, currentplayernum
    if phase != "Pregame":
        riskgui.set_status("You have already started a game")
        return
    
    savefile = open(filename)
    while savefile.readline() == "player\n":
        plname = savefile.readline().strip()
        plarmies = int(savefile.readline().strip())
        plconquered = int(savefile.readline().strip())
        cards = []
        currentline = savefile.readline()
        while currentline != "endplayer\n" and currentline != "ai\n":
            nline = savefile.readline().strip()
            cards.append(Card(currentline.strip(),nline))
            currentline = savefile.readline()
        ainame = None
        if currentline == "ai\n":
            ainame = savefile.readline().strip()
            aidatalen = int(savefile.readline().strip())
            aidata = savefile.read(aidatalen)
            savefile.readline()
        if not players.has_key(plname):
            if ainame and not os.path.exists(ainame):
                riskgui.set_status("AI " + ainame + " nonexistent")
                ainame = None
            riskgui.makeplayercolors(makeplayer(plname, ainame))
            if ainame:
                players[plname].ai.loaddata(aidata)
        players[plname].freeArmies = plarmies
        players[plname].conqueredTerritory = plconquered
        players[plname].cards = cards
        playerorder.append(players[plname])
    riskgui.relistplayers(playerorder)
    currentplayer = players[savefile.readline().strip()]
    currentplayernum = playerorder.index(currentplayer)
    riskgui.set_armies(currentplayer.freeArmies)
    riskgui.playersturn(currentplayer.name)
    setphase(savefile.readline().strip())
    
    while savefile.readline().strip() == "territory":
        tname = savefile.readline().strip()
        tplayer = savefile.readline().strip()
        if tplayer == "None":
            tplayer = None
        else:
            tplayer = players[tplayer]
        territories[tname].player = tplayer
        territories[tname].armies = int(savefile.readline().strip())
        riskgui.drawterritory(territories[tname], 0)
        savefile.readline()
    
    while 1:
        cardterr = savefile.readline().strip()
        if not cardterr:
            break
        allcards.append(Card(cardterr,savefile.readline().strip()))
    savefile.close()
Example #8
0
def handle_network():
    """Repeatedly handle input from the network"""
    global line
    if am_server:
        for s in sockets:
            while 1:
                lin = None
                try:
                    lin = s.readline()
                except:
                    (ErrorType, ErrorValue, ErrorTB) = sys.exc_info()
                    riskgui.set_status("A client disconnected.")
                if lin:
                    server_receive_message(lin, s)
                else:
                    break
    if am_client:
        while 1:
            lin = None
            try:
                lin = serv_sock.readline()
            except:
                (ErrorType, ErrorValue, ErrorTB) = sys.exc_info()
                riskgui.set_status("Connection broken.")
                return
            if lin:
                client_receive_message(lin, serv_sock)
            else:
                break
    riskgui.root.after(50, handle_network)
Example #9
0
 def send(self, data):
     """Send some data"""
     if self.fine == 1:
         try:
             socket.socket.send(self, data)
         except socket.error, (ErrorValue, ErrorTB):
             self.fine = 0
             riskgui.set_status("Connection broken.")
Example #10
0
def binder():
    """Get connections to the server"""
    serv_sock.listen(1)
    while 1:
        q, v = serv_sock.accept()
        q.setblocking(0)
        sockets.append(q)
        riskgui.set_status("Got connection")
Example #11
0
def binder():
    """Get connections to the server"""
    serv_sock.listen(1)
    while 1:
        q, v = serv_sock.accept()
        q.setblocking(0)        
        sockets.append(q)
        riskgui.set_status("Got connection")
Example #12
0
 def send(self, data):
     """Send some data"""
     if self.fine == 1:
         try:
             socket.socket.send(self, data)
         except socket.error, (ErrorValue, ErrorTB):
             self.fine = 0
             riskgui.set_status("Connection broken.")
Example #13
0
def sendparts(sck, *parts):
    """Send the combined parts of the message to the specified socket"""
    try:
        sck.send(" ".join(str(a).replace("-", "-0").replace(" ", "-1").replace("\n", "-2") for a in parts) + "\n")
    except socket.error, (ErrorValue, ErrorTB):
        if ErrorValue == 10035:
            time.sleep(1)
            sendparts(sck, *parts)
        else:
            riskgui.set_status("Connection broken.")
            raise
Example #14
0
def sendparts(sck, *parts):
    """Send the combined parts of the message to the specified socket"""
    try:
        sck.send(" ".join(str(a).replace("-","-0").replace(" ","-1").replace("\n","-2") for a in parts) + "\n")
    except socket.error, (ErrorValue, ErrorTB):
        if ErrorValue == 10035:
            time.sleep(1)
            sendparts(sck, *parts)
        else:
            riskgui.set_status("Connection broken.")
            raise
Example #15
0
def client_receive_message(mess, sock):
    """Run when the client receives a message."""
    global clplayer, am_client
    print >>riskengine.verbosefile, mess, "client received"
    parts = splitparms(mess)
    if parts[0] == "draw_army" or parts[0] == "draw_territory":
        terr = riskengine.territories[parts[1]]
        terr.armies = int(parts[2])
        terr.player = riskengine.players[parts[3]]
        if parts[0] == "draw_army":
            riskgui.drawarmy(terr)
        else:
            riskgui.drawterritory(terr, int(parts[4]))
    if parts[0] == "set_armies":
        riskgui.set_armies(int(parts[1]))
    if parts[0] == "won_game":
        riskgui.won_game(parts[1])
    if parts[0] == "playersturn":
        riskgui.playersturn(parts[1])
    if parts[0] == "set_status":
        riskgui.set_status(parts[1])
    if parts[0] == "newplayer":
        riskgui.net_newplayer(parts[1])
    if parts[0] == "removeplayer":
        riskgui.removeplayer(parts[1])
    if parts[0] == "relistplayers":
        riskgui.relistplayers([riskengine.players[p] for p in parts[1:]])
    if parts[0] == "set_phase":
        riskengine.setphase(parts[1])
    if parts[0] == "add_card":
        riskengine.players[parts[3]].cards.append(riskengine.Card(parts[2], parts[1]))
    if parts[0] == "remove_card":
        foundcard = 0
        for n in riskengine.players[parts[3]].cards:
            if n.territory == parts[2]:
                riskengine.players[parts[3]].cards.remove(n)
                foundcard = 1
                break
        if foundcard == 0:
            print >>riskengine.verbosefile, "Couldn't find card"
            print >>riskengine.verbosefile, "players' cards:", riskengine.players[parts[3]].cards
        # riskengine.players[parts[3]].cards.remove(riskengine.card(parts[2], parts[1]))
    if parts[0] == "message":
        riskgui.set_status(parts[2] + " sent message: " + parts[1])
    if parts[0] == "leaving":
        riskgui.show_status_message("The server has left.")
        serv_sock.close()
        am_client = 0
Example #16
0
def client_receive_message(mess, sock):
    """Run when the client receives a message."""
    global clplayer, am_client
    print >>riskengine.verbosefile, mess, "client received"
    parts = splitparms(mess)
    if parts[0] == "draw_army" or parts[0] == "draw_territory":
        terr = riskengine.territories[parts[1]]
        terr.armies = int(parts[2])
        terr.player = riskengine.players[parts[3]]
        if parts[0] == "draw_army":
            riskgui.drawarmy(terr)
        else:
            riskgui.drawterritory(terr, int(parts[4]))
    if parts[0] == "set_armies":
        riskgui.set_armies(int(parts[1]))
    if parts[0] == "won_game":
        riskgui.won_game(parts[1])
    if parts[0] == "playersturn":
        riskgui.playersturn(parts[1])
    if parts[0] == "set_status":
        riskgui.set_status(parts[1])
    if parts[0] == "newplayer":
        riskgui.net_newplayer(parts[1])
    if parts[0] == "removeplayer":
        riskgui.removeplayer(parts[1])   
    if parts[0] == "relistplayers":
        riskgui.relistplayers([riskengine.players[p] for p in parts[1:]])
    if parts[0] == "set_phase":
        riskengine.setphase(parts[1])
    if parts[0] == "add_card":
        riskengine.players[parts[3]].cards.append(riskengine.Card(parts[2], parts[1]))
    if parts[0] == "remove_card":
        foundcard = 0
        for n in riskengine.players[parts[3]].cards:
            if n.territory == parts[2]:
                riskengine.players[parts[3]].cards.remove(n)
                foundcard = 1
                break
        if foundcard == 0:
            print >>riskengine.verbosefile, "Couldn't find card"
            print >>riskengine.verbosefile, "players' cards:", riskengine.players[parts[3]].cards
        #riskengine.players[parts[3]].cards.remove(riskengine.card(parts[2], parts[1]))
    if parts[0] == "message":
        riskgui.set_status(parts[2] + " sent message: " + parts[1])
    if parts[0] == "leaving":
        riskgui.show_status_message("The server has left.")
        serv_sock.close()
        am_client = 0
Example #17
0
def startfortifying():
    """Handle when the player wants to start fortifying."""
    global armiesfrom, armiesto, selected
    
    if phase == "Pregame" or phase == "Preposition" or phase == "Fortifying" or (
                                 phase != "Attack" and 
                                 currentplayer.freeArmies > 0):
        riskgui.set_status("No can do")
        return
    
    if selected is not None:
        riskgui.drawterritory(selected, 0)
        selected = None
    setphase("Fortifying")
    riskgui.set_status("Now fortifying...")
    armiesfrom = None
    armiesto = None
Example #18
0
def nextturn():
    """Move on to the next turn."""
    if phase == "Pregame":
        return
    
    if currentplayer.freeArmies > 0:
        riskgui.set_status("You must position all your armies first")
        return
    real_nextturn()
    while currentplayer.ai is not None:
        if len(players) == 1:
            riskgui.set_status(currentplayer.name + " won!")
            return
        setphase("Place")
        currentplayer.ai.run_place(currentplayer)
        setphase("Attack")
        currentplayer.ai.run_attack(currentplayer)
        real_nextturn()
Example #19
0
def nextturn():
    """Move on to the next turn."""
    if phase == "Pregame":
        return
    if risknetwork.next_turn():
        return
    if currentplayer.freeArmies > 0:
        riskgui.set_status("You must position all your armies first")
        return
    real_nextturn()
    while currentplayer.ai is not None:
        if len(players) == 1:
            riskgui.set_status(currentplayer.name + " won!")
            return
        setphase("Place")
        currentplayer.ai.run_place(currentplayer)
        setphase("Attack")
        currentplayer.ai.run_attack(currentplayer)
        real_nextturn()
Example #20
0
def handle_attack(defender):
    """Handle the attack phase."""
    global armiesto, selected
    if defender.player == currentplayer:
        return
    attacker = selected
    attack(attacker, defender)

    if defender.player == currentplayer and attacker.armies > 1: #we won
        riskgui.set_status(currentplayer.name + " won the territory - move armies into it")
        armiesto = defender
        setphase("WonAttack")
        
    if defender.player == currentplayer and attacker.armies == 1:
        riskgui.set_status(currentplayer.name + " won the territory")
        riskgui.drawterritory(attacker, 0)
        selected = None
    else:
        riskgui.drawterritory(attacker, 1)
    riskgui.drawterritory(defender, 0)
Example #21
0
def handle_fortifying(terr, button):
    """Handle the fortification phase."""
    global armiesfrom, armiesto
    if terr.player != currentplayer:
        return
    if armiesfrom is not None and armiesto is not None and \
       (selected != armiesfrom or terr != armiesto):
        riskgui.set_status("You can only fortify from one place to one space per turn.")
        return
    if not selected.neighboring(terr):
        return
        
    moving = min(selected.armies - 1, (button == 3) and 5 or 1)
    if moving:
        selected.armies -= moving
        terr.armies += moving
        armiesfrom = selected
        armiesto = terr
        riskgui.drawterritory(armiesfrom, 1)
        riskgui.drawterritory(armiesto, 0)
Example #22
0
def handle_place(terr, button):
    """Handle the placing of the armies before a turn."""
    if terr.player != currentplayer:
        return 1
    if currentplayer.freeArmies > 0:
        if button == 3:
            currentplayer.place_army(terr, min(5, currentplayer.freeArmies))
        else:
            currentplayer.place_army(terr)
        riskgui.drawarmy(terr)
        riskgui.set_armies(currentplayer.freeArmies)
        return 1
    else:
        if len(currentplayer.cards) >= 5:
            riskgui.set_status("You must turn in cards to attack")
            return 1
        riskgui.set_status("Moving to Attack")
        setphase("Attack")
        print >> verbosefile, "Attacking"
        return 0
Example #23
0
def handle_place(terr, button):
    """Handle the placing of the armies before a turn."""
    if terr.player != currentplayer:
        return 1
    if currentplayer.freeArmies > 0:
        if button == 3:
            currentplayer.place_army(terr, min(5, currentplayer.freeArmies))
        else:
            currentplayer.place_army(terr)
        riskgui.drawarmy(terr)
        riskgui.set_armies(currentplayer.freeArmies)
        return 1
    else:
        if len(currentplayer.cards) >= 5:
            riskgui.set_status("You must turn in cards to attack")
            return 1
        riskgui.set_status("Moving to Attack")
        setphase("Attack")
        print >>verbosefile, "Attacking"
        return 0
Example #24
0
def server_receive_message(mess, sock):
    """Run when the server receives a message"""
    print >>riskengine.verbosefile, mess, "server received"
    parts = splitparms(mess)
    if parts[0] == "newplayer":
        riskgui.net_newplayer(parts[1])
        riskengine.players[parts[1]].connection = sock
        for sck in sockets:
            if sck != sock:
                sendparts(sck, "newplayer", parts[1])
    if parts[0] == "handle_selection":
        if hasattr(riskengine.currentplayer, "connection") and riskengine.currentplayer.connection == sock:
            riskengine.handleselection(riskengine.territories[parts[1]], int(parts[2]))
    if parts[0] == "start_fortifying":
        riskengine.startfortifying()
    if parts[0] == "next_turn":
        riskengine.nextturn()
    if parts[0] == "turnincards":
        if hasattr(riskengine.currentplayer, "connection") and riskengine.currentplayer.connection == sock:
            cd = []
            for c in riskengine.currentplayer.cards:
                if c.territory in parts[1:]:
                    cd.append(c)
            riskengine.turnincards(riskengine.currentplayer, cd)
    if parts[0] == "message":
        pla = sockettoplayer(sock)
        if pla:
           plname = pla.name
        else:
           plname = "Someone"
        riskgui.set_status(plname + " sent message: " + parts[1])
    if parts[0] == "leaving":
        sockets.remove(sock)
        sock.close()
        pla = sockettoplayer(sock)
        if pla:
           plname = pla.name
        else:
           plname = "Someone"
        riskgui.set_status(plname + " has left")
            
Example #25
0
def handle_fortifying(terr, button):
    """Handle the fortification phase."""
    global armiesfrom, armiesto
    if terr.player != currentplayer:
        return
    if armiesfrom is not None and armiesto is not None and \
       (selected != armiesfrom or terr != armiesto):
        riskgui.set_status(
            "You can only fortify from one place to one space per turn.")
        return
    if not selected.neighboring(terr):
        return

    moving = min(selected.armies - 1, (button == 3) and 5 or 1)
    if moving:
        selected.armies -= moving
        terr.armies += moving
        armiesfrom = selected
        armiesto = terr
        riskgui.drawterritory(armiesfrom, 1)
        riskgui.drawterritory(armiesto, 0)
Example #26
0
def handle_attack(defender):
    """Handle the attack phase."""
    global armiesto, selected
    if defender.player == currentplayer:
        return
    attacker = selected
    attack(attacker, defender)

    if defender.player == currentplayer and attacker.armies > 1:  #we won
        riskgui.set_status(currentplayer.name +
                           " won the territory - move armies into it")
        armiesto = defender
        setphase("WonAttack")

    if defender.player == currentplayer and attacker.armies == 1:
        riskgui.set_status(currentplayer.name + " won the territory")
        riskgui.drawterritory(attacker, 0)
        selected = None
    else:
        riskgui.drawterritory(attacker, 1)
    riskgui.drawterritory(defender, 0)
Example #27
0
def save_game(filename):
    """Save the game."""
    if phase == "Pregame":
        riskgui.set_status("You can't save, you haven't even started.")
        return
        
    savefile = open(filename,"w")
    for player in playerorder:
        savefile.write("player\n")
        savefile.write(player.name + "\n")
        savefile.write(str(player.freeArmies) + "\n")
        savefile.write(str(player.conqueredTerritory)  + "\n")
        for card in player.cards:
            savefile.write(card.territory + "\n")
            savefile.write(card.picture + "\n")
        if player.ai:
            savefile.write("ai\n")
            savefile.write(player.ainame + "\n")
            aidata = player.ai.saveddata()
            savefile.write(str(len(aidata))+"\n")
            savefile.write(aidata)
        savefile.write("endplayer\n")
    savefile.write("endplayers\n")
    savefile.write(currentplayer.name + "\n")
    savefile.write(phase + "\n")
    savefile.write(str(currentcard) + "\n")
    for territory in territories.values():
        savefile.write("territory\n")
        savefile.write(territory.name + "\n")
        if territory.player:
            savefile.write(territory.player.name + "\n")
        else:
            savefile.write("None\n")
        savefile.write(str(territory.armies) + "\n")
        savefile.write("endterritory\n")
    savefile.write("cards\n")
    for card in allcards:
        savefile.write(card.territory + "\n")
        savefile.write(card.picture + "\n")
    savefile.close()
Example #28
0
def save_game(filename):
    """Save the game."""
    if phase == "Pregame":
        riskgui.set_status("You can't save, you haven't even started.")
        return

    savefile = open(filename, "w")
    for player in playerorder:
        savefile.write("player\n")
        savefile.write(player.name + "\n")
        savefile.write(str(player.freeArmies) + "\n")
        savefile.write(str(player.conqueredTerritory) + "\n")
        for card in player.cards:
            savefile.write(card.territory + "\n")
            savefile.write(card.picture + "\n")
        if player.ai:
            savefile.write("ai\n")
            savefile.write(player.ainame + "\n")
            aidata = player.ai.saveddata()
            savefile.write(str(len(aidata)) + "\n")
            savefile.write(aidata)
        savefile.write("endplayer\n")
    savefile.write("endplayers\n")
    savefile.write(currentplayer.name + "\n")
    savefile.write(phase + "\n")
    savefile.write(str(currentcard) + "\n")
    for territory in territories.values():
        savefile.write("territory\n")
        savefile.write(territory.name + "\n")
        if territory.player:
            savefile.write(territory.player.name + "\n")
        else:
            savefile.write("None\n")
        savefile.write(str(territory.armies) + "\n")
        savefile.write("endterritory\n")
    savefile.write("cards\n")
    for card in allcards:
        savefile.write(card.territory + "\n")
        savefile.write(card.picture + "\n")
    savefile.close()
Example #29
0
def server_receive_message(mess, sock):
    """Run when the server receives a message"""
    print >>riskengine.verbosefile, mess, "server received"
    parts = splitparms(mess)
    if parts[0] == "newplayer":
        riskgui.net_newplayer(parts[1])
        riskengine.players[parts[1]].connection = sock
        for sck in sockets:
            if sck != sock:
                sendparts(sck, "newplayer", parts[1])
    if parts[0] == "handle_selection":
        if hasattr(riskengine.currentplayer, "connection") and riskengine.currentplayer.connection == sock:
            riskengine.handleselection(riskengine.territories[parts[1]], int(parts[2]))
    if parts[0] == "start_fortifying":
        riskengine.startfortifying()
    if parts[0] == "next_turn":
        riskengine.nextturn()
    if parts[0] == "turnincards":
        if hasattr(riskengine.currentplayer, "connection") and riskengine.currentplayer.connection == sock:
            cd = []
            for c in riskengine.currentplayer.cards:
                if c.territory in parts[1:]:
                    cd.append(c)
            riskengine.turnincards(riskengine.currentplayer, cd)
    if parts[0] == "message":
        pla = sockettoplayer(sock)
        if pla:
            plname = pla.name
        else:
            plname = "Someone"
        riskgui.set_status(plname + " sent message: " + parts[1])
    if parts[0] == "leaving":
        sockets.remove(sock)
        sock.close()
        pla = sockettoplayer(sock)
        if pla:
            plname = pla.name
        else:
            plname = "Someone"
        riskgui.set_status(plname + " has left")
Example #30
0
def startgame():
    """Start off the game."""
    global playerorder, currentplayer
    if risknetwork.am_client:
        riskgui.show_status_message("You aren't the server; you can't do that.")
        return False
        
    if phase != "Pregame":
        return False
    if len(players) < 2:
        riskgui.set_status("Not enough players")
        return False
    if len(players) > 7:
        riskgui.set_status("Too many players - 7 maximum")
        return False
    
    
    setphase("Preposition")
    
    createcards()
    for pl in players.values():
        pl.freeArmies = 45 - 5 * len(players)
    playerorder = players.values()[:]
    random.shuffle(playerorder)
    currentplayer = playerorder[0]
    riskgui.relistplayers(playerorder)
    riskgui.playersturn(currentplayer.name)
    riskgui.set_armies(currentplayer.freeArmies)
    
    
    while currentplayer.ai is not None and currentplayer.freeArmies > 0:
        currentplayer.ai.run_preplace(currentplayer)
        rotateplayers()  
        riskgui.set_armies(currentplayer.freeArmies)
    if currentplayer.ai is not None:
        resetturn()
        nextturn()
    return True
Example #31
0
def startgame():
    """Start off the game."""
    global playerorder, currentplayer
    if risknetwork.am_client:
        riskgui.show_status_message(
            "You aren't the server; you can't do that.")
        return False

    if phase != "Pregame":
        return False
    if len(players) < 2:
        riskgui.set_status("Not enough players")
        return False
    if len(players) > 7:
        riskgui.set_status("Too many players - 7 maximum")
        return False

    setphase("Preposition")

    createcards()
    for pl in players.values():
        pl.freeArmies = 45 - 5 * len(players)
    playerorder = players.values()[:]
    random.shuffle(playerorder)
    currentplayer = playerorder[0]
    riskgui.relistplayers(playerorder)
    riskgui.playersturn(currentplayer.name)
    riskgui.set_armies(currentplayer.freeArmies)

    while currentplayer.ai is not None and currentplayer.freeArmies > 0:
        currentplayer.ai.run_preplace(currentplayer)
        rotateplayers()
        riskgui.set_armies(currentplayer.freeArmies)
    if currentplayer.ai is not None:
        resetturn()
        nextturn()
    return True
Example #32
0
def start_client(host):
    """Start up the client"""
    global serv_sock, am_client
    if am_client:
        riskgui.set_status("Already connected to a server.")
        return

    try:
        serv_sock = StringSocket(socket.AF_INET, socket.SOCK_STREAM)
        serv_sock.connect((socket.gethostbyname(host), port))
        serv_sock.setblocking(0)
    except:
        riskgui.set_status("Unable to connect to server.")
        return
    am_client = 1
    riskgui.set_status("Connected to server.")
Example #33
0
def start_client(host):
    """Start up the client"""
    global serv_sock, am_client
    if am_client:
        riskgui.set_status("Already connected to a server.")
        return
        
    try:
        serv_sock = StringSocket(socket.AF_INET, socket.SOCK_STREAM)
        serv_sock.connect((socket.gethostbyname(host), port))
        serv_sock.setblocking(0)
    except:
        riskgui.set_status("Unable to connect to server.")
        return
    am_client = 1
    riskgui.set_status("Connected to server.")
Example #34
0
def start_server():
    """Start up the server"""
    global serv_sock, am_server
    if am_server == 1:
        riskgui.set_status("Server already started.")
        return
    am_server = 1
    serv_sock = StringSocket(socket.AF_INET, socket.SOCK_STREAM)
    serv_sock.bind(('', port))
    thread.start_new_thread(binder,())
    try:
        riskgui.set_status("My IP: "+ socket.gethostbyname(socket.getfqdn('')))
        return
    except:
        pass
    try:
        riskgui.set_status("My IP: "+ socket.gethostbyname(socket.gethostname()))
        return
    except:
        pass  
Example #35
0
def start_server():
    """Start up the server"""
    global serv_sock, am_server
    if am_server == 1:
        riskgui.set_status("Server already started.")
        return
    am_server = 1
    serv_sock = StringSocket(socket.AF_INET, socket.SOCK_STREAM)
    serv_sock.bind(("", port))
    thread.start_new_thread(binder, ())
    try:
        riskgui.set_status("My IP: " + socket.gethostbyname(socket.getfqdn("")))
        return
    except:
        pass
    try:
        riskgui.set_status("My IP: " + socket.gethostbyname(socket.gethostname()))
        return
    except:
        pass
Example #36
0
def startfortifying():
    """Handle when the player wants to start fortifying."""
    global armiesfrom, armiesto, selected
    if risknetwork.start_fortifying():
        return

    if phase == "Pregame" or phase == "Preposition" or phase == "Fortifying" or (
            phase != "Attack" and currentplayer.freeArmies > 0):
        riskgui.set_status("No can do")
        return
    if phase == "Place" and len(currentplayer.cards) >= 5:
        riskgui.set_status("You must turn in your cards to start fortifying.")
        return
    if selected is not None:
        riskgui.drawterritory(selected, 0)
        selected = None
    setphase("Fortifying")
    riskgui.set_status("Now fortifying...")
    armiesfrom = None
    armiesto = None
Example #37
0
def newplayer(plname):
    if am_server:
        riskgui.set_status("New player " + plname) 
        sendall("newplayer", plname)
    clientsend("newplayer", plname)
Example #38
0
def newplayer(plname):
    if am_server:
        riskgui.set_status("New player " + plname)
        sendall("newplayer", plname)
    clientsend("newplayer", plname)
Example #39
0
def load_game(filename):
    """Load a previously-saved game."""
    global currentplayer, phase, currentcard, currentplayernum
    if phase != "Pregame":
        riskgui.set_status("You have already started a game")
        return

    savefile = open(filename)
    while savefile.readline() == "player\n":
        plname = savefile.readline().strip()
        plarmies = int(savefile.readline().strip())
        plconquered = int(savefile.readline().strip())
        cards = []
        currentline = savefile.readline()
        while currentline != "endplayer\n" and currentline != "ai\n":
            nline = savefile.readline().strip()
            cards.append(Card(currentline.strip(), nline))
            currentline = savefile.readline()
        ainame = None
        if currentline == "ai\n":
            ainame = savefile.readline().strip()
            aidatalen = int(savefile.readline().strip())
            aidata = savefile.read(aidatalen)
            savefile.readline()
        if not players.has_key(plname):
            if ainame and not os.path.exists(ainame):
                riskgui.set_status("AI " + ainame + " nonexistent")
                ainame = None
            riskgui.makeplayercolors(makeplayer(plname, ainame))
            if ainame:
                players[plname].ai.loaddata(aidata)
        players[plname].freeArmies = plarmies
        players[plname].conqueredTerritory = plconquered
        players[plname].cards = cards
        for card in cards:
            risknetwork.add_card(card, players[plname])
        playerorder.append(players[plname])
    riskgui.relistplayers(playerorder)
    currentplayer = players[savefile.readline().strip()]
    currentplayernum = playerorder.index(currentplayer)
    riskgui.set_armies(currentplayer.freeArmies)
    riskgui.playersturn(currentplayer.name)
    setphase(savefile.readline().strip())
    currentcard = int(savefile.readline().strip())

    while savefile.readline().strip() == "territory":
        tname = savefile.readline().strip()
        tplayer = savefile.readline().strip()
        if tplayer == "None":
            tplayer = None
        else:
            tplayer = players[tplayer]
        territories[tname].player = tplayer
        territories[tname].armies = int(savefile.readline().strip())
        riskgui.drawterritory(territories[tname], 0)
        savefile.readline()

    while 1:
        cardterr = savefile.readline().strip()
        if not cardterr:
            break
        allcards.append(Card(cardterr, savefile.readline().strip()))
    savefile.close()
Example #40
0
def changecontrol(territory1, territory2, dice):
    """Change control of an army from one player to another."""
    riskgui.set_status("[%s] conquered %s's territory: %s" % (
            territory1.player.name, territory2.player.name, territory2.name))
    territory2.player = territory1.player
    movearmies(territory1, territory2, dice)