musictimer commited on
Commit
f1594be
·
1 Parent(s): 062758f
app.py CHANGED
@@ -46,6 +46,12 @@ logger = logging.getLogger(__name__)
46
 
47
  # Global variables
48
  app = FastAPI(title="Diamond CSGO AI Player")
 
 
 
 
 
 
49
  connected_clients: Set[WebSocket] = set()
50
 
51
  class WebKeyMap:
 
46
 
47
  # Global variables
48
  app = FastAPI(title="Diamond CSGO AI Player")
49
+
50
+ # Set safe defaults for headless CI/Spaces environments
51
+ os.environ.setdefault("SDL_VIDEODRIVER", "dummy")
52
+ os.environ.setdefault("SDL_AUDIODRIVER", "dummy")
53
+ os.environ.setdefault("PYGAME_HIDE_SUPPORT_PROMPT", "1")
54
+ os.environ.setdefault("OMP_NUM_THREADS", "1")
55
  connected_clients: Set[WebSocket] = set()
56
 
57
  class WebKeyMap:
src/csgo/__pycache__/action_processing.cpython-310.pyc CHANGED
Binary files a/src/csgo/__pycache__/action_processing.cpython-310.pyc and b/src/csgo/__pycache__/action_processing.cpython-310.pyc differ
 
src/csgo/__pycache__/keymap.cpython-310.pyc CHANGED
Binary files a/src/csgo/__pycache__/keymap.cpython-310.pyc and b/src/csgo/__pycache__/keymap.cpython-310.pyc differ
 
src/csgo/action_processing.py CHANGED
@@ -6,7 +6,10 @@ from dataclasses import dataclass
6
  from typing import Dict, List, Set, Tuple
7
 
8
  import numpy as np
9
- import pygame
 
 
 
10
  import torch
11
 
12
  from .keymap import CSGO_FORBIDDEN_COMBINATIONS, CSGO_KEYMAP
@@ -26,7 +29,18 @@ class CSGOAction:
26
 
27
  @property
28
  def key_names(self) -> List[str]:
29
- return [pygame.key.name(key) for key in self.keys]
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  def process_mouse(self) -> None:
32
  # Clip and match mouse to closest in list of possibles
@@ -208,7 +222,12 @@ def decode_csgo_action(y_preds: torch.Tensor) -> CSGOAction:
208
  id = np.argmax(mouse_y_pred)
209
  mouse_y = MOUSE_Y_POSSIBLES[id]
210
 
211
- keys_pressed = [pygame.key.key_code(x) for x in keys_pressed]
 
 
 
 
 
212
 
213
  return CSGOAction(keys_pressed, mouse_x, mouse_y, bool(l_click), bool(r_click))
214
 
 
6
  from typing import Dict, List, Set, Tuple
7
 
8
  import numpy as np
9
+ try:
10
+ import pygame # type: ignore
11
+ except Exception:
12
+ pygame = None # type: ignore
13
  import torch
14
 
15
  from .keymap import CSGO_FORBIDDEN_COMBINATIONS, CSGO_KEYMAP
 
29
 
30
  @property
31
  def key_names(self) -> List[str]:
32
+ # Use pygame to convert key codes when available; else assume keys already strings
33
+ names: List[str] = []
34
+ for key in self.keys:
35
+ if pygame is not None:
36
+ try:
37
+ names.append(pygame.key.name(key))
38
+ continue
39
+ except Exception:
40
+ pass
41
+ # Fallback for headless: keep as-is or cast to string
42
+ names.append(str(key))
43
+ return names
44
 
45
  def process_mouse(self) -> None:
46
  # Clip and match mouse to closest in list of possibles
 
222
  id = np.argmax(mouse_y_pred)
223
  mouse_y = MOUSE_Y_POSSIBLES[id]
224
 
225
+ # Map string names back to pygame key codes when pygame is available; otherwise keep as strings
226
+ if pygame is not None:
227
+ try:
228
+ keys_pressed = [pygame.key.key_code(x) for x in keys_pressed]
229
+ except Exception:
230
+ pass
231
 
232
  return CSGOAction(keys_pressed, mouse_x, mouse_y, bool(l_click), bool(r_click))
233
 
src/csgo/keymap.py CHANGED
@@ -1,25 +1,49 @@
1
- import pygame
 
 
 
2
 
3
 
