diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml
index 00716059a6b64f9aba3a7ebb2fc00b541582d04f..42d8dd5303a0274ac6a461838692f327b105f5b9 100644
--- a/overcooked_simulator/game_content/environment_config.yaml
+++ b/overcooked_simulator/game_content/environment_config.yaml
@@ -99,7 +99,7 @@ player_config:
   interaction_range: 1.6
   restricted_view: False
   view_angle: 70
-  view_range: 5.5  # in grid units, can be "null"
+  view_range: 4  # in grid units, can be "null"
 
 effect_manager:
   FireManager:
diff --git a/overcooked_simulator/game_content/study/level2/level2_config.yaml b/overcooked_simulator/game_content/study/level2/level2_config.yaml
index 22f7510731b53cf30346c222cdd0b3a30d89f9d2..bea2049e75c04407198c5395859be5bb8021c513 100644
--- a/overcooked_simulator/game_content/study/level2/level2_config.yaml
+++ b/overcooked_simulator/game_content/study/level2/level2_config.yaml
@@ -98,8 +98,8 @@ player_config:
   player_speed_units_per_seconds: 8
   interaction_range: 1.6
   restricted_view: True
-  view_angle: 75
-  view_range: 6  # in grid units, can be "null"
+  view_angle: 50
+  view_range: 5  # in grid units, can be "null"
 
 effect_manager:
   FireManager:
diff --git a/overcooked_simulator/game_content/study/study_config.yaml b/overcooked_simulator/game_content/study/study_config.yaml
index 57c46cf9bf6ff0d85a4280de17c6b9c4bbb141c8..5df5da4388422285a42e1e22ce1371171c6df60e 100644
--- a/overcooked_simulator/game_content/study/study_config.yaml
+++ b/overcooked_simulator/game_content/study/study_config.yaml
@@ -3,10 +3,10 @@
 
 
 levels:
-  - config_path: study/level1/level1_config.yaml
-    layout_path: overcooked-1/1-1-far-apart.layout
-    item_info_path: study/level1/level1_item_info.yaml
-    name: "Level 1-1: Far Apart"
+  #  - config_path: study/level1/level1_config.yaml
+  #    layout_path: overcooked-1/1-1-far-apart.layout
+  #    item_info_path: study/level1/level1_item_info.yaml
+  #    name: "Level 1-1: Far Apart"
 
   - config_path: study/level2/level2_config.yaml
     layout_path: overcooked-1/1-4-bottleneck.layout
