这种东西好久以前Kerbiter就发过了,而且用configparser不是更方便吗
- """
- File name: MPMapsBuilder3.py
- Original author: MirageTD / Chrono Vortex
- Modififed by: Kerbiter#3128@Discord / Metadorius@GitHub
- Date created: 10/11/2018
- Date last modified: 08/06/2020
- Python version: 3.8
- """
- from pathlib import Path
- import glob
- from PIL import Image
- from operator import itemgetter
- try:
- from configparser import ConfigParser, ParsingError
- except ImportError:
- from ConfigParser import ConfigParser, ParsingError
- class CaseConfigParser(ConfigParser):
- """Case-sensitive ConfigParser."""
- def optionxform(self, optionstr):
- return optionstr
- SEP = '\n=======================================================\n'
- ask_names = True if (i := input("Ask for missing names [y/N]? ")) and i.lower()[0] == 'y' else False
- ask_authors = True if (i := input("Ask for missing authors [y/N]? ")) and i.lower()[0] == 'y' else False
- skip = True if (i := input("Skip erroneous files instead of stopping [y/N]? ")) and i.lower()[0] == 'y' else False
- map_path = None
- cwd = Path.cwd()
- directory = Path.cwd()
- for folder in directory.parents:
- client_folder = folder / 'Resources'
- if client_folder.exists() and client_folder.is_dir():
- map_path = str(cwd.relative_to(folder))
- if (new_map_path := input(f'Detected map path is {map_path}. You can leave the detected folder\n(press [Enter]) or enter a correct one instead.\n')):
- map_path = new_map_path
- default_modes = input(f'Enter default gamemodes for maps with missing gamemodes\n(or press [Enter] to skip and enter them individually):\n')
- print(SEP)
- files = glob.glob('**/*.map', recursive=True)
- ### Add info from GamemodeInfo.ini to MPMaps.ini ###
- config = CaseConfigParser()
- config.read('GamemodeInfo.ini')
- ### Add info from new maps to MPMaps.ini ###
- for file in files:
- config_temp = CaseConfigParser()
- try:
- config_temp.read(file)
- except ParsingError as e:
- print(f'Skipping map file: {e}')
- if not skip:
- raise
- section_name = map_path + file
- config.add_section(section_name)
- # Can't get NumberStartingPoints from [Header] 'cause it MIGHT BE FUCKING WRONG >:(
- num_players = 0
- while config_temp.has_option('Waypoints', str(num_players)):
- config.set(section_name, 'Waypoint' + str(num_players),
- config_temp.get('Waypoints', str(num_players)))
- num_players += 1
- config.set(section_name, 'MinPlayers', '1')
- config.set(section_name, 'MaxPlayers', str(num_players))
- map_name = Path(file).name
- if config_temp.has_option('Basic', 'Name'):
- map_name = config_temp.get('Basic', 'Name')
- elif ask_names:
- map_name = input(
- f'NAME NOT DETECTED for {section_name}, please input: ')
- config.set(section_name, 'Description', map_name)
- if config_temp.has_option('Basic', 'Author'):
- config.set(section_name, 'Author', config_temp.get('Basic', 'Author'))
- elif ask_authors:
- config.set(section_name, 'Author', str(
- input(f'AUTHOR NOT DETECTED for {section_name}, please input: ')))
- config.set(section_name, 'EnforceMaxPlayers', 'True')
- config.set(section_name, 'Size', config_temp.get('Map', 'Size'))
- config.set(section_name, 'LocalSize', config_temp.get('Map', 'LocalSize'))
- image_name = file[:-3] + 'png'
- try:
- w, h = Image.open(image_name).size
- config.set(section_name, 'PreviewSize', str(w) + ',' + str(h))
- except FileNotFoundError:
- print(f'Skipping writing PreviewSize for non-existing image {image_name}.')
- map_game_mode = default_modes
- if config_temp.has_option('Basic', 'GameMode'):
- map_game_mode = config_temp.get('Basic', 'GameMode')
- elif not map_game_mode:
- map_game_mode = input(
- f'GAMEMODE NOT DETECTED for {section_name}, please input: ')
- print(f'Parsed map file {file} successfully.\n')
- print(SEP)
- ### Replace all entries in [MultiMaps] ###
- # Save & sort new entries
- entries = [map_path + e for e in files]
- entry_names = [config.get(e, 'Description').replace('[', '').replace(
- ']', '').replace(' ', '').replace(',', '').replace("'", '') for e in entries]
- entry_pairs = sorted(list(zip(entry_names, entries)), key=itemgetter(0))
- # for i in range(len(entries)):
- # entry_pairs.append((entry_names[i], entries[i]))
- # entry_pairs.sort(key=itemgetter(0))
- # Set new entries
- config.add_section('MultiMaps')
- for i in range(len(entry_pairs)):
- config.set(
- 'MultiMaps', f'({entry_pairs[i][0]}){i}', entry_pairs[i][1])
- with open('MPMaps.ini', 'w') as configfile:
- config.write(configfile, space_around_delimiters=False)
- input(f'\n\n{len(entry_pairs)} maps written to MPMaps.ini. Press [Enter] to exit.')
复制代码 |