# Generation of data for a campaign of Ticket to Ride Legacy: Legends of the West # Imports import os import jsonpickle from src.Circus import Circus from src.TreasureCard import TreasureCard from src.Player import Player, ConcessionCard from src.MamaOConnel import MamaOConnel class Game: # initGame() is used to generate all data for a campaign and initialize status variables def initGame(self): self.years = 1865, 1868, 1871, 1874, 1877, 1880, 1883, 1886, 1889, 1892, 1895, 1898 playersNb = input("Enter the number of players (2-5): ") while not playersNb.isdigit() or int(playersNb) not in range(2, 6): playersNb = input("OUT OF RANGE! Enter the number of players (2-5): ") playersNb = int(playersNb) # Game status self.yearId = 0 self.concession = False # General data to generate self.circus = Circus(playersNb) self.treasure = TreasureCard() self.mamaoc = MamaOConnel() while not self.mamaoc.solver(): self.mamaoc = MamaOConnel() # Players self.players = [] for n in range(0, playersNb): color = input("Enter player " + str(n + 1) + "'s color: ") self.players.append(Player(color)) # Stickers pools self.stickers = {'White': 0, 'Red': 0, 'Blue': 0, 'Yellow': 0, 'Green': 0, 'Black': 0} def getPlayerByColor(self, color): for player in self.players: if player.color.lower() == color.lower(): return player print("ERROR: player '" + color + "' is not defined") return False def enableConcession(self): self.concession = True def disableConcession(self): self.concession = False # if number = 0 print Mama O'Connel's location, else print hint #number def printMamaHint(self, number): if number not in range(0, 4): return False os.system('clear') input("When you are ready, press Enter.") print("") match number: case 0: print("Mama O'Connel is at: " + self.mamaoc.location.name) case 1: print("Mama O'Connel is " + str(self.mamaoc.hint1[1]) + " cities from " + self.mamaoc.hint1[0].name) case 2: print("Mama O'Connel is " + str(self.mamaoc.hint2[1]) + " cities from " + self.mamaoc.hint2[0].name) case 3: print("Mama O'Connel is " + str(self.mamaoc.hint3[1]) + " cities from " + self.mamaoc.hint3[0].name) print("") input("When you are done, press Enter.") os.system('clear') def takeSticker(self, color, nb): if not nb.isdigit() or int(nb) < 1: print("ERROR: Not a positive number") return False nb = int(nb) for c, n in self.stickers.items(): if c.lower() == color.lower(): if nb > n: print("ERROR: not enough stickers remaining.") return False else: self.stickers[c] = n - nb return True print("ERROR: color not found.") return False def newStickersBatch(self): self.stickers = {x: self.stickers[x] + 7 for x in self.stickers} def printStatus(self): print("") print("---------------------------------------------------------------------") print("") print("Ticket to Ride Legacy: Legends of the West") print("") print("Campaign - Year: " + str(self.years[self.yearId])) print("") print("Players:") for player in self.players: print(" " + player.color) if self.concession: print(" Concession card remaining nuggets: " + str(player.concession.getRemainingPepites())) print("") if self.circus.state > 0: print("Circus next sticker color: " + self.circus.getNextColor()) print("") if self.treasure.state > -1: print(f"Treasures found: {self.treasure.getFoundNumber()}") print("") print("Road stickers:") for color, nb in self.stickers.items(): print(" " + color + ": " + str(nb)) def saveData(self, path): savefile = open('./' + path, 'w+') savefile.write(jsonpickle.encode(self)) savefile.close() def loadData(path): with open('./' + path, 'r') as savefile: content = savefile.read() data = jsonpickle.decode(content) return data print("") print("Ticket to Ride Legacy: Legends of the West") print("") choice = input("What do you want to do (new/load)? ") while choice not in ("new", "load"): choice = input("UNDEFINED! What do you want to do (new/load)? ") if choice == "new": myGame = Game() myGame.initGame() elif choice == "load": path = input("Path to save file (defaults to savefile.json)? ") if path == "": path = "savefile.json" myGame = loadData(path) while True: myGame.printStatus() command = input("==> ") while command not in ('load', 'save', 'next year', 'exit', 'take sticker', 'batch sticker', 'enable circus',\ 'take circus', 'enable concession', 'take concession', 'disable concession', 'enable treasure', 'take treasure',\ 'mama hint 1', 'mama hint 2', 'mama hint 3', 'mama location'): print("") print("Available commands:") print(" Main: 'load', 'save', 'next year', 'exit'") print(" Stickers: 'take sticker', 'batch sticker'") print(" Circus: 'enable circus', 'take circus'") print(" Treasure: 'enable treasure', 'take treasure'") print(" Concessions: 'enable concession', 'take concession', 'disable concession'") print(" Mama O'Connel tracking: 'mama hint 1', 'mama hint 2', 'mama hint 3', 'mama location'") command = input("==> ") print("") match command: case 'load': choice = input("WARNING! If you load, you will loose all unsaved changes. Are you sure? (type YES if you are) ") if choice == "YES": path = input("Path to save file (defaults to savefile.json)? ") if path == "": path = "savefile.json" myGame = loadData(path) case 'save': path = input("Path to save file (defaults to savefile.json)? ") if path == "": path = "savefile.json" myGame.saveData(path) print("Game saved!") case 'next year': myGame.yearId = myGame.yearId + 1 case 'exit': exit() case 'take sticker': choice = input("Color ? ==> ") number = input("Nb ? ==> ") myGame.takeSticker(choice, number) case 'batch sticker': myGame.newStickersBatch() case 'enable circus': myGame.circus.enable() case 'take circus': myGame.circus.takeWagon() case 'enable treasure': myGame.treasure.enable() case 'take treasure': myGame.treasure.takeTreasure() case 'enable concession': myGame.enableConcession() case 'take concession': choice = input("Player? ==> ") player = myGame.getPlayerByColor(choice) if player == False: print("Not a valid player.") else: choice = input("Which nugget? ==> ") print("") player.concession.takeReward(choice) case 'disable concession': myGame.disableConcession() case 'mama hint 1': myGame.printMamaHint(1) case 'mama hint 2': myGame.printMamaHint(2) case 'mama hint 3': myGame.printMamaHint(3) case 'mama location': myGame.printMamaHint(0)