import bge import random import FSM import astar import observer car_colors = [[.2,.01,.01,1], [.5,.5,.4,1], [.005,.01,.015,1], [.005, .1, 0.003, 1], [.1, .1, .1, 1]] def idle_run_check(self): output = False for x in bge.logic.getCurrentScene().objects: if 'walker_idle_empty' in x.name: self.idle_spots.append(x) x['in_use'] = False #print('this is a parking spot') output = True return output def get_idle_spots(): op = [] for obj in bge.logic.getCurrentScene().objects: if 'idle_spot' in obj: ps = IdleSpot(obj, 'available') op.append(ps) return op def get_intersections(): op = [] for obj in bge.logic.getCurrentScene().objects: if 'intersection' in obj: op.append(obj) return op def add_walker(self, x): #print('put car here', x.obj.worldPosition) walker = bge.logic.getCurrentScene().addObject('larryCube', x.obj, 0) walker.worldOrientation = x.obj.worldOrientation walker.worldPosition.z += .8 #car.applyMovement([0, -6, 0], True) #car.suspendDynamics() #car.suspendPhysics() walker.name = 'lwalker' + str(len(self.manager.walkers)) #color = random.choice(car_colors) #walker.color = color #for y in car.children: #y.color = color #print('setting car color to ', car.color) x.status = 'in_use' return walker #==================================== class IdleSpot: def __init__(self, obj, status): self.obj = obj self.status = status class Walker: def __init__(self, own, start_empty): self.manager = own self.life = 0 self.start_empty = start_empty self.obj = add_walker(self, self.start_empty) self.speed_targ = self.manager.default_speed self.speed_inc = 100 self.FSM = FSM.WalkerFSM(self) self.active = False self.target = None self.lane_point = self.obj.worldPosition self.last_lane_point = self.obj.worldPosition self.path = None self.path_index = 0 self.path_display = [] #self.messages = observer.Subscriber(self) self.manager.pub.register("path found", self) def Execute(self): self.FSM.Execute() self.life += 1 def ReceiveMessage(self, message): #print('{} got message "{}"'.format(self, message)) if self == message[1]: #print('unregistering observer') #print(message[2]) self.path = message[2] self.FSM.FSM.ToTransition('toExitParallelPark') #self.manager.pub.unregister("path found", self) #self.manager.pub.unregister("path found", self) class WalkerManager: def __init__(self, own): self.parent = own self.navmesh =None self.pub = observer.Publisher(['path found', 'working']) self.navmesh2 = astar.Astar('walker_nav_points', self.pub) self.walkers = [] self.max_walkers = 12 self.max_active = 10 self.targets = [] self.target_loc = None self.idle_spots = get_idle_spots() #self.intersections = get_intersections() #self.active = car_run_check(self) self.active = True self.walkers_active = [] self.walkers_loaded = False #self.max_active = 5 self.life = 0 self.default_speed = 1.0#5.0 self.lane_position = 0.5#1.75 def load_walkers(self): iter_ = 0 #look for car in scene if 'larryCube' in bge.logic.getCurrentScene().objectsInactive: start_choices = self.idle_spots.copy() while len(self.walkers) < self.max_walkers: #get starting position start_choice = random.choice(start_choices) start_choices.remove(start_choice) #add_car(self, start_choice.worldPosition) walker_ = Walker(self, start_choice) self.walkers.append(walker_) for x in self.idle_spots: iter_ += 1 self.walkers_loaded = True else: mainDir = bge.logic.expandPath("//npc_walkers/") npc = 'larry' fileName = mainDir + str(npc) + '.blend' path = bge.logic.expandPath(fileName) print('loading npc') try: #bge.logic.LibLoad(path, 'Scene') bge.logic.LibLoad(fileName, 'Scene') print('larry loaded') except Exception as e: print('loading', fileName, 'failed', e) def activator_check(self): if len(self.walkers_active) < self.max_active: l = [] for c in self.walkers: if not c.active: l.append(c) walker = random.choice(l) self.walkers_active.append(walker) walker.active = True walker.FSM.FSM.ToTransition('toRequestPath') #state print('activate walker', walker) def update(self): #print('car_manager_updating') self.life += 1 if self.walkers_loaded: #check i f new car should be active if self.life % 180 == 0: self.activator_check() for walker in self.walkers_active: walker.Execute() #print(car, 'is an acitve car') self.navmesh2.update() #print('updating navmesh from cars') else: self.load_walkers() print('------------calling walkers') def Execute(cont): own = cont.owner if 'walker_manager' not in own: own['walker_manager'] = WalkerManager(own) walker_man = own['walker_manager'] #print('running walkers') if walker_man.active: walker_man.update()