zombie-escape 1.10.0__tar.gz → 1.10.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/PKG-INFO +2 -1
  2. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/README.md +1 -0
  3. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/__about__.py +1 -1
  4. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/colors.py +14 -12
  5. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/render.py +81 -42
  6. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/render_constants.py +14 -8
  7. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/.gitignore +0 -0
  8. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/LICENSE.txt +0 -0
  9. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/pyproject.toml +0 -0
  10. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/__init__.py +0 -0
  11. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/assets/fonts/Silkscreen-Regular.ttf +0 -0
  12. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/assets/fonts/misaki_gothic.ttf +0 -0
  13. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/config.py +0 -0
  14. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/entities.py +0 -0
  15. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/entities_constants.py +0 -0
  16. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/font_utils.py +0 -0
  17. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/__init__.py +0 -0
  18. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/ambient.py +0 -0
  19. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/constants.py +0 -0
  20. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/footprints.py +0 -0
  21. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/interactions.py +0 -0
  22. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/layout.py +0 -0
  23. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/movement.py +0 -0
  24. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/spawn.py +0 -0
  25. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/state.py +0 -0
  26. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/survivors.py +0 -0
  27. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay/utils.py +0 -0
  28. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/gameplay_constants.py +0 -0
  29. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/input_utils.py +0 -0
  30. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/level_blueprints.py +0 -0
  31. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/level_constants.py +0 -0
  32. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/locales/ui.en.json +0 -0
  33. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/locales/ui.ja.json +0 -0
  34. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/localization.py +0 -0
  35. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/models.py +0 -0
  36. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/progress.py +0 -0
  37. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/render_assets.py +0 -0
  38. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/rng.py +0 -0
  39. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/screen_constants.py +0 -0
  40. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/screens/__init__.py +0 -0
  41. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/screens/game_over.py +0 -0
  42. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/screens/gameplay.py +0 -0
  43. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/screens/settings.py +0 -0
  44. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/screens/title.py +0 -0
  45. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/stage_constants.py +0 -0
  46. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/world_grid.py +0 -0
  47. {zombie_escape-1.10.0 → zombie_escape-1.10.1}/src/zombie_escape/zombie_escape.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zombie-escape
3
- Version: 1.10.0
3
+ Version: 1.10.1
4
4
  Summary: Top-down zombie survival game built with pygame.
5
5
  Project-URL: Homepage, https://github.com/tos-kamiya/zombie-escape
6
6
  Author-email: Toshihiro Kamiya <kamiya@mbj.nifty.com>
@@ -48,6 +48,7 @@ This game is a simple 2D top-down action game where the player aims to escape by
48
48
  <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot1.png" width="400">
49
49
  <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot2.png" width="400">
50
50
  <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot3.png" width="400">
51
+ <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot4.png" width="400">
51
52
 
52
53
  ## Controls
53
54
 
@@ -19,6 +19,7 @@ This game is a simple 2D top-down action game where the player aims to escape by
19
19
  <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot1.png" width="400">
20
20
  <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot2.png" width="400">
21
21
  <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot3.png" width="400">
22
+ <img src="https://raw.githubusercontent.com/tos-kamiya/zombie-escape/main/imgs/screenshot4.png" width="400">
22
23
 
23
24
  ## Controls
