diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml index c0de86d2afc35fad41a5c206b448a0f1eecdad6e..9e60cf36634c0c4010734c704066d73a93ea4d0a 100644 --- a/overcooked_simulator/game_content/environment_config.yaml +++ b/overcooked_simulator/game_content/environment_config.yaml @@ -83,5 +83,5 @@ orders: player_config: radius: 0.4 - player_speed_units_per_seconds: 8 + player_speed_units_per_seconds: 6 interaction_range: 1.6 diff --git a/overcooked_simulator/game_content/layouts/empty.layout b/overcooked_simulator/game_content/layouts/empty.layout index 2fa1dd8c29c076e9d94e9a305843ff87bebb29f1..e0147e33f9259720edbc7d4bb380e7a512d728a1 100644 --- a/overcooked_simulator/game_content/layouts/empty.layout +++ b/overcooked_simulator/game_content/layouts/empty.layout @@ -1,7 +1,8 @@ -______ -______ -______ -______ -______ -______ -_____P \ No newline at end of file +_______ +_______ +_______ +__#____ +__#P___ +_______ +_______ +_______ diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index 8fdb399dbc014f95c29b0abf9fa0a3d4e74ce5f1..c51de60a423afc030f7ebcc2ece6300c9932a388 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -171,8 +171,9 @@ class Environment: dtype=float, ) - - self.player_movement_speed = self.environment_config["player_config"]["player_speed_units_per_seconds"] + self.player_movement_speed = self.environment_config["player_config"][ + "player_speed_units_per_seconds" + ] self.player_radius = self.environment_config["player_config"]["radius"] progress_counter_classes = list( @@ -212,8 +213,12 @@ class Environment: def set_collision_arrays(self): number_players = len(self.players) - self.world_borders_lower = self.world_borders[np.newaxis, :, 0].repeat(number_players, axis=0) - self.world_borders_upper = self.world_borders[np.newaxis, :, 1].repeat(number_players, axis=0) + self.world_borders_lower = self.world_borders[np.newaxis, :, 0].repeat( + number_players, axis=0 + ) + self.world_borders_upper = self.world_borders[np.newaxis, :, 1].repeat( + number_players, axis=0 + ) def get_env_time(self): """the internal time of the environment. An environment starts always with the time from `create_init_env_time`. @@ -403,37 +408,107 @@ class Environment: d_time = duration.total_seconds() player_positions = np.array([p.pos for p in self.players.values()], dtype=float) - player_movement_vectors = np.array([p.current_movement if self.env_time <= p.movement_until else [0, 0] for p in self.players.values()], dtype=float) + player_movement_vectors = np.array( + [ + p.current_movement if self.env_time <= p.movement_until else [0, 0] + for p in self.players.values() + ], + dtype=float, + ) - new_positions = player_positions + (player_movement_vectors * (self.player_movement_speed * d_time)) + targeted_positions = player_positions + ( + player_movement_vectors * (self.player_movement_speed * d_time) + ) # Collisions player player - distances_players_after_scipy = distance_matrix(new_positions, new_positions) - - player_diff_vecs = -(player_positions[:, np.newaxis, :] - player_positions[np.newaxis, :, :]) + distances_players_after_scipy = distance_matrix( + targeted_positions, targeted_positions + ) - collision_idxs = distances_players_after_scipy < (2*self.player_radius) - eye_idxs = np.eye(distances_players_after_scipy.shape[0], distances_players_after_scipy.shape[1], dtype=bool) + player_diff_vecs = -( + player_positions[:, np.newaxis, :] - player_positions[np.newaxis, :, :] + ) + collision_idxs = distances_players_after_scipy < (2 * self.player_radius) + eye_idxs = np.eye( + distances_players_after_scipy.shape[0], + distances_players_after_scipy.shape[1], + dtype=bool, + ) collision_idxs[eye_idxs] = False - # collisions_any = np.any(collision_idxs, axis=1) # Player push players around - player_diff_vecs[collision_idxs==False] = 0 + player_diff_vecs[collision_idxs == False] = 0 push_vectors = np.sum(player_diff_vecs, axis=0) - # new_positions[collisions_any] = player_positions[collisions_any] - new_positions += push_vectors * (self.player_movement_speed * d_time) - # Collisions player world borders - new_positions = np.max([new_positions, self.world_borders_lower+self.player_radius], axis=0) - new_positions = np.min([new_positions, self.world_borders_upper-self.player_radius], axis=0) + updated_movement = push_vectors + player_movement_vectors + new_positions = player_positions + ( + updated_movement * (self.player_movement_speed * d_time) + ) # Collisions players counters - counter_diff_vecs = (new_positions[:, np.newaxis, :] - self.counter_positions[np.newaxis, :, :]) + counter_diff_vecs = ( + new_positions[:, np.newaxis, :] - self.counter_positions[np.newaxis, :, :] + ) counter_distances = np.max((np.abs(counter_diff_vecs)), axis=2) - min_counter_distances = np.min(counter_distances, axis=1) - 0.5 - new_positions[min_counter_distances < self.player_radius] = player_positions[min_counter_distances < self.player_radius] + # counter_distances = np.linalg.norm(counter_diff_vecs, axis=2) + closest_counter_positions = self.counter_positions[ + np.argmin(counter_distances, axis=1) + ] + + nearest_counter_to_player = closest_counter_positions - new_positions + print(nearest_counter_to_player) + + collided = np.min(counter_distances, axis=1) - 0.5 < self.player_radius + # print(" COLLIDED", collided) - counter_distances_axes = np.max((np.abs(counter_diff_vecs)), axis=1) + # print("CLOSEST_COUNTER", closest_counter_positions) + relevant_axes = nearest_counter_to_player.argmax(axis=1) + relevant_values = nearest_counter_to_player.max(axis=1) + + new_positions = player_positions + ( + updated_movement * (self.player_movement_speed * d_time) + ) + + for idx, player in enumerate(player_positions): + axis = relevant_axes[idx] + + if collided[idx]: + # print("before", updated_movement) + if relevant_values[idx] - 0.5 > 0: + # print("settings more") + new_positions[idx, axis] = np.min( + [ + player_positions[idx, axis], + closest_counter_positions[idx, axis], + ] + ) + + # updated_movement[idx, axis] = np.max(updated_movement[idx, axis], 0) + if relevant_values[idx] + 0.5 < 0: + # print("settings less") + new_positions[idx, axis] = np.max( + [ + player_positions[idx, axis], + closest_counter_positions[idx, axis], + ] + ) + + # updated_movement[idx, axis] = np.min(updated_movement[idx, axis], 0) + # print("after", updated_movement) + + # new_positions[collided] = player_positions[collided] + + # new_positions[min_counter_distances < self.player_radius] = player_positions[min_counter_distances < self.player_radius] + + # counter_distances_axes = np.max((np.abs(counter_diff_vecs)), axis=1) + + # Collisions player world borders + new_positions = np.max( + [new_positions, self.world_borders_lower + self.player_radius], axis=0 + ) + new_positions = np.min( + [new_positions, self.world_borders_upper - self.player_radius], axis=0 + ) for idx, p in enumerate(self.players.values()): p.turn(player_movement_vectors[idx])