56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
		
			1.5 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:
							 | 
						||
| 
								 | 
							
								    # Iterate through 2 folder depths
							 | 
						||
| 
								 | 
							
								    for map_dir in (p for p in Paths.MAPS.iterdir()):
							 | 
						||
| 
								 | 
							
								        if map_dir.is_dir():
							 | 
						||
| 
								 | 
							
								            for map_file in (p for p in map_dir.iterdir()):
							 | 
						||
| 
								 | 
							
								                if Map.matches_target_map_name(map_file, name):
							 | 
						||
| 
								 | 
							
								                    return Map(map_file)
							 | 
						||
| 
								 | 
							
								        elif Map.matches_target_map_name(map_dir, name):
							 | 
						||
| 
								 | 
							
								            return Map(map_dir)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    raise KeyError(f"Map '{name}' was not found. Please put the map file in \"/StarCraft II/Maps/\".")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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
							 |