4
- CSGO_KEYMAP = {
5
- pygame.K_w: "up",
6
- pygame.K_d: "right",
7
- pygame.K_a: "left",
8
- pygame.K_s: "down",
9
- pygame.K_SPACE: "jump",
10
- pygame.K_LCTRL: "crouch",
11
- pygame.K_LSHIFT: "walk",
12
- pygame.K_1: "weapon1",
13
- pygame.K_2: "weapon2",
14
- pygame.K_3: "weapon3",
15
- pygame.K_r: "reload",
 
16
 
17
- # Override mouse movement with arrows
18
- pygame.K_UP: "camera_up",
19
- pygame.K_RIGHT: "camera_right",
20
- pygame.K_LEFT: "camera_left",
21
- pygame.K_DOWN: "camera_down",
22
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
 
25
  CSGO_FORBIDDEN_COMBINATIONS = [
 
1
+ try:
2
+ import pygame # type: ignore
3
+ except Exception:
4
+ pygame = None # type: ignore
5
 
6
 
7
+ if pygame is not None:
8
+ CSGO_KEYMAP = {
9
+ pygame.K_w: "up",
10
+ pygame.K_d: "right",
11
+ pygame.K_a: "left",
12
+ pygame.K_s: "down",
13
+ pygame.K_SPACE: "jump",
14
+ pygame.K_LCTRL: "crouch",
15
+ pygame.K_LSHIFT: "walk",
16
+ pygame.K_1: "weapon1",
17
+ pygame.K_2: "weapon2",
18
+ pygame.K_3: "weapon3",
19
+ pygame.K_r: "reload",
20
 
21
+ # Override mouse movement with arrows
22
+ pygame.K_UP: "camera_up",
23
+ pygame.K_RIGHT: "camera_right",
24
+ pygame.K_LEFT: "camera_left",
25
+ pygame.K_DOWN: "camera_down",
26
+ }
27
+ else:
28
+ # Headless fallback without pygame
29
+ CSGO_KEYMAP = {
30
+ "w": "up",
31
+ "d": "right",
32
+ "a": "left",
33
+ "s": "down",
34
+ "space": "jump",
35
+ "left ctrl": "crouch",
36
+ "left shift": "walk",
37
+ "1": "weapon1",
38
+ "2": "weapon2",
39
+ "3": "weapon3",
40
+ "r": "reload",
41
+ # Override mouse movement with arrows (string identifiers)
42
+ "arrow_up": "camera_up",
43
+ "arrow_right": "camera_right",
44
+ "arrow_left": "camera_left",
45
+ "arrow_down": "camera_down",
46
+ }
47
 
48
 
49
  CSGO_FORBIDDEN_COMBINATIONS = [
src/game/__pycache__/play_env.cpython-310.pyc CHANGED
Binary files a/src/game/__pycache__/play_env.cpython-310.pyc and b/src/game/__pycache__/play_env.cpython-310.pyc differ
 
src/game/play_env.py CHANGED
@@ -3,7 +3,10 @@ import math
3
  from pathlib import Path
4
  from typing import Any, Dict, List, Tuple
5
 
6
- import pygame
 
 
 
7
  import torch
8
  from torch import Tensor
9
 
@@ -42,7 +45,13 @@ class PlayEnv:
42
  print("\nEnvironment actions:\n")
43
  for key, action_name in self.keymap.items():
44
  if key is not None:
45
- key_name = pygame.key.name(key)
 
 
 
 
 
 
46
  key_name = "⎵" if key_name == "space" else key_name
47
  print(f"{key_name} : {action_name}")
48
 
 
3
  from pathlib import Path
4
  from typing import Any, Dict, List, Tuple
5
 
6
+ try:
7
+ import pygame # type: ignore
8
+ except Exception: # Handle ImportError and headless environments gracefully
9
+ pygame = None # type: ignore
10
  import torch
11
  from torch import Tensor
12
 
 
45
  print("\nEnvironment actions:\n")
46
  for key, action_name in self.keymap.items():
47
  if key is not None:
48
+ # Use pygame key names when available, otherwise fallback to string representation
49
+ key_name = str(key)
50
+ if pygame is not None:
51
+ try:
52
+ key_name = pygame.key.name(key)
53
+ except Exception:
54
+ pass
55
  key_name = "⎵" if key_name == "space" else key_name
56
  print(f"{key_name} : {action_name}")
57