示例#1
0
	def __init__(self):
		self.pump = []

		self._setting = Settings(PATHS.USER_CONFIG_FILE, PATHS.SETTINGS_TEMPLATE_FILE)
		self.engine = fife.Engine()
		self.engine_settings = self.engine.getSettings()

		self.init_logging()
		self.load_settings()

		self.pychan = pychan

		self.quit_requested = False
		self.break_requested = False
		self.return_values = None
		self._got_inited = False
	def __init__(self):
		self.pump = []

		self._setting = Settings(PATHS.USER_CONFIG_FILE, PATHS.SETTINGS_TEMPLATE_FILE)
		self.engine = fife.Engine()
		self.engine_settings = self.engine.getSettings()

		self.init_logging()
		self.load_settings()

		self.pychan = pychan

		self.quit_requested = False
		self.break_requested = False
		self.return_values = None
		self._got_inited = False
class Fife:
	"""
	Basic initiation of engine. Followed later by init().
	"""
	log = logging.getLogger('engine.engine')

	def __init__(self):
		self.pump = []

		self._setting = Settings(PATHS.USER_CONFIG_FILE, PATHS.SETTINGS_TEMPLATE_FILE)
		self.engine = fife.Engine()
		self.engine_settings = self.engine.getSettings()

		self.init_logging()
		self.load_settings()

		self.pychan = pychan

		self.quit_requested = False
		self.break_requested = False
		self.return_values = None
		self._got_inited = False

	def load_settings(self):
		"""
		Load the settings from a python file and load them into the engine.
		Called in the ApplicationBase constructor.
		"""
		# get finalSetting (from the xml file, or if absent the default value)
		self._finalSetting = self._setting.get_module_settings("FIFE")

		self.engine_settings = self.engine.getSettings()

		self.engine_settings.setDefaultFontPath(self._finalSetting['Font'])
		self.engine_settings.setBitsPerPixel(self._finalSetting['BitsPerPixel'])
		self.engine_settings.setInitialVolume(self._finalSetting['InitialVolume'])
		self.engine_settings.setSDLRemoveFakeAlpha(self._finalSetting['SDLRemoveFakeAlpha'])
		self.engine_settings.setGLCompressImages(self._finalSetting['GLCompressImages'])
		self.engine_settings.setGLUseFramebuffer(self._finalSetting['GLUseFramebuffer'])
		self.engine_settings.setGLUseNPOT(self._finalSetting['GLUseNPOT'])

		# introduced in fife 0.4.0
		self.engine_settings.setGLUseMonochrome(self._finalSetting['GLUseMonochrome'])
		self.engine_settings.setGLUseMipmapping(self._finalSetting['GLUseMipmapping'])
		if self._finalSetting['GLTextureFiltering'] == 'None':
			self.engine_settings.setGLTextureFiltering(fife.TEXTURE_FILTER_NONE)
		elif self._finalSetting['GLTextureFiltering'] == 'Bilinear':
			self.engine_settings.setGLTextureFiltering(fife.TEXTURE_FILTER_BILINEAR)
		elif self._finalSetting['GLTextureFiltering'] == 'Trilinear':
			self.engine_settings.setGLTextureFiltering(fife.TEXTURE_FILTER_TRILINEAR)
		elif self._finalSetting['GLTextureFiltering'] == 'Anisotropic':
			self.engine_settings.setGLTextureFiltering(fife.TEXTURE_FILTER_ANISOTROPIC)
		self.engine_settings.setGLUseDepthBuffer(self._finalSetting['GLUseDepthBuffer'])
		self.engine_settings.setGLAlphaTestValue(self._finalSetting['GLAlphaTestValue'])

		(width, height) = self._finalSetting['ScreenResolution'].split('x')
		self.engine_settings.setScreenWidth(int(width))
		self.engine_settings.setScreenHeight(int(height))
		self.engine_settings.setRenderBackend(self._finalSetting['RenderBackend'])
		self.engine_settings.setFullScreen(self._finalSetting['FullScreen'])
		self.engine_settings.setLightingModel(self._finalSetting['Lighting'])

		try:
			self.engine_settings.setColorKeyEnabled(self._finalSetting['ColorKeyEnabled'])
		except:
			pass

		try:
			self.engine_settings.setColorKey(
				self._finalSetting['ColorKey'][0],
				self._finalSetting['ColorKey'][1],
				self._finalSetting['ColorKey'][2])
		except:
			pass

		try:
			self.engine_settings.setWindowTitle(self._finalSetting['WindowTitle'])
			self.engine_settings.setWindowIcon(self._finalSetting['WindowIcon'])
		except:
			pass

		try:
			self.engine_settings.setFrameLimitEnabled(self._finalSetting['FrameLimitEnabled'])
			self.engine_settings.setFrameLimit(self._finalSetting['FrameLimit'])
		except:
			pass

		try:
			self.engine_settings.setMouseSensitivity(self._finalSetting['MouseSensitivity'])
		except:
			pass

		try:
			self.engine_settings.setMouseAccelerationEnabled(self._finalSetting['MouseAcceleration'])
		except:
			pass

	def init_logging(self):
		"""Initialize the LogManager."""

		# If desired, log to the console and/or the log file.
		log_to_prompt = self._setting.get(SETTINGS.FIFE_MODULE, "LogToPrompt", False)
		log_to_file = self._setting.get(SETTINGS.FIFE_MODULE, "LogToFile", False)
		self._log = fifelog.LogManager(self.engine, log_to_prompt, log_to_file)

		log_level = self._setting.get(SETTINGS.FIFE_MODULE, "LogLevelFilter",
		                              fife.LogManager.LEVEL_DEBUG)
		self._log.setLevelFilter(log_level)

		logmodules = self._setting.get(SETTINGS.FIFE_MODULE, "LogModules", ["controller"])
		if logmodules:
			self._log.setVisibleModules(*logmodules)

	def init(self):
		"""Second initialization stage of engine"""
		self.engine.init()

		# Init stuff.
		self.eventmanager = self.engine.getEventManager()
		self.sound = Sound(self)
		self.imagemanager = self.engine.getImageManager()
		self.animationmanager = self.engine.getAnimationManager()
		self.targetrenderer = self.engine.getTargetRenderer()
		self.animationloader = None

		# Set game cursor.
		self.cursor = self.engine.getCursor()
		cursor_images = {
			'default':   'content/gui/images/cursors/cursor.png',
			'tearing':   'content/gui/images/cursors/cursor_tear.png',
			'attacking': 'content/gui/images/cursors/cursor_attack.png',
			'pipette':   'content/gui/images/cursors/cursor_pipette.png',
			'rename':    'content/gui/images/cursors/cursor_rename.png',
		}
		self.cursor_images = {k: self.imagemanager.load(v) for k, v in cursor_images.items()}
		self.cursor.set(self.cursor_images['default'])

		# Init pychan.
		# Enabling pychan's debug mode may have performance impacts.
		# Because of this, the default PychanDebug value is False.
		debug_pychan = self.get_fife_setting('PychanDebug')
		self.pychan.init(self.engine, debug_pychan)

		init_pychan()
		self._setting.apply()

		self._got_inited = True

	def init_animation_loader(self, use_atlases):
		# this method should not be called from init to catch any bugs caused by the loader changing after it.
		self.use_atlases = use_atlases
		if self.use_atlases:
			self.animationloader = SQLiteAtlasLoader()
		else:
			self.animationloader = SQLiteAnimationLoader()

	def set_cursor_image(self, which="default"):
		"""Sets a certain cursor image.
		See definition of cursor_images for reference."""
		self.cursor.set(self.cursor_images[which])

	def get_fife_setting(self, settingname):
		return self._setting.get(SETTINGS.FIFE_MODULE, settingname)

	def set_fife_setting(self, settingname, value):
		"""Probably saves setting in memory. Call save_settings() later"""
		return self._setting.set(SETTINGS.FIFE_MODULE, settingname, value)

	def get_uh_setting(self, settingname):
		return self._setting.get(SETTINGS.UH_MODULE, settingname)

	def set_uh_setting(self, settingname, value):
		"""Probably saves setting in memory. Call save_settings() later"""
		self._setting.set(SETTINGS.UH_MODULE, settingname, value)

	def get_hotkey_settings(self):
		return self._setting.get_module_settings(SETTINGS.KEY_MODULE)

	def get_keys_for_action(self, action, default=False):
		"""Returns list of current hotkeys for *action* or its default hotkeys."""
		if default:
			keys = self._setting.get_module_template_settings(SETTINGS.KEY_MODULE).get(action)
		else:
			keys = self._setting.get(SETTINGS.KEY_MODULE, action)
		return keys

	def set_key_for_action(self, action, newkey):
		"""Replaces all existing hotkeys for *action* with *newkey*."""
		self._setting.set(SETTINGS.KEY_MODULE, action, newkey)

	def add_key_for_action(self, action, addkey):
		"""Adds hotkey *addkey* to list of hotkeys for action *action*."""
		old_keys = self._setting.get(SETTINGS.KEY_MODULE, action, [])
		new_keys = set(old_keys + [addkey])
		self.set_key_for_action(action, list(new_keys))

	def remove_key_for_action(self, action, remkey):
		"""Removes hotkey *remkey* from list of hotkeys for action *action*."""
		old_keys = self._setting.get(SETTINGS.KEY_MODULE, action, [])
		if remkey in old_keys:
				old_keys.remove(remkey)
		if not old_keys:
				print('Cannot have no binding for action')
				return
		self.set_key_for_action(action, old_keys)

	def replace_key_for_action(self, action, oldkey, newkey):
		"""Replaces key *oldkey* with key *newkey* for action *action*"""
		old_keys = self._setting.get(SETTINGS.KEY_MODULE, action, [])
		if oldkey not in old_keys:
			return
		index = old_keys.index(oldkey)
		old_keys[index] = newkey
		self.set_key_for_action(action, old_keys)

	def save_settings(self):
		self._setting.save()

	def play_sound(self, emitter, soundfile):
		"""Plays a soundfile on the given emitter.
		@param emitter: string with the emitters name in horizons.globals.fife.sound.emitter that is to play the  sound
		@param soundfile: string containing the path to the soundfile"""
		self.sound.play_sound(emitter, soundfile)

	def get_locale(self):
		langname = self.get_uh_setting('Language')
		locale_code = LANGUAGENAMES.get_by_value(langname)
		if not langname == 'System default':
				return locale_code
		try:
			default_locale, default_encoding = locale.getdefaultlocale()
			return default_locale.split('_')[0]
		except (ValueError, AttributeError):
			# OS X sometimes returns 'UTF-8' as locale, which is a ValueError.
			# If no locale is set at all, the split will fail, which is an AttributeError.
			# Use 'EN' as fallback in both cases since we cannot reasonably detect the locale.
			return "en"

	def run(self):
		assert self._got_inited

		self.engine.initializePumping()
		self.loop()
		self.engine.finalizePumping()
		self.__kill_engine()

	def loop(self):
		while not self.quit_requested:
			try:
				self.engine.pump()
			except RuntimeError:
				import sys
				print("Unknown Horizons exited uncleanly via SIGINT")
				self._log.log_warn("Unknown Horizons exited uncleanly via SIGINT")
				sys.exit(1)
			except fife.Exception as e:
				print(e.getMessage())
				break
			for f in self.pump:
				f()
			if self.break_requested:
				self.break_requested = False
				return self.return_values

	def __kill_engine(self):
		"""Called when the engine is quit"""
		# A hack to get the system cursor back:
		self.cursor.set(fife.CURSOR_NATIVE)
		self.engine.destroy()

	def breakLoop(self, returnValue=None):
		self.return_values = returnValue
		self.break_requested = True

	def quit(self):
		"""Quits the engine."""
		self.quit_requested = True

	@classmethod
	def getVersion(cls):
		"""Returns a tuple (Major, Minor, Patch) version of the current running Fife."""
		try:
			return (fife.getMajor(), fife.getMinor(), fife.getPatch())
		except AttributeError:
			return (0, 0, 0)