24
25
 
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2025-present Toshihiro Kamiya <kamiya@mbj.nifty.com>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "1.10.0"
4
+ __version__ = "1.10.1"
@@ -72,37 +72,39 @@ _DEFAULT_ENVIRONMENT_PALETTE = EnvironmentPalette(
72
72
  # Dark, desaturated palette that sells the "alone without a flashlight" vibe.
73
73
  _GLOOM_ENVIRONMENT_PALETTE = EnvironmentPalette(
74
74
  floor_primary=_adjust_color(
75
- _DEFAULT_ENVIRONMENT_PALETTE.floor_primary, brightness=0.725, saturation=0.675
75
+ _DEFAULT_ENVIRONMENT_PALETTE.floor_primary, brightness=0.8, saturation=0.75
76
76
  ),
77
77
  floor_secondary=_adjust_color(
78
- _DEFAULT_ENVIRONMENT_PALETTE.floor_secondary, brightness=0.74, saturation=0.65
78
+ _DEFAULT_ENVIRONMENT_PALETTE.floor_secondary, brightness=0.8, saturation=0.75
79
79
  ),
80
80
  fall_zone_primary=_adjust_color(
81
81
  _DEFAULT_ENVIRONMENT_PALETTE.fall_zone_primary,
82
- brightness=0.725,
83
- saturation=0.675,
82
+ brightness=0.8,
83
+ saturation=0.75,
84
84
  ),
85
85
  fall_zone_secondary=_adjust_color(
86
86
  _DEFAULT_ENVIRONMENT_PALETTE.fall_zone_secondary,
87
- brightness=0.74,
88
- saturation=0.65,
87
+ brightness=0.8,
88
+ saturation=0.75,
89
89
  ),
90
90
  outside=_adjust_color(
91
- _DEFAULT_ENVIRONMENT_PALETTE.outside, brightness=0.7, saturation=0.625
91
+ _DEFAULT_ENVIRONMENT_PALETTE.outside, brightness=0.8, saturation=0.75
92
92
  ),
93
93
  inner_wall=_adjust_color(
94
- _DEFAULT_ENVIRONMENT_PALETTE.inner_wall, brightness=0.775, saturation=0.7
94
+ _DEFAULT_ENVIRONMENT_PALETTE.inner_wall, brightness=0.8, saturation=0.75
95
95
  ),
96
96
  inner_wall_border=_adjust_color(
97
- _DEFAULT_ENVIRONMENT_PALETTE.inner_wall_border, brightness=0.775, saturation=0.7
97
+ _DEFAULT_ENVIRONMENT_PALETTE.inner_wall_border,
98
+ brightness=0.8,
99
+ saturation=0.75,
98
100
  ),
99
101
  outer_wall=_adjust_color(
100
- _DEFAULT_ENVIRONMENT_PALETTE.outer_wall, brightness=0.75, saturation=0.675
102
+ _DEFAULT_ENVIRONMENT_PALETTE.outer_wall, brightness=0.8, saturation=0.75
101
103
  ),
102
104
  outer_wall_border=_adjust_color(
103
105
  _DEFAULT_ENVIRONMENT_PALETTE.outer_wall_border,
104
- brightness=0.75,
105
- saturation=0.675,
106
+ brightness=0.8,
107
+ saturation=0.75,
106
108
  ),
107
109
  )
108
110
 
@@ -41,6 +41,10 @@ from .render_constants import (
41
41
  FALLING_DUST_COLOR,
42
42
  FALLING_WHIRLWIND_COLOR,
43
43
  FALLING_ZOMBIE_COLOR,
44
+ SHADOW_MIN_RATIO,
45
+ SHADOW_OVERSAMPLE,
46
+ SHADOW_RADIUS_RATIO,
47
+ SHADOW_STEPS,
44
48
  )
45
49
 
46
50
  _SHADOW_TILE_CACHE: dict[tuple[int, int, float], surface.Surface] = {}
@@ -57,34 +61,45 @@ def _get_shadow_tile_surface(
57
61
  if key in _SHADOW_TILE_CACHE:
58
62
  return _SHADOW_TILE_CACHE[key]
59
63
  size = key[0]
60
- surf = pygame.Surface((size, size), pygame.SRCALPHA)
64
+ oversample = SHADOW_OVERSAMPLE
65
+ render_size = size * oversample
66
+ render_surf = pygame.Surface((render_size, render_size), pygame.SRCALPHA)
61
67
  base_alpha = key[1]
62
68
  if edge_softness <= 0:
63
- surf.fill((0, 0, 0, base_alpha))
69
+ render_surf.fill((0, 0, 0, base_alpha))
70
+ if oversample > 1:
71
+ surf = pygame.transform.smoothscale(render_surf, (size, size))
72
+ else:
73
+ surf = render_surf
64
74
  _SHADOW_TILE_CACHE[key] = surf
65
75
  return surf
66
76
 
67
77
  softness = max(0.0, min(1.0, edge_softness))
68
- fade_band = max(1, int(size * softness))
69
- base_radius = max(1, int(size * 0.18))
70
-
71
- def draw_layer(inset: int, layer_alpha: int) -> None:
72
- rect_size = size - inset * 2
78
+ fade_band = max(1, int(render_size * softness))
79
+ base_radius = max(1, int(render_size * SHADOW_RADIUS_RATIO))
80
+
81
+ render_surf.fill((0, 0, 0, 0))
82
+ steps = SHADOW_STEPS
83
+ min_ratio = SHADOW_MIN_RATIO
84
+ for idx in range(steps):
85
+ t = idx / (steps - 1) if steps > 1 else 1.0
86
+ inset = int(fade_band * t)
87
+ rect_size = render_size - inset * 2
73
88
  if rect_size <= 0:
74
- return
89
+ continue
75
90
  radius = max(0, base_radius - inset)
91
+ layer_alpha = int(base_alpha * (min_ratio + (1.0 - min_ratio) * t))
76
92
  pygame.draw.rect(
77
- surf,
93
+ render_surf,
78
94
  (0, 0, 0, layer_alpha),
79
95
  pygame.Rect(inset, inset, rect_size, rect_size),
80
96
  border_radius=radius,
81
97
  )
82
98
 
83
- outer_alpha = int(base_alpha * 0.45)
84
- mid_alpha = int(base_alpha * 0.7)
85
- draw_layer(0, outer_alpha)
86
- draw_layer(max(1, fade_band // 2), mid_alpha)
87
- draw_layer(fade_band, base_alpha)
99
+ if oversample > 1:
100
+ surf = pygame.transform.smoothscale(render_surf, (size, size))
101
+ else:
102
+ surf = render_surf
88
103
  _SHADOW_TILE_CACHE[key] = surf
89
104
  return surf
90
105
 
@@ -280,19 +295,21 @@ def _get_hatch_pattern(
280
295
  fog_data: dict[str, Any],
281
296
  thickness: int,
282
297
  *,
283
- pixel_scale: int = 1,
284
298
  color: tuple[int, int, int, int] | None = None,
285
299
  ) -> surface.Surface:
286
- """Return cached ordered-dither tile surface (Bayer-style, optionally chunky)."""
300
+ """Return cached dot hatch tile surface (Bayer-ordered, optionally chunky)."""
287
301
  cache = fog_data.setdefault("hatch_patterns", {})
288
- pixel_scale = max(1, pixel_scale)
289
- key = (thickness, pixel_scale, color)
302
+ key = (thickness, color)
290
303
  if key in cache:
291
304
  return cache[key]
292
305
 
293
- spacing = 20
306
+ spacing = 4
307
+ oversample = 3
294
308
  density = max(1, min(thickness, 16))
295
- pattern = pygame.Surface((spacing, spacing), pygame.SRCALPHA)
309
+ pattern_size = spacing * 8
310
+ hi_spacing = spacing * oversample
311
+ hi_pattern_size = pattern_size * oversample
312
+ pattern = pygame.Surface((hi_pattern_size, hi_pattern_size), pygame.SRCALPHA)
296
313
 
297
314
  # 8x8 Bayer matrix values 0..63 for ordered dithering
298
315
  bayer = [
@@ -306,14 +323,20 @@ def _get_hatch_pattern(
306
323
  [63, 31, 55, 23, 61, 29, 53, 21],
307
324
  ]
308
325
  threshold = int((density / 16) * 64)
309
- for y in range(spacing):
310
- for x in range(spacing):
311
- if bayer[y % 8][x % 8] < threshold:
312
- pattern.set_at((x, y), color or (0, 0, 0, 255))
326
+ dot_radius = max(
327
+ 1,
328
+ min(hi_spacing, int(math.ceil((density / 16) * hi_spacing))),
329
+ )
330
+ dot_color = color or (0, 0, 0, 255)
331
+ for grid_y in range(8):
332
+ for grid_x in range(8):
333
+ if bayer[grid_y][grid_x] < threshold:
334
+ cx = grid_x * hi_spacing + hi_spacing // 2
335
+ cy = grid_y * hi_spacing + hi_spacing // 2
336
+ pygame.draw.circle(pattern, dot_color, (cx, cy), dot_radius)
313
337
 
314
- if pixel_scale > 1:
315
- scaled_size = (spacing * pixel_scale, spacing * pixel_scale)
316
- pattern = pygame.transform.scale(pattern, scaled_size)
338
+ if oversample > 1:
339
+ pattern = pygame.transform.smoothscale(pattern, (pattern_size, pattern_size))
317
340
 
318
341
  cache[key] = pattern
319
342
  return pattern
@@ -354,7 +377,6 @@ def _get_fog_overlay_surfaces(
354
377
  pattern = _get_hatch_pattern(
355
378
  fog_data,
356
379
  ring.thickness,
357
- pixel_scale=assets.fog_hatch_pixel_scale,
358
380
  color=base_color,
359
381
  )
360
382
  p_w, p_h = pattern.get_size()
@@ -390,7 +412,7 @@ def _build_flashlight_fade_surface(
390
412
  *,
391
413
  start_ratio: float = 0.2,
392
414
  max_alpha: int = 220,
393
- outer_extension: int = 50,
415
+ outer_extension: int = 30,
394
416
  ) -> surface.Surface:
395
417
  """Return a radial gradient so flashlight edges softly darken again."""
396
418
 
@@ -597,7 +619,11 @@ def _draw_status_bar(
597
619
  steel_on = config.get("steel_beams", {}).get("enabled", False)
598
620
  if stage:
599
621
  # Keep the label compact for the status bar
600
- stage_label = f"#{stage.id[-1]}" if stage.id.startswith("stage") else stage.id
622
+ if stage.id.startswith("stage"):
623
+ stage_suffix = stage.id.removeprefix("stage")
624
+ stage_label = f"#{stage_suffix}" if stage_suffix else stage.id
625
+ else:
626
+ stage_label = stage.id
601
627
  else:
602
628
  stage_label = "#1"
603
629
 
@@ -723,6 +749,16 @@ def _draw_play_area(
723
749
  return xs, ys, xe, ye, outside_cells
724
750
 
725
751
 
752
+ def abs_clip(value: float, min_v: float, max_v: float) -> float:
753
+ value_sign = 1.0 if value >= 0.0 else -1.0
754
+ value = abs(value)
755
+ if value < min_v:
756
+ value = min_v
757
+ elif value > max_v:
758
+ value = max_v
759
+ return value_sign * value
760
+
761
+
726
762
  def _draw_wall_shadows(
727
763
  screen: surface.Surface,
728
764
  camera: Camera,
@@ -732,7 +768,7 @@ def _draw_wall_shadows(
732
768
  outer_wall_cells: set[tuple[int, int]] | None,
733
769
  cell_size: int,
734
770
  light_source_pos: tuple[int, int] | None,
735
- alpha: int = 54,
771
+ alpha: int = 68,
736
772
  ) -> None:
737
773
  if not wall_cells or cell_size <= 0 or light_source_pos is None:
738
774
  return
@@ -754,24 +790,25 @@ def _draw_wall_shadows(
754
790
  shadow_layer.fill((0, 0, 0, 0))
755
791
  screen_rect = screen.get_rect()
756
792
  px, py = light_source_pos
757
- offset = max(2, int(cell_size * 0.3 * (shadow_size / cell_size) * 1.2))
758
793
  drew = False
794
+ clip_max = shadow_size * 0.25
759
795
  for cell_x, cell_y in inner_wall_cells:
760
796
  world_x = cell_x * cell_size
761
797
  world_y = cell_y * cell_size
798
+ wall_rect = pygame.Rect(world_x, world_y, cell_size, cell_size)
799
+ wall_screen_rect = camera.apply_rect(wall_rect)
800
+ if not wall_screen_rect.colliderect(screen_rect):
801
+ continue
762
802
  center_x = world_x + cell_size / 2
763
803
  center_y = world_y + cell_size / 2
764
- dx = center_x - px
765
- dy = center_y - py
766
- dist = math.hypot(dx, dy)
767
- if dist <= 1e-3:
768
- continue
769
- nx = dx / dist
770
- ny = dy / dist
804
+ dx = (center_x - px) * 0.5
805
+ dy = (center_y - py) * 0.5
806
+ dx = int(abs_clip(dx, 0, clip_max))
807
+ dy = int(abs_clip(dy, 0, clip_max))
771
808
  shadow_rect = pygame.Rect(0, 0, shadow_size, shadow_size)
772
809
  shadow_rect.center = (
773
- int(center_x + nx * offset),
774
- int(center_y + ny * offset),
810
+ int(center_x + dx),
811
+ int(center_y + dy),
775
812
  )
776
813
  shadow_screen_rect = camera.apply_rect(shadow_rect)
777
814
  if not shadow_screen_rect.colliderect(screen_rect):
@@ -1195,7 +1232,9 @@ def draw(
1195
1232
  outer_wall_cells=game_data.layout.outer_wall_cells,
1196
1233
  cell_size=game_data.cell_size,
1197
1234
  light_source_pos=(
1198
- None if (stage and stage.endurance_stage and state.dawn_ready) else fov_target.rect.center
1235
+ None
1236
+ if (stage and stage.endurance_stage and state.dawn_ready)
1237
+ else fov_target.rect.center
1199
1238
  )
1200
1239
  if fov_target
1201
1240
  else None,
@@ -30,7 +30,6 @@ class RenderAssets:
30
30
  player_radius: int
31
31
  fov_radius: int
32
32
  fog_radius_scale: float
33
- fog_hatch_pixel_scale: int
34
33
  fog_rings: list[FogRing]
35
34
  footprint_radius: int
36
35
  footprint_overview_radius: int
@@ -42,7 +41,6 @@ class RenderAssets:
42
41
 
43
42
 
44
43
  FOG_RADIUS_SCALE = 1.2
45
- FOG_HATCH_PIXEL_SCALE = 2
46
44
 
47
45
  FLASHLIGHT_FOG_SCALE_STEP = 0.3
48
46
  FLASHLIGHT_HATCH_EXTRA_SCALE = 0.12
@@ -53,12 +51,17 @@ FOOTPRINT_COLOR = (110, 200, 255)
53
51
  FOOTPRINT_LIFETIME_MS = 135000
54
52
  FOOTPRINT_MIN_FADE = 0.3
55
53
 
54
+ SHADOW_OVERSAMPLE = 2
55
+ SHADOW_STEPS = 10
56
+ SHADOW_MIN_RATIO = 0.0
57
+ SHADOW_RADIUS_RATIO = 0.3
58
+
56
59
  FOG_RINGS = [
57
- FogRing(radius_factor=0.529, thickness=2),
58
- FogRing(radius_factor=0.639, thickness=4),
59
- FogRing(radius_factor=0.748, thickness=6),
60
- FogRing(radius_factor=0.858, thickness=8),
61
- FogRing(radius_factor=0.968, thickness=12),
60
+ FogRing(radius_factor=0.536, thickness=2),
61
+ FogRing(radius_factor=0.645, thickness=3),
62
+ FogRing(radius_factor=0.754, thickness=5),
63
+ FogRing(radius_factor=0.863, thickness=8),
64
+ FogRing(radius_factor=0.972, thickness=12),
62
65
  ]
63
66
 
64
67
 
@@ -70,7 +73,6 @@ def build_render_assets(cell_size: int) -> RenderAssets:
70
73
  player_radius=PLAYER_RADIUS,
71
74
  fov_radius=FOV_RADIUS,
72
75
  fog_radius_scale=FOG_RADIUS_SCALE,
73
- fog_hatch_pixel_scale=FOG_HATCH_PIXEL_SCALE,
74
76
  fog_rings=FOG_RINGS,
75
77
  footprint_radius=FOOTPRINT_RADIUS,
76
78
  footprint_overview_radius=FOOTPRINT_OVERVIEW_RADIUS,
@@ -93,6 +95,10 @@ __all__ = [
93
95
  "FogRing",
94
96
  "RenderAssets",
95
97
  "FOG_RADIUS_SCALE",
98
+ "SHADOW_OVERSAMPLE",
99
+ "SHADOW_STEPS",
100
+ "SHADOW_MIN_RATIO",
101
+ "SHADOW_RADIUS_RATIO",
96
102
  "FLASHLIGHT_FOG_SCALE_STEP",
97
103
  "FLASHLIGHT_HATCH_EXTRA_SCALE",
98
104
  "build_render_assets",