69 lines
1.7 KiB
Python
69 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from worlds._sc2common.bot import logger
|
|
|
|
from .paths import Paths
|
|
|
|
|
|
def get(name: str) -> Map:
|
|
for map_dir in (p for p in Paths.MAPS.iterdir()):
|
|
map = find_map_in_dir(name, map_dir)
|
|
if map is not None:
|
|
return map
|
|
|
|
raise KeyError(f"Map '{name}' was not found. Please put the map file in \"/StarCraft II/Maps/\".")
|
|
|
|
|
|
# Go deeper
|
|
def find_map_in_dir(name, path):
|
|
if Map.matches_target_map_name(path, name):
|
|
return Map(path)
|
|
|
|
if path.name.endswith("SC2Map"):
|
|
return None
|
|
|
|
if path.is_dir():
|
|
for childPath in (p for p in path.iterdir()):
|
|
map = find_map_in_dir(name, childPath)
|
|
if map is not None:
|
|
return map
|
|
|
|
return None
|
|
|
|
|
|
class Map:
|
|
|
|
def __init__(self, path: Path):
|
|
self.path = path
|
|
|
|
if self.path.is_absolute():
|
|
try:
|
|
self.relative_path = self.path.relative_to(Paths.MAPS)
|
|
except ValueError: # path not relative to basedir
|
|
logger.warning(f"Using absolute path: {self.path}")
|
|
self.relative_path = self.path
|
|
else:
|
|
self.relative_path = self.path
|
|
|
|
@property
|
|
def name(self):
|
|
return self.path.stem
|
|
|
|
@property
|
|
def data(self):
|
|
with open(self.path, "rb") as f:
|
|
return f.read()
|
|
|
|
def __repr__(self):
|
|
return f"Map({self.path})"
|
|
|
|
@classmethod
|
|
def is_map_file(cls, file: Path) -> bool:
|
|
return file.is_file() and file.suffix == ".SC2Map"
|
|
|
|
@classmethod
|
|
def matches_target_map_name(cls, file: Path, name: str) -> bool:
|
|
return cls.is_map_file(file) and file.stem == name
|