示例#4
0
class Fife:
    """
	Basic initiation of engine. Followed later by init().
	"""
    log = logging.getLogger('engine.engine')

    def __init__(self):
        self.pump = []

        self._setting = Settings(PATHS.USER_CONFIG_FILE,
                                 PATHS.SETTINGS_TEMPLATE_FILE)
        self.engine = fife.Engine()
        self.engine_settings = self.engine.getSettings()

        self.init_logging()
        self.load_settings()

        self.pychan = pychan

        self.quit_requested = False
        self.break_requested = False
        self.return_values = None
        self._got_inited = False

    def load_settings(self):
        """
		Load the settings from a python file and load them into the engine.
		Called in the ApplicationBase constructor.
		"""
        # get finalSetting (from the xml file, or if absent the default value)
        self._finalSetting = self._setting.get_module_settings("FIFE")

        self.engine_settings = self.engine.getSettings()

        self.engine_settings.setDefaultFontPath(self._finalSetting['Font'])
        self.engine_settings.setBitsPerPixel(
            self._finalSetting['BitsPerPixel'])
        self.engine_settings.setInitialVolume(
            self._finalSetting['InitialVolume'])
        self.engine_settings.setSDLRemoveFakeAlpha(
            self._finalSetting['SDLRemoveFakeAlpha'])
        self.engine_settings.setGLCompressImages(
            self._finalSetting['GLCompressImages'])
        self.engine_settings.setGLUseFramebuffer(
            self._finalSetting['GLUseFramebuffer'])
        self.engine_settings.setGLUseNPOT(self._finalSetting['GLUseNPOT'])

        # introduced in fife 0.4.0
        if self.getVersion() >= (0, 4, 0):
            self.engine_settings.setGLUseMonochrome(
                self._finalSetting['GLUseMonochrome'])
            self.engine_settings.setGLUseMipmapping(
                self._finalSetting['GLUseMipmapping'])
            if self._finalSetting['GLTextureFiltering'] == 'None':
                self.engine_settings.setGLTextureFiltering(
                    fife.TEXTURE_FILTER_NONE)
            elif self._finalSetting['GLTextureFiltering'] == 'Bilinear':
                self.engine_settings.setGLTextureFiltering(
                    fife.TEXTURE_FILTER_BILINEAR)
            elif self._finalSetting['GLTextureFiltering'] == 'Trilinear':
                self.engine_settings.setGLTextureFiltering(
                    fife.TEXTURE_FILTER_TRILINEAR)
            elif self._finalSetting['GLTextureFiltering'] == 'Anisotropic':
                self.engine_settings.setGLTextureFiltering(
                    fife.TEXTURE_FILTER_ANISOTROPIC)
            self.engine_settings.setGLUseDepthBuffer(
                self._finalSetting['GLUseDepthBuffer'])
            self.engine_settings.setGLAlphaTestValue(
                self._finalSetting['GLAlphaTestValue'])

        (width, height) = self._finalSetting['ScreenResolution'].split('x')
        self.engine_settings.setScreenWidth(int(width))
        self.engine_settings.setScreenHeight(int(height))
        self.engine_settings.setRenderBackend(
            self._finalSetting['RenderBackend'])
        self.engine_settings.setFullScreen(self._finalSetting['FullScreen'])
        self.engine_settings.setLightingModel(self._finalSetting['Lighting'])

        try:
            self.engine_settings.setColorKeyEnabled(
                self._finalSetting['ColorKeyEnabled'])
        except:
            pass

        try:
            self.engine_settings.setColorKey(self._finalSetting['ColorKey'][0],
                                             self._finalSetting['ColorKey'][1],
                                             self._finalSetting['ColorKey'][2])
        except:
            pass

        try:
            self.engine_settings.setWindowTitle(
                self._finalSetting['WindowTitle'])
            self.engine_settings.setWindowIcon(
                self._finalSetting['WindowIcon'])
        except:
            pass

        try:
            self.engine_settings.setFrameLimitEnabled(
                self._finalSetting['FrameLimitEnabled'])
            self.engine_settings.setFrameLimit(
                self._finalSetting['FrameLimit'])
        except:
            pass

        try:
            self.engine_settings.setMouseSensitivity(
                self._finalSetting['MouseSensitivity'])
        except:
            pass

        try:
            self.engine_settings.setMouseAccelerationEnabled(
                self._finalSetting['MouseAcceleration'])
        except:
            pass

    def init_logging(self):
        """Initialize the LogManager."""

        # If desired, log to the console and/or the log file.
        log_to_prompt = self._setting.get(SETTINGS.FIFE_MODULE, "LogToPrompt",
                                          False)
        log_to_file = self._setting.get(SETTINGS.FIFE_MODULE, "LogToFile",
                                        False)
        self._log = fifelog.LogManager(self.engine, log_to_prompt, log_to_file)

        log_level = self._setting.get(SETTINGS.FIFE_MODULE, "LogLevelFilter",
                                      fife.LogManager.LEVEL_DEBUG)
        self._log.setLevelFilter(log_level)

        logmodules = self._setting.get(SETTINGS.FIFE_MODULE, "LogModules",
                                       ["controller"])
        if logmodules:
            self._log.setVisibleModules(*logmodules)

    def init(self):
        """Second initialization stage of engine"""
        self.engine.init()

        # Init stuff.
        self.eventmanager = self.engine.getEventManager()
        self.sound = Sound(self)
        self.imagemanager = self.engine.getImageManager()
        self.animationmanager = self.engine.getAnimationManager()
        self.targetrenderer = self.engine.getTargetRenderer()
        self.animationloader = None

        # Set game cursor.
        self.cursor = self.engine.getCursor()
        cursor_images = {
            'default': 'content/gui/images/cursors/cursor.png',
            'tearing': 'content/gui/images/cursors/cursor_tear.png',
            'attacking': 'content/gui/images/cursors/cursor_attack.png',
            'pipette': 'content/gui/images/cursors/cursor_pipette.png',
            'rename': 'content/gui/images/cursors/cursor_rename.png',
        }
        self.cursor_images = {
            k: self.imagemanager.load(v)
            for k, v in cursor_images.items()
        }
        self.cursor.set(self.cursor_images['default'])

        # Init pychan.
        # Enabling pychan's debug mode may have performance impacts.
        # Because of this, the default PychanDebug value is False.
        debug_pychan = self.get_fife_setting('PychanDebug')
        self.pychan.init(self.engine, debug_pychan)

        init_pychan()
        self._setting.apply()

        self._got_inited = True

    def init_animation_loader(self, use_atlases):
        # this method should not be called from init to catch any bugs caused by the loader changing after it.
        self.use_atlases = use_atlases
        if self.use_atlases:
            self.animationloader = SQLiteAtlasLoader()
        else:
            self.animationloader = SQLiteAnimationLoader()

    def set_cursor_image(self, which="default"):
        """Sets a certain cursor image.
		See definition of cursor_images for reference."""
        self.cursor.set(self.cursor_images[which])

    def get_fife_setting(self, settingname):
        return self._setting.get(SETTINGS.FIFE_MODULE, settingname)

    def set_fife_setting(self, settingname, value):
        """Probably saves setting in memory. Call save_settings() later"""
        return self._setting.set(SETTINGS.FIFE_MODULE, settingname, value)

    def get_uh_setting(self, settingname):
        return self._setting.get(SETTINGS.UH_MODULE, settingname)

    def set_uh_setting(self, settingname, value):
        """Probably saves setting in memory. Call save_settings() later"""
        self._setting.set(SETTINGS.UH_MODULE, settingname, value)

    def get_hotkey_settings(self):
        return self._setting.get_module_settings(SETTINGS.KEY_MODULE)

    def get_keys_for_action(self, action, default=False):
        """Returns list of current hotkeys for *action* or its default hotkeys."""
        if default:
            keys = self._setting.get_module_template_settings(
                SETTINGS.KEY_MODULE).get(action)
        else:
            keys = self._setting.get(SETTINGS.KEY_MODULE, action)
        return keys

    def set_key_for_action(self, action, newkey):
        """Replaces all existing hotkeys for *action* with *newkey*."""
        self._setting.set(SETTINGS.KEY_MODULE, action, newkey)

    def add_key_for_action(self, action, addkey):
        """Adds hotkey *addkey* to list of hotkeys for action *action*."""
        old_keys = self._setting.get(SETTINGS.KEY_MODULE, action, [])
        new_keys = set(old_keys + [addkey])
        self.set_key_for_action(action, list(new_keys))

    def remove_key_for_action(self, action, remkey):
        """Removes hotkey *remkey* from list of hotkeys for action *action*."""
        old_keys = self._setting.get(SETTINGS.KEY_MODULE, action, [])
        if remkey in old_keys:
            old_keys.remove(remkey)
        if not old_keys:
            print('Cannot have no binding for action')
            return
        self.set_key_for_action(action, old_keys)

    def replace_key_for_action(self, action, oldkey, newkey):
        """Replaces key *oldkey* with key *newkey* for action *action*"""
        old_keys = self._setting.get(SETTINGS.KEY_MODULE, action, [])
        if oldkey not in old_keys:
            return
        index = old_keys.index(oldkey)
        old_keys[index] = newkey
        self.set_key_for_action(action, old_keys)

    def save_settings(self):
        self._setting.save()

    def play_sound(self, emitter, soundfile):
        """Plays a soundfile on the given emitter.
		@param emitter: string with the emitters name in horizons.globals.fife.sound.emitter that is to play the  sound
		@param soundfile: string containing the path to the soundfile"""
        self.sound.play_sound(emitter, soundfile)

    def get_locale(self):
        langname = self.get_uh_setting('Language')
        locale_code = LANGUAGENAMES.get_by_value(langname)
        if not langname == 'System default':
            return locale_code
        try:
            default_locale, default_encoding = locale.getdefaultlocale()
            return default_locale.split('_')[0]
        except (ValueError, AttributeError):
            # OS X sometimes returns 'UTF-8' as locale, which is a ValueError.
            # If no locale is set at all, the split will fail, which is an AttributeError.
            # Use 'EN' as fallback in both cases since we cannot reasonably detect the locale.
            return "en"

    def run(self):
        assert self._got_inited

        self.engine.initializePumping()
        self.loop()
        self.engine.finalizePumping()
        self.__kill_engine()

    def loop(self):
        while not self.quit_requested:
            try:
                self.engine.pump()
            except RuntimeError:
                import sys
                print("Unknown Horizons exited uncleanly via SIGINT")
                self._log.log_warn(
                    "Unknown Horizons exited uncleanly via SIGINT")
                sys.exit(1)
            except fife.Exception as e:
                print(e.getMessage())
                break
            for f in self.pump:
                f()
            if self.break_requested:
                self.break_requested = False
                return self.return_values

    def __kill_engine(self):
        """Called when the engine is quit"""
        # A hack to get the system cursor back:
        self.cursor.set(fife.CURSOR_NATIVE)
        self.engine.destroy()

    def breakLoop(self, returnValue=None):
        self.return_values = returnValue
        self.break_requested = True

    def quit(self):
        """Quits the engine."""
        self.quit_requested = True

    @classmethod
    def getVersion(cls):
        """Returns a tuple (Major, Minor, Patch) version of the current running Fife."""
        try:
            return (fife.getMajor(), fife.getMinor(), fife.getPatch())
        except AttributeError:
            return (0, 0, 0)