view demos/rpg/scripts/rpg.py @ 669:46258f467c8c

* Fixed the clear screen problems. The screen is now automatically cleared every frame by the engine if there are no maps loaded. In the process I removed the setClearBackBuffer() function from the RenderBackend.
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Mon, 08 Nov 2010 21:36:38 +0000
parents 99e3ef63495b
children
line wrap: on
line source

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# ####################################################################
#  Copyright (C) 2005-2010 by the FIFE team
#  http://www.fifengine.net
#  This file is part of FIFE.
#
#  FIFE is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2.1 of the License, or (at your option) any later version.
#
#  This library 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
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library; if not, write to the
#  Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
# ####################################################################

import sys, os, re, math, random, shutil, time
from datetime import datetime

from fife import fife
from fife.extensions import *
from scripts.gamecontroller import GameController
from fife.extensions.basicapplication import ApplicationBase
from fife.extensions import pychan
from fife.extensions.pychan import widgets
from fife.extensions.fife_utils import getUserDataDirectory

class KeyFilter(fife.IKeyFilter):
	"""
	This is the implementation of the fife.IKeyFilter class.
	
	Prevents any filtered keys from being consumed by guichan.
	"""
	def __init__(self, keys):
		fife.IKeyFilter.__init__(self)
		self._keys = keys

	def isFiltered(self, event):
		return event.getKey().getValue() in self._keys

class ApplicationListener(fife.IKeyListener, fife.ICommandListener, fife.ConsoleExecuter):
	"""
	Listens for window commands, console commands and keyboard input.
	
	Does not process game related input.	
	"""
	def __init__(self, engine, gamecontroller):
		"""
		Initializes all listeners and registers itself with the eventmanager.
		"""
		self._engine = engine
		self._gamecontroller = gamecontroller
		self._eventmanager = self._engine.getEventManager()
		
		fife.IKeyListener.__init__(self)
		self._eventmanager.addKeyListener(self)
		
		fife.ICommandListener.__init__(self)
		self._eventmanager.addCommandListener(self)
		
		fife.ConsoleExecuter.__init__(self)
		self._engine.getGuiManager().getConsole().setConsoleExecuter(self)
		
		keyfilter = KeyFilter([fife.Key.ESCAPE, fife.Key.BACKQUOTE, fife.Key.PRINT_SCREEN])
		keyfilter.__disown__()		
		
		self._eventmanager.setKeyFilter(keyfilter)
		
		self.quit = False

	def keyPressed(self, event):
		"""
		Processes any non game related keyboar input.
		"""
		if event.isConsumed():
			return

		keyval = event.getKey().getValue()
		keystr = event.getKey().getAsString().lower()
		
		if keyval == fife.Key.ESCAPE:
			self.quit = True
			event.consume()
		elif keyval == fife.Key.BACKQUOTE:
			self._engine.getGuiManager().getConsole().toggleShowHide()
			event.consume()
		elif keyval == fife.Key.PRINT_SCREEN:
			self._engine.getRenderBackend().captureScreen(time.strftime("%Y%m%d_%H%M%S", time.localtime()) + ".png")
			event.consume()

	def keyReleased(self, event):
		pass

	def onCommand(self, command):
		self.quit = (command.getCommandType() == fife.CMD_QUIT_GAME)
		if self.quit:
			command.consume()

	def onConsoleCommand(self, command):
		result = ""
		
		args = command.split(" ")
		cmd = []
		for arg in args:
			arg = arg.strip()
			if arg != "":
				cmd.append(arg)		
		
		if cmd[0].lower() in ('quit', 'exit'):
			self.quit = True
			result = 'quitting'
		elif cmd[0].lower() in ( 'help' ):
			helptextfile = self._gamecontroller.settings.get("RPG", "HelpText", "misc/help.txt")
			self._engine.getGuiManager().getConsole().println( open( helptextfile, 'r' ).read() )
			result = "--OK--"
		elif cmd[0].lower() in ( 'eval' ):
			try:
				result = str(eval(command.lstrip(cmd[0])))
			except:
				result = "Invalid eval statement..."
		else:
			result = self._gamecontroller.onConsoleCommand(command)
			
		if not result:
			result = 'Command Not Found...'
		
		return result
		
	def onToolsClick(self):
		print "No tools set up yet"

class RPGApplication(ApplicationBase):
	"""
	The main application.  It inherits fife.extensions.ApplicationBase.
	
	Implements ApplicationBase._pump().
	"""
	def __init__(self, TDS):
		super(RPGApplication,self).__init__(TDS)
		self._settings = TDS
		
		self._gamecontroller = GameController(self, self.engine, self._settings)

	def createListener(self):
		"""
		@note: This function had to be overloaded otherwise the default
		listener would have been created.
		"""
		self._listener = ApplicationListener(self.engine, self._gamecontroller)
		return self._listener
		
	def requestQuit(self):
		"""
		Sends the quit command to the application's listener.  We could set
		self.quitRequested to true also but this is a good example on how
		to build and dispatch a fife.Command.
		"""
		cmd = fife.Command()
		cmd.setSource(None)
		cmd.setCommandType(fife.CMD_QUIT_GAME)
		self.engine.getEventManager().dispatchCommand(cmd)

	def _pump(self):
		if self._listener.quit:
			self._gamecontroller.endGame()
			self.quit()
		else:
			self._gamecontroller.pump()
			
			
	def _getLogManager(self):
		return self._log
		
	logger = property(_getLogManager)