Mercurial > parpg-core
diff src/parpg/console.py @ 0:1fd2201f5c36
Initial commit of parpg-core.
author | M. George Hansen <technopolitica@gmail.com> |
---|---|
date | Sat, 14 May 2011 01:12:35 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parpg/console.py Sat May 14 01:12:35 2011 -0700 @@ -0,0 +1,204 @@ +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import re +import os +import sys +from StringIO import StringIO +import code + +class Console: + def __init__(self, app_listener): + """ + @type appListener: ApplicationListener + @param appListener: ApplicationListener object providing a link with + the Controller, the view and the GameModel""" + exit_help = "Terminate application" + grid_help = "Toggle grid display" + run_help = "Toggle player run/walk" + help_help = "Show this help string" + load_help = "Usage: load directory file" + python_help = "Run some python code" + quit_help = "Terminate application" + save_help = "Usage: save directory file" + pause_help = "Pause/Unpause the game" + + self.commands = [ + {"cmd":"exit" ,"callback":self.handleQuit ,"help": exit_help}, + {"cmd":"grid" ,"callback":self.handleGrid ,"help": grid_help}, + {"cmd":"help" ,"callback":self.handleHelp ,"help": help_help}, + {"cmd":"load" ,"callback":self.handleLoad ,"help": load_help}, + {"cmd":"pause" ,"callback":self.handlePause ,"help": pause_help}, + {"cmd":"python","callback":self.handlePython,"help": python_help}, + {"cmd":"run" ,"callback":self.handleRun ,"help": run_help}, + {"cmd":"save" ,"callback":self.handleSave ,"help": save_help}, + {"cmd":"quit" ,"callback":self.handleQuit ,"help": quit_help}, + ] + self.app_listener = app_listener + self.view = self.app_listener.view + self.model = self.app_listener.model + self.game_state = self.app_listener.view.model.game_state + self.console_locals = {"__name__":"__paprg_console__",\ + "__doc__": None,\ + "app_listener":self.app_listener,\ + "model":self.app_listener.model,\ + "view":self.app_listener.view,\ + "engine":self.app_listener.engine} + + self.console = code.InteractiveConsole(self.console_locals) + + def handleQuit(self, command): + """Implements the quit console command + @type command: string + @param command: The command to run + @return: The resultstring""" + self.app_listener.quitGame() + return "Terminating ..." + + def handlePause(self, command): + """Implements the pause console command + @type command: string + @param command: The command to run + @return: The resultstring""" + self.model.togglePause() + return "Game (un)paused" + + def handleGrid(self, command): + """Implements the grid console command + @type command: string + @param command: The command to run + @return: The resultstring""" + self.app_listener.view.active_map.toggleRenderer('GridRenderer') + return "Grid toggled" + + def handleRun(self, command): + """Toggles run/walk mode of the PC player + @type command: string + @param command: The command to run. + @return: The response""" + if self.app_listener.model.pc_run == 1: + self.app_listener.model.pc_run = 0 + return "PC is now walking" + else: + self.app_listener.model.pc_run = 1 + return "PC is now running" + + def handleHelp(self, command): + """Implements the help console command + @type command: string + @param command: The command to run + @return: The resultstring""" + res = "" + for cmd in self.commands: + res += "%10s: %s\n" % (cmd["cmd"], cmd["help"]) + return res + + def handlePython(self,command): + user_code = command[7:len(command)] + + codeOut = StringIO() + + #make stdout and stderr write to our file, not the terminal + sys.stdout = codeOut + sys.stderr = codeOut + + #Workaround it not being possible to enter a blank line in the console + if user_code == " ": + user_code = "" + + #Process the code + self.console.push(user_code) + if len(self.console.buffer) == 0: + output = codeOut.getvalue() + else: + output = "..." + + + #restore stdout and stderr + sys.stdout = sys.__stdout__ + sys.stderr = sys.__stderr__ + + temp_output = output + output = "" + counter = 0 + + #Make the output fit in the console screen + for char in temp_output: + counter += 1 + if char == "\n": + counter = 0 + elif counter == 110: + output += "\n" + counter = 0 + output += char + + return output + + def handleLoad(self, command): + """Implements the load console command + @type command: string + @param command: The command to run + @return: The resultstring""" + result = None + load_regex = re.compile('^load') + l_matches = load_regex.match(command.lower()) + if (l_matches is not None): + end_load = l_matches.end() + try: + l_args = command.lower()[end_load + 1:].strip() + l_path, l_filename = l_args.split(' ') + self.app_listener.model.load_save = True + self.app_listener.model.savegame = os.path.join(l_path, l_filename) + result = "Load triggered" + + except Exception, l_error: + self.app_listener.engine.getGuiManager().getConsole().println('Error: ' + str(l_error)) + result="Failed to load file" + + return result + + def handleSave(self, command): + """Implements the save console command + @type command: string + @param command: The command to run + @return: The resultstring""" + save_regex = re.compile('^save') + s_matches = save_regex.match(command.lower()) + if (s_matches != None): + end_save = s_matches.end() + try: + s_args = command.lower()[end_save+1:].strip() + s_path, s_filename = s_args.split(' ') + self.app_listener.model.save(s_path, s_filename) + result = "Saved to file: " + s_path + s_filename + + except Exception, s_error: + self.app_listener.engine.getGuiManager().getConsole(). \ + println('Error: ' + str(s_error)) + result = "Failed to save file" + return result + + def handleConsoleCommand(self, command): + """Implements the console logic + @type command: string + @param command: The command to run + @return: The response string """ + result = None + for cmd in self.commands: + regex = re.compile('^' + cmd["cmd"]) + if regex.match(command.lower()): + result=cmd["callback"](command) + + if result is None: + result = self.handlePython("python " + command) + return result