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()
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")
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")
def handleselection(t, button): """Handle a player clicking on the map.""" global selected if phase == "Pregame": return if phase == "Preposition": handle_preposition(t, button) return if phase == "Place": if handle_place(t, button): return if selected is None: if t.player != currentplayer: return isshaded = 1 selected = t elif selected == t: isshaded = 0 selected = None if phase == "WonAttack": setphase("Attack") else: if phase == "Fortifying": handle_fortifying(t, button) elif phase == "Attack": handle_attack(t) elif phase == "WonAttack": handle_won_attack(t, button) return riskgui.drawterritory(t, isshaded)
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")
def run_place(player): """Place a player's units at the beginning of the turn""" no_more_tris = False while no_more_tris == False: no_more_tris = do_cards(player) for _ in range(player.freeArmies): terr = player.ai.Placement(player) if terr is not None: player.place_army(terr) riskgui.drawterritory(terr, 0)
def run_place(player): """Place a player's units at the beginning of the turn""" #See if the AI wants to turn in cards if len(player.cards) >= 3: do_cards(player) while len(player.cards) >= 5: do_cards(player) for i in range(player.freeArmies): terr = player.ai.Placement(player) if terr is not None: player.place_army(terr) riskgui.drawterritory(terr, 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
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
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
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
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)
def run_preplace(player): """ Runs when the player is supposed to select and support his first territory """ riskengine.logai("run_preplace") freeplaces = [x for x in riskengine.territories.values() if x.armies == 0] if freeplaces: terr = player.ai.Assignment(player) if terr is not None and terr.armies == 0: player.place_army(terr) riskgui.drawterritory(terr, 0) else: riskengine.logai("AI " + player.name + " couldn't place armies, gave up") else: terr = player.ai.Placement(player) if terr is not None: player.place_army(terr) riskgui.drawterritory(terr, 0) else: riskengine.logai("AI" + player.name + "couldn't place armies, gave up")
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)
def handleselection(t, button): """Handle a player clicking on the map.""" global selected if phase == "Pregame": return if risknetwork.handle_selection(t, button): return if phase == "Preposition": handle_preposition(t, button) return if phase == "Place": if handle_place(t, button): return if selected is None: if t.player != currentplayer: return isshaded = 1 selected = t elif selected == t: isshaded = 0 selected = None if phase == "WonAttack": setphase("Attack") else: if phase == "Fortifying": handle_fortifying(t, button) elif phase == "Attack": handle_attack(t) elif phase == "WonAttack": handle_won_attack(t, button) return riskgui.drawterritory(t, isshaded)
def run_preplace(player): """Runs when the player is supposed to select and support his first territory """ riskengine.logai("run_preplace") freeplaces = [x for x in riskengine.territories.values() if x.armies == 0] if freeplaces: terr = player.ai.Assignment(player) if terr is not None and terr.armies == 0: player.place_army(terr) riskgui.drawterritory(terr, 0) else: riskengine.logai("AI " + player.name + " couldn't place armies, gave up") else: terr = player.ai.Placement(player) if terr is not None: player.place_army(terr) riskgui.drawterritory(terr, 0) else: riskengine.logai("AI" + player.name + "couldn't place armies, gave up")
def handle_preposition(terr, button): """Handle the preposition phase.""" if currentplayer.freeArmies == 0: resetturn() return emptyTerritories = [x for x in territories.values() if x.armies == 0] if (emptyTerritories and terr.player is None) or \ (not emptyTerritories and terr.player == currentplayer): terr.player = currentplayer currentplayer.place_army(terr) riskgui.drawterritory(terr, 0) else: return rotateplayers() riskgui.set_armies(currentplayer.freeArmies) while currentplayer.ai is not None: currentplayer.ai.run_preplace(currentplayer) rotateplayers() riskgui.set_armies(currentplayer.freeArmies) if currentplayer.freeArmies == 0: resetturn() return
def handle_won_attack(terr, button): """Handle the movement of armies after an attack was won.""" global selected if terr == armiesto: if button == 3: moved = min(5, selected.armies - 1) selected.armies -= moved terr.armies += moved else: selected.armies -= 1 terr.armies += 1 riskgui.drawterritory(selected, 1) riskgui.drawterritory(terr, 0) if selected.armies == 1: setphase("Attack") riskgui.drawterritory(selected, 0) selected = None return
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 armiesto = defender setphase("WonAttack") if defender.player == currentplayer and attacker.armies == 1: riskgui.drawterritory(attacker, 0) selected = None else: riskgui.drawterritory(attacker, 1) riskgui.drawterritory(defender, 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)
def run_attack(player): """Have a player run his attacks, and then his fortification""" riskengine.logai("run_attack") while 1: fromterr, toterr = player.ai.Attack(player) if fromterr is None or toterr is None or fromterr.armies <= 1: break riskengine.logai("AI %s attacks %s with %s" % (player.name, toterr.name, fromterr.name)) riskengine.attack(fromterr, toterr) riskgui.drawterritory(fromterr, 0) riskgui.drawterritory(toterr, 0) if toterr.player == player: #we won movarm = player.ai.Occupation(player, fromterr, toterr) if movarm <= 0: continue movarm = min(movarm, fromterr.armies - 1) fromterr.armies -= movarm toterr.armies += movarm riskgui.drawterritory(fromterr, 0) riskgui.drawterritory(toterr, 0) fromterr, toterr, armies = player.ai.Fortification(player) if fromterr is not None and toterr is not None and armies > 0: armies = min(armies, fromterr.armies - 1) fromterr.armies -= armies toterr.armies += armies riskgui.drawterritory(fromterr, 0) riskgui.drawterritory(toterr, 0)
def run_attack(player): """Have a player run his attacks, and then his fortification""" riskengine.logai("run_attack") while True: if len(riskengine.players) == 1: break fromterr, toterr = player.ai.Attack(player) if fromterr is None or toterr is None or fromterr.armies <= 1: break riskengine.logai("AI %s attacks %s with %s" % (player.name, toterr.name, fromterr.name)) riskengine.attack(fromterr, toterr) riskgui.drawterritory(fromterr, 0) riskgui.drawterritory(toterr, 0) if toterr.player == player: #we won movarm = player.ai.Occupation(player, fromterr, toterr) if movarm <= 0: continue movarm = min(movarm, fromterr.armies - 1) fromterr.armies -= movarm toterr.armies += movarm riskgui.drawterritory(fromterr, 0) riskgui.drawterritory(toterr, 0) fromterr, toterr, armies = player.ai.Fortification(player) if fromterr is not None and toterr is not None and armies > 0: armies = min(armies, fromterr.armies - 1) fromterr.armies -= armies toterr.armies += armies riskgui.drawterritory(fromterr, 0) riskgui.drawterritory(toterr, 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()