""" body.py Copyright (C) 1998-1999 Aloril This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. """ import whrandom from types import * from copy import copy,deepcopy from thing import thing from vbody import vbody import const,geometry,wtime,prob from event import * from mind import mind from misc import * class mind_events(thing): "process events from mind (check validity etc..)" def __init__(self, body): thing.__init__(self,name=body.name) self.body=body self.mind=body.mind #event handling: #e is current input event #may return new events def move_event(self,e): e2=copy(e) w=e.what #source source_xyz=w.get_xyz() if type(source_xyz)!=TupleType: return [event("illegal",what=e,what_desc="source_xyz")] source_xyz=tuple(map(float,source_xyz)) #target try: target_xyz=e.loc.get_xyz() except AttributeError: target_xyz=e.loc if type(target_xyz)!=TupleType: return [event("illegal",what=e,what_desc="target_xyz")] target_xyz=tuple(map(float,target_xyz)) #decide how far if geometry.distance(source_xyz,target_xyz)>100.0: target=geometry.distance_from_begin(source_xyz,target_xyz,100.0) else: target=e.loc e2.loc=target if not e2.target: e2.target=e2.what return [e2] def cut_event(self,e): t=e.what #thing return [event("change",target=t,what=t,amount=-0.1)] def make_event(self,e): what=get_thing_class(e.what) if e.loc: t=apply(what,(),{"name":e.what, "desc":e.what_desc, "place":e.what_desc, "xyz":e.loc, "status":0.1, "age":0.0}) else: t=apply(what,(),{"name":e.what, "desc":e.what_desc, "place":self.body, "status":0.1}) return [event("make", what=t)] def change_event(self,e): if not e.target: e.target=e.what return [e] def undefined_event(self,e): #just pass others return [e] class world_events(thing): "process events from world to mind (filter when being in sleep or drunk)" #CHEAT! #input: no filtering currently (in future: filter when being in sleep or drunk) def __init__(self, body): thing.__init__(self,name=body.name) self.body=body self.mind=body.mind #event handling: #e is current input event #may return new events def move_event(self,e): #these go through body and #are handled as sight event pass def change_event(self,e): #see above pass def look_event(self,e): #ignored pass def undefined_event(self,e): #passed unchanged return [e] class body(vbody): def __init__(self, **kw): apply(thing.__init__,(self,),kw) set_kw(self,kw,"sex","female") #additional attributes are set later self.mind=None self.wevents=world_events(self) self.mevents=mind_events(self) #event handling: #e is current input event #may return new events #for others: see thing.py #def destroy_event(self, e): # self.mevents.destroy() # self.mind=None def run_step(self,time,input): """run one time step: feed input to mind and filter/modify output""" if not self.mind: self.mind=mind(self.id) input=self.look_event(event("look"))+input output=[] #random events #death (CHEAT!: should use some chance/time) #should take into account age too if prob.die(self.age): #CHEAT! : leak: add things back to world #should be done by world e=event("destroy", desc="death", what=self) input.append(e) output.append(e) if (prob.birth(self.age) and self.sex=="female") or \ hasattr(self,"give_birth_now"): if hasattr(self,"give_birth_now"): del self.give_birth_now #it gives birth #CHEAT!: name should be given by parents! #do it when generally implement talk/rumors name=self.name+`whrandom.randint(0,9)` baby=ething(name,type=self.get_short_type(), sex=whrandom.choice(['male','female']), age=0.0,copy=self) e=event("make", desc="birth", what=baby) #input.append(e) output.append(e) body_output=self.analyse_input(input) input2=self.wevents.analyse_input(input+body_output) mind_output=self.send_events(time,input2) #process that output to check how legal it is output=output+self.mevents.analyse_input(mind_output) return body_output+output