def GetPath(self, se): self.path_map = copy.deepcopy(self.map) n = m = self.map_size directions = 8 # number of possible directions to move on the map if directions == 4: dx = [1, 0, -1, 0] dy = [0, 1, 0, -1] elif directions == 8: dx = [1, 1, 0, -1, -1, -1, 0, 1] dy = [0, 1, 1, 1, 0, -1, -1, -1] [xA, yA, xB, yB] = se path = pathFind(copy.deepcopy(self.aug_map), directions, dx, dy, xA, yA, xB, yB, n, m) map_route = [] real_route = [] x = copy.deepcopy(xA) y = copy.deepcopy(yA) for t in xrange(len(path)): x+=dx[int(path[t])] y+=dy[int(path[t])] map_route.append([y, x]) self.path_map[y, x] = 2 real_route.append(self.Map2Real([y, x])) return map_route, real_route
def GetPath(self, se): n = m = self.map_size directions = 8 # number of possible directions to move on the map if directions == 4: dx = [1, 0, -1, 0] dy = [0, 1, 0, -1] elif directions == 8: dx = [1, 1, 0, -1, -1, -1, 0, 1] dy = [0, 1, 1, 1, 0, -1, -1, -1] [xA, yA, xB, yB] = se path = pathFind(copy.deepcopy(self.aug_map), directions, dx, dy, xA, yA, xB, yB, n, m) map_route = [] x = copy.deepcopy(xA) y = copy.deepcopy(yA) for t in xrange(len(path)): x+=dx[int(path[t])] y+=dy[int(path[t])] map_route.append([x, y]) if len(map_route) > 0: real_route = (np.asarray(map_route, dtype=float) * self.p2r).tolist() else: real_route = [] return map_route, real_route
def behaviourTask(self, task): if self.pause: return task.again #top priority, if we sense a player, go after him! if self.sensePlayer(): if time.time() - self.aggro_sound_last_played > 5: self.aggro_sound.play() self.aggro_sound_last_played = time.time() self.action = ACTION_CHASE return task.again elif self.orders == ORDERS_IDLE: #percent chance to go on patrol if percent( 10 ): self.orders = ORDERS_PATROL return task.again self.action = ACTION_IDLE elif self.orders == ORDERS_PATROL: #percent chance to get idle if percent( 5 ): self.orders = ORDERS_IDLE return task.again #if we are already patroling, dont change anything if self.action == ACTION_FOLLOW_PATH: return task.again #build a new path for patrol dest = self.getNewPatrolPoint() self.path = pathFind(self.parent.level, getTile(self.node.getPos()), dest) self.action = ACTION_FOLLOW_PATH elif self.orders == ORDERS_HERDING: self.action = ACTION_MOVE if time.time() - self.herding_timer > HERDING_TIMEOUT: self.orders = ORDERS_IDLE return task.again
def GetPathFromTable(self, se): path_table = copy.deepcopy(self.table) path_table[path_table!=0.] = 1. n = m = self.table_size directions = 4 # number of possible directions to move on the map if directions == 4: dx = [1, 0, -1, 0] dy = [0, 1, 0, -1] elif directions == 8: dx = [1, 1, 0, -1, -1, -1, 0, 1] dy = [0, 1, 1, 1, 0, -1, -1, -1] [xA, yA, xB, yB] = se table_path = pathFind(copy.deepcopy(path_table), directions, dx, dy, xA, yA, xB, yB, n, m) table_route = [] x = copy.deepcopy(xA) y = copy.deepcopy(yA) def interpolate_in_map(table_start, table_end, step=5): map_start = np.asarray(self.Table2Map(table_start)) map_end = np.asarray(self.Table2Map(table_end)) map_path = [] for t in xrange(1, step+1): map_path.append((map_start + (map_end - map_start)/step*t).tolist()) return map_path curr_table_pos = [x, y] table_route = [] map_route = [] real_route = [] self.path_map = copy.deepcopy(self.map) table_route = [curr_table_pos] for t in xrange(len(table_path)): x+=dx[int(table_path[t])] y+=dy[int(table_path[t])] last_table_pos = copy.deepcopy(curr_table_pos) curr_table_pos = [x, y] table_route.append(curr_table_pos) map_sub_route = interpolate_in_map(last_table_pos, curr_table_pos) map_route += map_sub_route for map_pos in map_sub_route: self.path_map[map_pos[1], map_pos[0]] = 2 real_route.append(self.Map2Real(map_pos)) return table_route, map_route, real_route
def behaviourTask(self, task): if self.pause: return task.again #top priority, if we sense a player, go after him! if self.sensePlayer(): if time.time() - self.aggro_sound_last_played > 5: self.aggro_sound.play() self.aggro_sound_last_played = time.time() self.action = ACTION_CHASE return task.again elif self.orders == ORDERS_IDLE: #percent chance to go on patrol if percent(10): self.orders = ORDERS_PATROL return task.again self.action = ACTION_IDLE elif self.orders == ORDERS_PATROL: #percent chance to get idle if percent(5): self.orders = ORDERS_IDLE return task.again #if we are already patroling, dont change anything if self.action == ACTION_FOLLOW_PATH: return task.again #build a new path for patrol dest = self.getNewPatrolPoint() self.path = pathFind(self.parent.level, getTile(self.node.getPos()), dest) self.action = ACTION_FOLLOW_PATH elif self.orders == ORDERS_HERDING: self.action = ACTION_MOVE if time.time() - self.herding_timer > HERDING_TIMEOUT: self.orders = ORDERS_IDLE return task.again
def sensePlayer(self): """Return True if player sensed, and his last known coordinates are stored in self.player_last_seen_abs""" # if the player is dead, do not sense him if self.parent.player.health <= 0: return False #get player's position p_pos_abs = self.parent.player.node.getPos() my_pos_abs = self.node.getPos() #--------------------------------SENSE--------------------------------- #if player is within SENSING_RANGE we know he is there if self.distanceToPlayer() < SENSING_RANGE: #print "TOO CLOSE LOOSER!" self.player_last_seen_abs = p_pos_abs return True #---------------------------------HEAR---------------------------------- #if player is within HEARING_RANGE we know he is there effective_hearing_range = HEARING_RANGE if self.parent.player.gunshot_at: effective_hearing_range *= 3 else: if self.parent.player.sprint: effective_hearing_range *= 2 if not self.parent.player.moving: effective_hearing_range = 0 if self.distanceToPlayer() < effective_hearing_range: print "I HEAR U!" self.parent.player.adrenaline() #if we can see go chase him if self.getLOS(): self.player_last_seen_abs = p_pos_abs return True #we cannot see him, build new path to that tile else: dest = getTile(p_pos_abs) path = pathFind(self.parent.level, getTile(self.node.getPos()), dest) if path: self.path = path self.orders = ORDERS_PATROL self.action = ACTION_FOLLOW_PATH return False #-------------------------------SEE--------------------------------- #if player is in front of us if self.angleToPlayerAbs() <= 45: #if he is close enough to see and we can see him if self.distanceToPlayer() <= VIEW_RANGE and self.getLOS(): self.player_last_seen_abs = p_pos_abs #print "vidim!" return True #if player has a flashlight lit, and we can see him go after him if self.parent.player.flashlight and self.getLOS(): self.player_last_seen_abs = p_pos_abs #print "vidim flashlight" return True #---------------------SEE MY OWN SHADOW--------------------------- #if player is behind us and has a lit up flashlight and we have LOS to him if self.angleToPlayerAbs() > 135 and self.angleToPlayerAbs() < 225: if self.parent.player.flashlight and self.getLOS(): #if he is looking at us my_pos_rel = self.node.getPos(self.parent.player.node) forward = Vec2(0, 1) if math.fabs( forward.signedAngleDeg( Vec2(my_pos_rel[0], my_pos_rel[1]))) <= 30: #go after my own shadow print "herding" self.orders = ORDERS_HERDING self.node.setH(self.parent.player.node.getH()) self.herding_timer = time.time() return False
def sensePlayer(self): """Return True if player sensed, and his last known coordinates are stored in self.player_last_seen_abs""" # if the player is dead, do not sense him if self.parent.player.health <= 0: return False #get player's position p_pos_abs = self.parent.player.node.getPos() my_pos_abs = self.node.getPos() #--------------------------------SENSE--------------------------------- #if player is within SENSING_RANGE we know he is there if self.distanceToPlayer() < SENSING_RANGE: #print "TOO CLOSE LOOSER!" self.player_last_seen_abs = p_pos_abs return True #---------------------------------HEAR---------------------------------- #if player is within HEARING_RANGE we know he is there effective_hearing_range = HEARING_RANGE if self.parent.player.gunshot_at: effective_hearing_range *= 3 else: if self.parent.player.sprint: effective_hearing_range *= 2 if not self.parent.player.moving: effective_hearing_range = 0 if self.distanceToPlayer() < effective_hearing_range: print "I HEAR U!" self.parent.player.adrenaline() #if we can see go chase him if self.getLOS(): self.player_last_seen_abs = p_pos_abs return True #we cannot see him, build new path to that tile else: dest = getTile( p_pos_abs ) path = pathFind(self.parent.level, getTile( self.node.getPos()), dest) if path: self.path = path self.orders = ORDERS_PATROL self.action = ACTION_FOLLOW_PATH return False #-------------------------------SEE--------------------------------- #if player is in front of us if self.angleToPlayerAbs() <= 45: #if he is close enough to see and we can see him if self.distanceToPlayer() <= VIEW_RANGE and self.getLOS(): self.player_last_seen_abs = p_pos_abs #print "vidim!" return True #if player has a flashlight lit, and we can see him go after him if self.parent.player.flashlight and self.getLOS(): self.player_last_seen_abs = p_pos_abs #print "vidim flashlight" return True #---------------------SEE MY OWN SHADOW--------------------------- #if player is behind us and has a lit up flashlight and we have LOS to him if self.angleToPlayerAbs() > 135 and self.angleToPlayerAbs() < 225: if self.parent.player.flashlight and self.getLOS(): #if he is looking at us my_pos_rel = self.node.getPos( self.parent.player.node ) forward = Vec2( 0, 1 ) if math.fabs( forward.signedAngleDeg( Vec2( my_pos_rel[0], my_pos_rel[1] ) ) ) <= 30: #go after my own shadow print "herding" self.orders = ORDERS_HERDING self.node.setH( self.parent.player.node.getH() ) self.herding_timer = time.time() return False