diff --git a/overcooked_simulator/gui_2d_vis/drawing.py b/overcooked_simulator/gui_2d_vis/drawing.py
index f382a9b96501bd5eda232f4f7031b80de458e41c..16926192482d7d2163c7872a7148614d716a5dad 100644
--- a/overcooked_simulator/gui_2d_vis/drawing.py
+++ b/overcooked_simulator/gui_2d_vis/drawing.py
@@ -137,7 +137,8 @@ class Visualizer:
             pygame.draw.circle(
                 screen,
                 col,
-                np.array(state["players"][int(idx)]["pos"]) * grid_size + (grid_size // 2),
+                np.array(state["players"][int(idx)]["pos"]) * grid_size
+                + (grid_size // 2),
                 (grid_size / 2),
             )
 
@@ -147,73 +148,92 @@ class Visualizer:
             grid_size,
         )
 
-        if "view_restriction" in state and state["view_restriction"]:
-            # rotate direction vector in both direction with the angel
-            # draw 2 large rect which are rotated so that one edge is the viewing border
+        mask = pygame.Surface(screen.get_size(), pygame.SRCALPHA)
+        mask.fill((0, 0, 0, 0))
+        mask_color = (0, 0, 0, 0)
+        if "view_restrictions" in state and state["view_restrictions"]:
+            for idx, restriction in enumerate(state["view_restrictions"]):
+                # if idx != 0:
+                #     break
+                # rotate direction vector in both direction with the angel
+                # draw 2 large rect which are rotated so that one edge is the viewing border
+
+                direction = pygame.math.Vector2(restriction["direction"])
+                pos = pygame.math.Vector2(restriction["position"])
+                angle = restriction["angle"] / 2
+                range = restriction["range"]
+
+                angle = min(angle, 180)
+
+                pos = pos * grid_size + pygame.math.Vector2(
+                    [grid_size / 2, grid_size / 2]
+                )
 
-            direction = pygame.math.Vector2(state["view_restriction"]["direction"])
-            pos = pygame.math.Vector2(state["view_restriction"]["position"])
-            angle = state["view_restriction"]["angle"] / 2
-            range = state["view_restriction"]["range"]
+                rect_scale = max(width, height) * 2
+                # rect_scale = 2 * grid_size
 
-            angle = min(angle, 180)
+                left_beam = pos + (direction.rotate(angle) * rect_scale * 2)
+                right_beam = pos + (direction.rotate(-angle) * rect_scale * 2)
 
-            pos = pos * grid_size + pygame.math.Vector2([grid_size / 2, grid_size / 2])
+                cone_mask = pygame.surface.Surface(screen.get_size(), pygame.SRCALPHA)
+                cone_mask.fill((255, 255, 255, 255))
 
-            rect_scale = max(width, height) * 2
-            # rect_scale = 2 * grid_size
+                offset_front = direction * grid_size * 0.7
+                if angle != 180:
+                    pygame.draw.polygon(
+                        cone_mask,
+                        mask_color,
+                        (
+                            pos - offset_front,
+                            left_beam - offset_front,
+                            left_beam + (direction.rotate(90) * rect_scale),
+                            pos
+                            - (direction * rect_scale * 2)
+                            + (direction.rotate(90) * rect_scale),
+                            pos
+                            - (direction * rect_scale * 2)
+                            + (direction.rotate(-90) * rect_scale),
+                            right_beam + (direction.rotate(-90) * rect_scale),
+                            right_beam - offset_front,
+                        ),
+                    )
+                if range:
+                    n_circle_points = 40
 
-            left_beam = pos + (direction.rotate(angle) * rect_scale * 2)
-            right_beam = pos + (direction.rotate(-angle) * rect_scale * 2)
+                    start_vec = np.array(-direction * range)
+                    points = (
+                        np.array(create_polygon(n_circle_points, start_vec)) * grid_size
+                    ) + pos
 
-            offset_front = direction * grid_size * 0.7
-            if angle != 180:
-                pygame.draw.polygon(
-                    screen,
-                    colors["black"],
-                    (
-                        pos - offset_front,
-                        left_beam - offset_front,
-                        left_beam + (direction.rotate(90) * rect_scale),
+                    circle_closed = np.concatenate([points, points[0:1]], axis=0)
+
+                    corners = [
+                        pos - (direction * rect_scale),
+                        *circle_closed,
+                        pos - (direction * rect_scale),
+                        pos
+                        - (direction * rect_scale)
+                        + (direction.rotate(90) * rect_scale),
                         pos
-                        - (direction * rect_scale * 2)
+                        + (direction * rect_scale)
                         + (direction.rotate(90) * rect_scale),
                         pos
-                        - (direction * rect_scale * 2)
+                        + (direction * rect_scale)
                         + (direction.rotate(-90) * rect_scale),
-                        right_beam + (direction.rotate(-90) * rect_scale),
-                        right_beam - offset_front,
-                    ),
-                )
-            if range:
-                n_circle_points = 40
-
-                start_vec = np.array(-direction * range)
-                points = (
-                    np.array(create_polygon(n_circle_points, start_vec)) * grid_size
-                ) + pos
-
-                circle_closed = np.concatenate([points, points[0:1]], axis=0)
-
-                corners = [
-                    pos - (direction * rect_scale),
-                    *circle_closed,
-                    pos - (direction * rect_scale),
-                    pos
-                    - (direction * rect_scale)
-                    + (direction.rotate(90) * rect_scale),
-                    pos
-                    + (direction * rect_scale)
-                    + (direction.rotate(90) * rect_scale),
-                    pos
-                    + (direction * rect_scale)
-                    + (direction.rotate(-90) * rect_scale),
-                    pos
-                    - (direction * rect_scale)
-                    + (direction.rotate(-90) * rect_scale),
-                ]
-
-                pygame.draw.polygon(screen, colors["black"], [*corners])
+                        pos
+                        - (direction * rect_scale)
+                        + (direction.rotate(-90) * rect_scale),
+                    ]
+
+                    pygame.draw.polygon(cone_mask, mask_color, [*corners])
+
+                mask.blit(cone_mask, (0, 0), special_flags=pygame.BLEND_MAX)
+
+            screen.blit(
+                mask,
+                mask.get_rect(),
+                special_flags=pygame.BLEND_RGBA_MULT,
+            )
 
     def draw_background(
         self, surface: pygame.Surface, width: int, height: int, grid_size: int
diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py
index 5fb8c79171ffcd83108bd40a14c69678c76d108c..5efbd15853b442647a7ae395fac6973042b11310 100644
--- a/overcooked_simulator/overcooked_environment.py
+++ b/overcooked_simulator/overcooked_environment.py
@@ -813,7 +813,10 @@ class Environment:
             "remaining_time": max(self.env_time_end - self.env_time, timedelta(0)),
         }
 
-    def get_json_state(self, player_id: str = None,) -> str:
+    def get_json_state(
+        self,
+        player_id: str = None,
+    ) -> str:
         """Return the current state of the game formatted in json dict.
 
         Args:
@@ -837,13 +840,16 @@ class Environment:
                 "remaining_time": max(
                     self.env_time_end - self.env_time, timedelta(0)
                 ).total_seconds(),
-                "view_restriction": {
-                    "direction": self.players[player_id].facing_direction.tolist(),
-                    "position": self.players[player_id].pos.tolist(),
-                    "angle": self.player_view_angle,
-                    "counter_mask": None,
-                    "range": self.player_view_range,
-                }
+                "view_restrictions": [
+                    {
+                        "direction": player.facing_direction.tolist(),
+                        "position": player.pos.tolist(),
+                        "angle": self.player_view_angle,
+                        "counter_mask": None,
+                        "range": self.player_view_range,
+                    }
+                    for player in self.players.values()
+                ]
                 if self.player_view_restricted
                 else None,
                 "info_msg": [
diff --git a/overcooked_simulator/state_representation.py b/overcooked_simulator/state_representation.py
index fe587ca6d41c40514d0fe3d8e862c09575a6c09b..319e15cef011a535a051db2426acf834c2c61da9 100644
--- a/overcooked_simulator/state_representation.py
+++ b/overcooked_simulator/state_representation.py
@@ -99,7 +99,7 @@ class StateRepresentation(BaseModel):
     ended: bool
     env_time: datetime  # isoformat str
     remaining_time: float
-    view_restriction: None | ViewRestriction
+    view_restrictions: None | list[ViewRestriction]
     info_msg: list[tuple[str, str]]