1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#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
|