mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 04:01:32 -06:00

Migrates SC2 WoL world to the new mod with new items and locations. The new mod has a different architecture making it more future proof (with planned adding of other campaigns). Also gets rid of several old bugs Adds new short game formats intended for sync games (Tiny Grid, Mini Gauntlet). The final mission isn't decided by campaign length anymore but it's configurable instead. Allow excluding missions for Vanilla Shuffled, corrected some documentation. NOTE: This is a squashed commit with Salz' HotS excluded (not ready for the release and I plan multi-campaign instead) --------- Co-authored-by: Matthew <matthew.marinets@gmail.com>
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
|