crimsonland 0.1.0.dev1__tar.gz → 0.1.0.dev2__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 (137) hide show
  1. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/PKG-INFO +1 -1
  2. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/pyproject.toml +1 -1
  3. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/cli.py +5 -2
  4. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/arsenal_debug.py +9 -30
  5. crimsonland-0.1.0.dev2/src/crimson/views/audio_bootstrap.py +47 -0
  6. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/projectile_render_debug.py +9 -30
  7. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/__init__.py +0 -0
  8. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/assets_fetch.py +0 -0
  9. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/atlas.py +0 -0
  10. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/audio_router.py +0 -0
  11. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/bonuses.py +0 -0
  12. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/camera.py +0 -0
  13. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/creatures/__init__.py +0 -0
  14. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/creatures/ai.py +0 -0
  15. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/creatures/anim.py +0 -0
  16. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/creatures/damage.py +0 -0
  17. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/creatures/runtime.py +0 -0
  18. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/creatures/spawn.py +0 -0
  19. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/debug.py +0 -0
  20. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/demo.py +0 -0
  21. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/demo_trial.py +0 -0
  22. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/effects.py +0 -0
  23. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/effects_atlas.py +0 -0
  24. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/__init__.py +0 -0
  25. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/assets.py +0 -0
  26. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/boot.py +0 -0
  27. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/menu.py +0 -0
  28. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/panels/__init__.py +0 -0
  29. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/panels/base.py +0 -0
  30. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/panels/controls.py +0 -0
  31. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/panels/mods.py +0 -0
  32. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/panels/options.py +0 -0
  33. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/panels/play_game.py +0 -0
  34. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/panels/stats.py +0 -0
  35. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/frontend/transitions.py +0 -0
  36. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/game.py +0 -0
  37. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/game_modes.py +0 -0
  38. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/game_world.py +0 -0
  39. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/gameplay.py +0 -0
  40. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/input_codes.py +0 -0
  41. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/modes/__init__.py +0 -0
  42. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/modes/base_gameplay_mode.py +0 -0
  43. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/modes/quest_mode.py +0 -0
  44. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/modes/rush_mode.py +0 -0
  45. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/modes/survival_mode.py +0 -0
  46. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/modes/tutorial_mode.py +0 -0
  47. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/modes/typo_mode.py +0 -0
  48. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/paths.py +0 -0
  49. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/perks.py +0 -0
  50. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/persistence/__init__.py +0 -0
  51. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/persistence/highscores.py +0 -0
  52. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/persistence/save_status.py +0 -0
  53. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/player_damage.py +0 -0
  54. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/projectiles.py +0 -0
  55. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/__init__.py +0 -0
  56. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/helpers.py +0 -0
  57. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/registry.py +0 -0
  58. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/results.py +0 -0
  59. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/runtime.py +0 -0
  60. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/tier1.py +0 -0
  61. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/tier2.py +0 -0
  62. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/tier3.py +0 -0
  63. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/tier4.py +0 -0
  64. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/tier5.py +0 -0
  65. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/timeline.py +0 -0
  66. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/quests/types.py +0 -0
  67. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/render/__init__.py +0 -0
  68. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/render/terrain_fx.py +0 -0
  69. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/render/world_renderer.py +0 -0
  70. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/sim/__init__.py +0 -0
  71. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/sim/world_defs.py +0 -0
  72. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/sim/world_state.py +0 -0
  73. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/terrain_assets.py +0 -0
  74. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/tutorial/__init__.py +0 -0
  75. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/tutorial/timeline.py +0 -0
  76. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/typo/__init__.py +0 -0
  77. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/typo/names.py +0 -0
  78. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/typo/player.py +0 -0
  79. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/typo/spawns.py +0 -0
  80. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/typo/typing.py +0 -0
  81. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/ui/__init__.py +0 -0
  82. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/ui/cursor.py +0 -0
  83. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/ui/demo_trial_overlay.py +0 -0
  84. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/ui/game_over.py +0 -0
  85. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/ui/hud.py +0 -0
  86. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/ui/perk_menu.py +0 -0
  87. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/__init__.py +0 -0
  88. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/aim_debug.py +0 -0
  89. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/animations.py +0 -0
  90. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/bonuses.py +0 -0
  91. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/camera_debug.py +0 -0
  92. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/camera_shake.py +0 -0
  93. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/corpse_stamp_debug.py +0 -0
  94. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/decals_debug.py +0 -0
  95. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/empty.py +0 -0
  96. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/fonts.py +0 -0
  97. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/game_over.py +0 -0
  98. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/ground.py +0 -0
  99. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/lighting_debug.py +0 -0
  100. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/particles.py +0 -0
  101. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/perk_menu_debug.py +0 -0
  102. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/perks.py +0 -0
  103. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/player.py +0 -0
  104. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/player_sprite_debug.py +0 -0
  105. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/projectile_fx.py +0 -0
  106. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/projectiles.py +0 -0
  107. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/quest_title_overlay.py +0 -0
  108. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/registry.py +0 -0
  109. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/rush.py +0 -0
  110. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/small_font_debug.py +0 -0
  111. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/spawn_plan.py +0 -0
  112. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/sprites.py +0 -0
  113. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/survival.py +0 -0
  114. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/terrain.py +0 -0
  115. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/ui.py +0 -0
  116. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/views/wicons.py +0 -0
  117. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/weapon_sfx.py +0 -0
  118. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/crimson/weapons.py +0 -0
  119. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/__init__.py +0 -0
  120. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/app.py +0 -0
  121. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/assets.py +0 -0
  122. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/audio.py +0 -0
  123. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/config.py +0 -0
  124. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/console.py +0 -0
  125. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/fonts/__init__.py +0 -0
  126. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/fonts/grim_mono.py +0 -0
  127. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/fonts/small.py +0 -0
  128. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/input.py +0 -0
  129. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/jaz.py +0 -0
  130. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/math.py +0 -0
  131. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/music.py +0 -0
  132. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/paq.py +0 -0
  133. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/rand.py +0 -0
  134. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/sfx.py +0 -0
  135. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/sfx_map.py +0 -0
  136. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/terrain_render.py +0 -0
  137. {crimsonland-0.1.0.dev1 → crimsonland-0.1.0.dev2}/src/grim/view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: crimsonland
