view demos/rpg/scripts/quests/questmanager.py @ 693:5e010218273d

This commit is to back port a fix from 0.3.3 dev branch to the trunk. The directory provider will now use the boost::filesystem::is_directory function to determine if the passed in source is a directory. This allows a python client (through VFS::addNewSource) to add a directory source that is either an absolute path or a relative path from where the application is launched. [t:544]
author vtchill@33b003aa-7bff-0310-803a-e67f0ece8222
date Wed, 08 Jun 2011 04:34:50 +0000
parents 9152ed2b5bb8
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
# ####################################################################
# This is the rio de hola client for FIFE.

from fife import fife

from fife.extensions.serializers.simplexml import SimpleXMLSerializer
from scripts.quests.basequest import Quest, ReturnItemQuest, QuestTypes
from scripts.misc.serializer import Serializer

class QuestManager(Serializer):
	def __init__(self, gamecontroller):
		self._gamecontroller = gamecontroller

		self._questsettings = None
		
		self._quests = {}
		self._activequests = []
		self._completedquests = []
	
	def serialize(self):
		pass
	
	def deserialize(self, valuedict=None):
		questfile = self._gamecontroller.settings.get("RPG", "QuestFile", "maps/quests.xml")
		
		self._questsettings = SimpleXMLSerializer(questfile)
		
		for identifier in self._questsettings.get("QuestGivers", "list", []):
			for quest in self._questsettings.get(identifier, "questlist", []):
					questdict = self._questsettings.get(identifier, quest, {})
					if questdict['type'] == "RETURN_ITEM":
						questobj = ReturnItemQuest(identifier, quest, questdict['name'], questdict['desc'])
						for ritem in self._questsettings.get(quest+"_items", "itemlist", []):
							itemdict = self._questsettings.get(quest+"_items", ritem, {})
							if itemdict["name"] == "GOLD_COINS":
								questobj.addRequiredGold(int(itemdict['value']))
							else:
								questobj.addRequiredItem(ritem)
					else:
						questobj = Quest(identifier, quest, questdict['name'], questdict['desc'])

					if questdict.has_key("quest_incomplete_dialog"):
						questobj._incomplete_dialog = questdict['quest_incomplete_dialog']
						
					if questdict.has_key("quest_complete_dialog"):
						questobj._complete_dialog = questdict['quest_complete_dialog']

					self._gamecontroller.questmanager.addQuest(questobj)
	
	def reset(self):
		self._quests = {}
		self._activequests = []
		self._completedquests = []
		
	def addQuest(self, quest):
		if self._quests.has_key(quest.ownerid):
			if not quest in self._quests[quest.ownerid]:
				self._quests[quest.ownerid].append(quest)
		else:
			self._quests[quest.ownerid] = [quest]

	def getQuest(self, questid):
		for owner in self._quests:
			for quest in self._quests[owner]:
				if quest.id == questid:
					return quest
		
		return None

	def getNextQuest(self, ownerid):
		if self._quests.has_key(ownerid):
			for quest in self._quests[ownerid]:
				if not quest in self._activequests and not quest in self._completedquests:
					return quest

		return None
		
	def activateQuest(self, quest):
		"""
		Adds the quest to the "active quests" list.  Note that this does NOT affect
		the quest in any way.  It's just a way of keeping track of which quests
		the player has accepted.
		"""
		if not quest in self._activequests:
			self._activequests.append(quest)
		
	def completeQuest(self, quest):
		"""
		Marks the quest as completed.  Note that this does NOT modify the quest in
		any way.  This is just a way to keep track of completed quests.
		"""
		if not quest in self._completedquests:
			self._completedquests.append(quest)
		
		if quest in self._activequests:
			self._activequests.remove(quest)
		
	def activateQuestById(self, questid):
		quest = self.getQuest(questid)
		if quest:
			self.activateQuest(quest)
		
	def completeQuestById(self, questid):
		quest = self.getQuest(questid)
		if quest:
			self.completeQuest(quest)
	
	def _getActiveQuests(self):
		return self._activequests
		
	def _getCompletedQuests(self):
		return self._completedquests
	
	def _getAllQuests(self):
		return self._quests
	
	activequests = property(_getActiveQuests)
	completedquests = property(_getCompletedQuests)
	quests = property(_getAllQuests)