cyphesis/rulesets/basic/mind/Goal.py
Al Riddoch ba57f6e668 2007-09-06 Al Riddoch <alriddoch@zepler.org>
* rulesets/basic/mind/panlingua/interlinguish.py: Add the list verb.

	* rulesets/basic/mind/Goal.py: Add a __repr__() method to make it
	  more intuitive to get a text representation of a goal.

	* rulesets/basic/mind/NPCMind.py: Add a handler for the list verb
	  that causes all the matching knowledge to be listed.
2007-09-06 22:17:57 +00:00

77 lines
2.8 KiB
Python

#This file is distributed under the terms of the GNU General Public license.
#Copyright (C) 1999 Aloril (See the file COPYING for details).
from types import *
from atlas import *
from common import log
## \defgroup PythonGoals Goal Classes
## \brief Base class for all goals
## \ingroup PythonGoals
class Goal:
def __init__(self,desc="some goal",fulfilled=None,subgoals=[],
time=None, debug=0):
self.desc=desc
#mind sets these:
#self.str
#self.key
if fulfilled: self.fulfilled=fulfilled
else: self.fulfilled=lambda me:0 #false
self.subgoals=subgoals[:]
self.time=time
self.debug=debug
self.vars=[]
#any subgoal/function/method can set this and
#it's checked at start of check_goal_rec
#and NPCMind.py fulfill_goals uses it too to remove goals from list
self.irrelevant=0
def __repr__(self):
return self.info()
def info(self):
name=self.__class__.__name__
if name=="Goal":
return name+"("+`self.desc`+")"
var=""
for v in self.vars:
if var: var=var+","
var=var+`getattr(self,v)`
return name+"("+var+")"
def check_goal(self, me, time):
"executes goal, see top of file"
if self.debug:
log.thinking("GOAL desc: "+self.str)
res,deb=self.check_goal_rec(me,time,0)
if len(deb)!=0:
deb=self.info()+"."+deb
# print deb
if res!=None:
info_ent=Entity(op=res,description=deb)
return res+Operation("goal_info",info_ent)
def check_goal_rec(self, me, time, depth):
"""check (sub)goal recursively"""
res,deb=None,""
if self.irrelevant: return res,deb
#is it right time range?
if self.time and not time.is_now(self.time): return res,deb
if self.debug:
log.thinking("\t"*depth+"GOAL: bef fulfilled: "+self.desc+" "+`self.fulfilled`)
if self.fulfilled(me): return res,deb
for sg in self.subgoals:
if type(sg)==FunctionType or type(sg)==MethodType:
res=sg(me)
if res==None:
if self.debug:
log.thinking("\t"*depth+"GOAL: function: "+`sg`+" "+`res`)
deb=sg.__name__+"()"
return res,deb
else:
if self.debug:
log.thinking("\t"*depth+"GOAL: bef sg: "+sg.desc)
res,deb=sg.check_goal_rec(me,time,depth+1)
if self.debug:
log.thinking("\t"*depth+"GOAL: aft sg: "+sg.desc+" "+str(res))
if len(deb)>0:
deb=sg.info()+"."+deb
return res,deb
return res,deb