3
- Version: 0.1.0.dev1
3
+ Version: 0.1.0.dev2
4
4
  Requires-Dist: construct>=2.10.70
5
5
  Requires-Dist: pillow>=12.1.0
6
6
  Requires-Dist: platformdirs>=4.5.1
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "crimsonland"
3
- version = "0.1.0.dev1"
3
+ version = "0.1.0.dev2"
4
4
  requires-python = ">=3.13"
5
5
  dependencies = [
6
6
  "construct>=2.10.70",
@@ -202,8 +202,9 @@ def cmd_view(
202
202
  run_view(view, width=width, height=height, title=title, fps=fps)
203
203
 
204
204
 
205
- @app.command("game")
205
+ @app.callback(invoke_without_command=True)
206
206
  def cmd_game(
207
+ ctx: typer.Context,
207
208
  width: int | None = typer.Option(None, help="window width (default: use crimson.cfg)"),
208
209
  height: int | None = typer.Option(None, help="window height (default: use crimson.cfg)"),
209
210
  fps: int = typer.Option(60, help="target fps"),
@@ -221,7 +222,9 @@ def cmd_game(
221
222
  help="assets root (default: base-dir; missing .paq files are downloaded)",
222
223
  ),
223
224
  ) -> None:
224
- """Run the reimplementation game flow."""
225
+ """Run the reimplementation game flow (default command)."""
226
+ if ctx.invoked_subcommand:
227
+ return
225
228
  from .game import GameConfig, run_game
226
229
 
227
230
  config = GameConfig(
@@ -5,9 +5,7 @@ import random
5
5
 
6
6
  import pyray as rl
7
7
 
8
- from grim.audio import AudioState, init_audio_state, shutdown_audio, update_audio
9
- from grim.config import ensure_crimson_cfg
10
- from grim.console import ConsoleLog, ConsoleState
8
+ from grim.audio import AudioState, shutdown_audio, update_audio
11
9
  from grim.fonts.small import SmallFontData, draw_small_text, load_small_font
12
10
  from grim.view import View, ViewContext
13
11
 
@@ -15,7 +13,6 @@ from ..creatures.spawn import SpawnId
15
13
  from ..game_modes import GameMode
16
14
  from ..game_world import GameWorld
17
15
  from ..gameplay import PlayerInput, weapon_assign_player
18
- from ..paths import default_runtime_dir
19
16
  from ..projectiles import ProjectileTypeId
20
17
  from ..ui.cursor import draw_aim_cursor
21
18
  from ..weapon_sfx import resolve_weapon_sfx_ref
@@ -25,6 +22,7 @@ from ..weapons import (
25
22
  Weapon,
26
23
  projectile_type_id_from_weapon_id,
27
24
  )
25
+ from .audio_bootstrap import init_view_audio
28
26
  from .registry import register_view
29
27
 
30
28
 
@@ -284,32 +282,13 @@ class ArsenalDebugView:
284
282
  except Exception:
285
283
  self._small = None
286
284
 
287
- runtime_dir = default_runtime_dir()
288
- if runtime_dir.is_dir():
289
- try:
290
- self._world.config = ensure_crimson_cfg(runtime_dir)
291
- except Exception:
292
- self._world.config = None
293
- else:
294
- self._world.config = None
295
-
296
- if self._world.config is not None:
297
- try:
298
- self._console = ConsoleState(
299
- base_dir=runtime_dir,
300
- log=ConsoleLog(base_dir=runtime_dir),
301
- assets_dir=self._assets_root,
302
- )
303
- self._audio = init_audio_state(self._world.config, self._assets_root, self._console)
304
- self._audio_rng = random.Random(0xBEEF)
305
- self._world.audio = self._audio
306
- self._world.audio_rng = self._audio_rng
307
- except Exception:
308
- self._audio = None
309
- self._audio_rng = None
310
- self._console = None
311
- self._world.audio = None
312
- self._world.audio_rng = None
285
+ bootstrap = init_view_audio(self._assets_root)
286
+ self._world.config = bootstrap.config
287
+ self._console = bootstrap.console
288
+ self._audio = bootstrap.audio
289
+ self._audio_rng = bootstrap.audio_rng
290
+ self._world.audio = self._audio
291
+ self._world.audio_rng = self._audio_rng
313
292
 
314
293
  self._world.open()
315
294
  self._aim_texture = self._world._load_texture(
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from pathlib import Path
5
+ import random
6
+
7
+ from grim.audio import AudioState, init_audio_state
8
+ from grim.config import CrimsonConfig, ensure_crimson_cfg
9
+ from grim.console import ConsoleLog, ConsoleState
10
+
11
+ from ..assets_fetch import download_missing_paqs
12
+ from ..paths import default_runtime_dir
13
+
14
+
15
+ @dataclass(slots=True)
16
+ class ViewAudioBootstrap:
17
+ config: CrimsonConfig | None
18
+ console: ConsoleState | None
19
+ audio: AudioState | None
20
+ audio_rng: random.Random | None
21
+
22
+
23
+ def init_view_audio(assets_dir: Path, *, seed: int = 0xBEEF) -> ViewAudioBootstrap:
24
+ runtime_dir = default_runtime_dir()
25
+ runtime_dir.mkdir(parents=True, exist_ok=True)
26
+ try:
27
+ config = ensure_crimson_cfg(runtime_dir)
28
+ except Exception:
29
+ return ViewAudioBootstrap(None, None, None, None)
30
+
31
+ console = ConsoleState(
32
+ base_dir=runtime_dir,
33
+ log=ConsoleLog(base_dir=runtime_dir),
34
+ assets_dir=assets_dir,
35
+ )
36
+ try:
37
+ download_missing_paqs(assets_dir, console)
38
+ except Exception as exc:
39
+ console.log.log(f"assets: download failed: {exc}")
40
+ console.log.flush()
41
+
42
+ try:
43
+ audio = init_audio_state(config, assets_dir, console)
44
+ except Exception:
45
+ return ViewAudioBootstrap(config, console, None, None)
46
+
47
+ return ViewAudioBootstrap(config, console, audio, random.Random(seed))
@@ -6,17 +6,15 @@ import random
6
6
 
7
7
  import pyray as rl
8
8
 
9
- from grim.audio import AudioState, init_audio_state, shutdown_audio
10
- from grim.config import ensure_crimson_cfg
11
- from grim.console import ConsoleLog, ConsoleState
9
+ from grim.audio import AudioState, shutdown_audio
12
10
  from grim.fonts.small import SmallFontData, draw_small_text, load_small_font
13
11
  from grim.view import View, ViewContext
14
12
 
15
13
  from ..game_world import GameWorld
16
14
  from ..gameplay import PlayerInput, player_update, weapon_assign_player
17
- from ..paths import default_runtime_dir
18
15
  from ..ui.cursor import draw_aim_cursor
19
16
  from ..weapons import WEAPON_TABLE
17
+ from .audio_bootstrap import init_view_audio
20
18
  from .registry import register_view
21
19
 
22
20
 
@@ -203,32 +201,13 @@ class ProjectileRenderDebugView:
203
201
  except Exception:
204
202
  self._small = None
205
203
 
206
- runtime_dir = default_runtime_dir()
207
- if runtime_dir.is_dir():
208
- try:
209
- self._world.config = ensure_crimson_cfg(runtime_dir)
210
- except Exception:
211
- self._world.config = None
212
- else:
213
- self._world.config = None
214
-
215
- if self._world.config is not None:
216
- try:
217
- self._console = ConsoleState(
218
- base_dir=runtime_dir,
219
- log=ConsoleLog(base_dir=runtime_dir),
220
- assets_dir=self._assets_root,
221
- )
222
- self._audio = init_audio_state(self._world.config, self._assets_root, self._console)
223
- self._audio_rng = random.Random(0xBEEF)
224
- self._world.audio = self._audio
225
- self._world.audio_rng = self._audio_rng
226
- except Exception:
227
- self._audio = None
228
- self._audio_rng = None
229
- self._console = None
230
- self._world.audio = None
231
- self._world.audio_rng = None
204
+ bootstrap = init_view_audio(self._assets_root)
205
+ self._world.config = bootstrap.config
206
+ self._console = bootstrap.console
207
+ self._audio = bootstrap.audio
208
+ self._audio_rng = bootstrap.audio_rng
209
+ self._world.audio = self._audio
210
+ self._world.audio_rng = self._audio_rng
232
211
 
233
212
  self._world.open()
234
213
  self._aim_texture = self._world._load_texture(