| 
					
				 | 
			
			
				@@ -84,7 +84,7 @@ class PlayerInput(object): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.observer = self.game.observer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.save = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.defer = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.game_queue = game.game_queue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.queue_game = game.queue_game 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # default colors, and useful consts 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.c = merge(Style.BRIGHT + Fore.WHITE + Back.BLUE) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -199,11 +199,15 @@ class ProxyMenu(object): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def menu(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.queue_game.put(self.nl + self.c + "TradeWars Proxy active." + self.r + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        def menu_item(ch, desc): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self.queue_game.put(" " + self.c1 + ch + self.c2 + " - " + self.c1 + desc + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.queue_game.put(" " + self.c1 + "D" + self.c2 + " - " + self.c1 + "Diagnostics" + self.nl)         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            " " + self.c1 + "T" + self.c2 + " - " + self.c1 + "Display current Time" + self.nl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        menu_item("Q", "Quest") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        menu_item("T", "Display current Time") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.queue_game.put(" " + self.c1 + "P" + self.c2 + " - " + self.c1 + "Port CIM Report" + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.queue_game.put(" " + self.c1 + "S" + self.c2 + " - " + self.c1 + "Scripts" + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.queue_game.put(" " + self.c1 + "X" + self.c2 + " - " + self.c1 + "eXit" + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.queue_game.put("   " + self.c + "-=>" + self.r + " ") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -226,6 +230,12 @@ class ProxyMenu(object): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # perform T option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             now = pendulum.now() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self.queue_game.put(self.nl + self.c1 + "Current time " + now.to_datetime_string() + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elif key == 'Q': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            self.queue_game.put(self.c + key + self.r + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ask = PlayerInput(self.game) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            d = ask.prompt("What is your quest?", 20) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            d.callback(ask.prompt, "What is your favorite color?", 10) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         elif key == 'X': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self.queue_game.put(self.c + key + self.r + self.nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             self.observer.load(self.save) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -246,405 +256,7 @@ class ProxyMenu(object): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.keepalive.start(30, True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.menu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class MCP(object): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def __init__(self, game): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.game = game 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # we don't have this .. yet! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.prompt = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.keepalive = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # Port Data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.portdata = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.portcycle = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def finishSetup(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # if self.queue_game is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game = self.game.queue_game 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # if self.observer is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer = self.game.observer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect("hotkey", self.activate) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect("notyet", self.notyet) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect('close', self.close) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def close(self, _): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if self.keepalive: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if self.keepalive.running: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.keepalive.stop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def notyet(self, _): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ No, not yet! """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        nl = "\n\r" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        r = Style.RESET_ALL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("NNY!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        prompt = self.game.buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(r + nl + Style.BRIGHT + "Proxy:" + Style.RESET_ALL + " I can't activate at this time." + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(prompt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def stayAwake(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ Send a space to the game to keep it alive/don't timeout. """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("Gameserver, stay awake.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.game.queue_player.put(" ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def startAwake(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ Start the task that keeps the game server alive. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        There is currently a bug in there somewhere, which causes it to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        duplicate: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:03-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:14-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:24-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:27-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:31-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:33-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:44-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:54-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:19:57-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:20:01-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        2019-11-25 21:20:03-0500 [-] Gameserver, stay awake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ^ These aren't 30 seconds apart. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        These are being sent, even when the MCP is not active! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.keepalive = task.LoopingCall(self.stayAwake) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.keepalive.start(30) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def activate(self, _): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("MCP menu called.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # We want the raw one, not the ANSI cleaned getPrompt. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        prompt = self.game.buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if not self.prompt is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            # silly, we're already active 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg("I think we're already active.  Ignoring request.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # Or will the caller setup/restore the prompt? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.prompt = prompt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # queue_game = to player 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect("player", self.fromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # TODO:  Add background "keepalive" event so the game doesn't time out on us. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.startAwake() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # self.keepalive = task.LoopingCall(self.stayAwake) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # self.keepalive.start(30) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def displayMenu(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        nl = "\n\r" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c = merge(Style.BRIGHT + Fore.YELLOW + Back.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        r = Style.RESET_ALL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c1 = merge(Style.BRIGHT + Fore.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c2 = merge(Style.NORMAL + Fore.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(nl + c + "TradeWars Proxy active." + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(" " + c1 + "D" + c2 + " - " + c1 + "Diagnostics" + nl)         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            " " + c1 + "T" + c2 + " - " + c1 + "Display current Time" + nl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(" " + c1 + "P" + c2 + " - " + c1 + "Port CIM Report" + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(" " + c1 + "S" + c2 + " - " + c1 + "Scripts" + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(" " + c1 + "X" + c2 + " - " + c1 + "eXit" + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put("   " + c + "-=>" + r + " ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def fromPlayer(self, chunk): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ Data from player (in bytes).  """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        chunk = chunk.decode("utf-8", "ignore") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        nl = "\n\r" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c = merge(Style.BRIGHT + Fore.YELLOW + Back.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        r = Style.RESET_ALL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c1 = merge(Style.BRIGHT + Fore.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c2 = merge(Style.NORMAL + Fore.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        key = chunk.upper() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if key == "T": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(c + key + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            now = pendulum.now() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg("Time") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                nl + c1 + "It is currently " + now.to_datetime_string() + "." + nl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elif key == "P": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg("Port") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(c + key + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.portReport() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            # self.queue_game.put(nl + c + "NO, NOT YET!" + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            # self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elif key == "S": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg("Scripts") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(c + key + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.scripts() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elif key == 'D': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(nl + "Diagnostics" + nl + "portdata:" + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            line = pformat(self.portdata).replace("\n", "\n\r") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(line + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elif key == "X": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg('"Quit, return to "normal".  (Whatever that means!)') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(c + key + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.observer.disconnect("player", self.fromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(nl + c1 + "Returning to game" + c2 + "..." + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(self.prompt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.prompt = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.keepalive.stop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.keepalive = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.game.to_player = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if key.isprintable(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.queue_game.put(r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.queue_game.put("Excuse me? I don't understand '" + key + "'." + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def portReport(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ Activate CIM and request Port Report """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.game.to_player = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.portdata = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect('prompt', self.portPrompt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect('game-line', self.portParse) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.game.queue_player.put("^") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def portPrompt(self, prompt): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if prompt == ': ': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg("CIM Prompt") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if self.portdata is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.msg("R - Port Report") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.portdata = dict() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.game.queue_player.put("R") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.portcycle = cycle(['/', '-', '\\', '|']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.queue_game.put(' ') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.msg("Q - Quit") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.game.queue_player.put("Q") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.portcycle = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def portBS(self, info): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if info[0] == '-': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            bs = 'B' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            bs = 'S' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return (bs, int(info[1:].strip())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def portParse(self, line): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if line == '': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if line == ': ': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("parse line:", line) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if line.startswith('Command [TL='): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if line == ': ENDINTERROG': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg("CIM Done") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg(pformat(self.portdata)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put("\b \b" + "\n\r") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.observer.disconnect('prompt', self.portPrompt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.observer.disconnect('game-line', self.portParse) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.game.to_player = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            # self.keepalive.start(30) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.startAwake() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # Give some sort of feedback to the user. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if self.portcycle: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if len(self.portdata) % 10 == 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.queue_game.put("\b" + next(self.portcycle)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # Ok, we need to parse this line 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 436   2870 100% - 1520 100% - 2820 100% 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        #    2   1950 100% - 1050 100%   2780 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        #    5   2800 100% - 2330 100% - 1230 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        #    8   2890 100%   1530 100% - 2310 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        #    9 - 2160 100%   2730 100% - 2120 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        #  324 - 2800 100%   2650 100% - 2490 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        #  492    990 100%    900 100%   1660 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        #  890   1920 100% - 2140 100%   1480 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 1229 - 2870 100% - 1266  90%    728  68%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 1643 - 3000 100% - 3000 100% - 3000 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 1683 - 1021  97%   1460 100% - 2620 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 1898 - 1600 100% - 1940 100% - 1860 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 2186   1220 100% -  900 100% - 1840 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 2194   2030 100% - 1460 100% - 1080 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 2577   2810 100% - 1550 100% - 2350 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 2629   2570 100% - 2270 100% - 1430 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 3659 - 1720 100%   1240 100% - 2760 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 3978 -  920 100%   2560 100% - 2590 100%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 4302    348  25% - 2530 100% -  316  23%  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # 4516 - 1231  60% - 1839  75%      7   0% 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        work = line.replace('%', '') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        parts = re.split(r"(?<=\d)\s", work) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if len(parts) == 8: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            port = int(parts[0].strip()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data = dict() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['fuel'] = dict( ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['fuel']['sale'], data['fuel']['units'] = self.portBS(parts[1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['fuel']['pct'] = int(parts[2].strip()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['org'] = dict( ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['org']['sale'], data['org']['units'] = self.portBS(parts[3]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['org']['pct'] = int(parts[4].strip()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['equ'] = dict( ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['equ']['sale'], data['equ']['units'] = self.portBS(parts[5]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['equ']['pct'] = int(parts[6].strip()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            # Store what this port is buying/selling 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['port'] = data['fuel']['sale'] + data['org']['sale'] + data['equ']['sale'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            # Convert BBS/SBB to Class number 1-8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data['class'] = CLASSES_PORT[data['port']] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.portdata[port] = data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put("?") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg("Line in question is: [{0}].".format(line)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.msg(repr(parts)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def scripts(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.script = dict() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.disconnect("player", self.fromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect("player", self.scriptFromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect('game-line', self.scriptLine) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        nl = "\n\r" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c = merge(Style.BRIGHT + Fore.WHITE + Back.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        r = Style.RESET_ALL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c1 = merge(Style.BRIGHT + Fore.CYAN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c2 = merge(Style.NORMAL + Fore.CYAN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(nl + c + "TradeWars Proxy Script(s)" + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(" " + c1 + "P" + c2 + " - " + c1 + "Port Trading Pair" + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put("   " + c + "-=>" + r + " ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def unscript(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect("player", self.fromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.disconnect("player", self.scriptFromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.disconnect('game-line', self.scriptLine) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def scriptLine(self, line): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        pass 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def scriptFromPlayer(self, chunk): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ Data from player (in bytes).  """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        chunk = chunk.decode("utf-8", "ignore") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        nl = "\n\r" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c = merge(Style.BRIGHT + Fore.WHITE + Back.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        r = Style.RESET_ALL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        key = chunk.upper() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if key == 'Q': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(c + key + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.observer.connect("player", self.fromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.observer.disconnect("player", self.scriptFromPlayer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.observer.disconnect('game-line', self.scriptLine)             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.observer.connect('game-line', self.portParse)             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.displayMenu() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elif key == 'P': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put(c + key + r + nl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            d = self.playerInput("Enter sector to trade to: ", 6) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            d.addCallback(self.save_sector) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def save_sector(self, sector): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("save_sector {0}".format(sector)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if sector.strip() == '': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put("Script Aborted.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.unscript() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        s = int(sector.strip()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.script['sector'] = s 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        d = self.playerInput("Enter times to execute script: ", 6) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        d.addCallback(self.save_loop) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def save_loop(self, loop): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("save_loop {0}".format(loop)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if loop.strip() == '': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.queue_game.put("Script Aborted.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.unscript() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        l = int(loop.strip()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.script['loop'] = l 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        d = self.playerInput("Enter markup/markdown percentage: ", 3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        d.addCallback(self.save_mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def save_mark(self, mark): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("save_mark {0}".format(mark))                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if mark.strip() == "": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.script['mark'] = 5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            self.script['mark'] = int(mark.strip()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # Ok, we have the values we need to run the Port trade script 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(pformat(self.script).replace("\n", "\n\r")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.unscript() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def playerInput(self, prompt, limit): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ Given a prompt and limit, this handles user input. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        This displays the prompt, and sets up the proper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        observers, while preserving the "current" ones. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        This returns a deferred, so you can chain the results 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        of this. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.msg("playerInput({0}, {1}".format(prompt, limit)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        nl = "\n\r" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c = merge(Style.BRIGHT + Fore.WHITE + Back.BLUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        r = Style.RESET_ALL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(r + nl + c + prompt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # This should set the background and show the size of the entry area. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.queue_game.put(" " * limit + "\b" * limit) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        d = defer.Deferred() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.player_input = d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.input_limit = limit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.input_input = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.save = self.observer.save() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.observer.connect('player', self.niceInput) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # input_funcs = { 'player': [self.niceInput] } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # self.observer.set_funcs(input_funcs)      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def niceInput(self, chunk): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        """ Data from player (in bytes).  """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        chunk = chunk.decode("utf-8", "ignore") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # log.msg("niceInput:", repr(chunk)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        r = Style.RESET_ALL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for c in chunk: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if c == '\b': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                # Backspace 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if len(self.input_input) > 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.queue_game.put("\b \b") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.input_input = self.input_input[0:-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    # Can't 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.queue_game.put("\a") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if c == "\r": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                # Ok, completed! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.queue_game.put(r + "\n\r") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.observer.load(self.save) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.save = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                line = self.input_input 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.msg("finishing niceInput {0}".format(line)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                # self.queue_game.put("[{0}]\n\r".format(line)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.input_input = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                # Ok, maybe this isn't the way to do this ... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                # self.player_input.callback(line) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                reactor.callLater(0, self.player_input.callback, line)                 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                self.player_input = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if c.isprintable(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if len(self.input_input) + 1 <= self.input_limit: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.input_input += c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.queue_game.put(c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    # Limit reached 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    self.queue_game.put("\a") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from mcp import MCP 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class Game(protocol.Protocol): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def __init__(self): 
			 |