mirror of
				https://github.com/MarioSpore/Grinch-AP.git
				synced 2025-10-21 20:21:32 -06:00 
			
		
		
		
	
		
			
	
	
		
			145 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			145 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | """
 | ||
|  | This is a utility file that converts logic in the form of CSV files into Python files that can be imported and used | ||
|  | directly by the world implementation. Whenever the logic files are updated, this script should be run to re-generate | ||
|  | the python files containing the data. | ||
|  | """
 | ||
|  | import requests | ||
|  | 
 | ||
|  | # The CSVs are updated at this repository to be shared between generator and client. | ||
|  | data_repository_address = "https://raw.githubusercontent.com/digiholic/osrs-archipelago-logic/" | ||
|  | # The Github tag of the CSVs this was generated with | ||
|  | data_csv_tag = "v1.5" | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     import sys | ||
|  |     import os | ||
|  |     import csv | ||
|  |     import typing | ||
|  | 
 | ||
|  |     # makes this module runnable from its world folder. Shamelessly stolen from Subnautica | ||
|  |     sys.path.remove(os.path.dirname(__file__)) | ||
|  |     new_home = os.path.normpath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) | ||
|  |     os.chdir(new_home) | ||
|  |     sys.path.append(new_home) | ||
|  | 
 | ||
|  | 
 | ||
|  |     def load_location_csv(): | ||
|  |         this_dir = os.path.dirname(os.path.abspath(__file__)) | ||
|  | 
 | ||
|  |         with open(os.path.join(this_dir, "locations_generated.py"), 'w+') as locPyFile: | ||
|  |             locPyFile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') | ||
|  |             locPyFile.write("from ..Locations import LocationRow, SkillRequirement\n") | ||
|  |             locPyFile.write("\n") | ||
|  |             locPyFile.write("location_rows = [\n") | ||
|  | 
 | ||
|  |             with requests.get(data_repository_address + "/" + data_csv_tag + "/locations.csv") as req: | ||
|  |                 locations_reader = csv.reader(req.text.splitlines()) | ||
|  |                 for row in locations_reader: | ||
|  |                     row_line = "LocationRow(" | ||
|  |                     row_line += str_format(row[0]) | ||
|  |                     row_line += str_format(row[1].lower()) | ||
|  | 
 | ||
|  |                     region_strings = row[2].split(", ") if row[2] else [] | ||
|  |                     row_line += f"{str_list_to_py(region_strings)}, " | ||
|  | 
 | ||
|  |                     skill_strings = row[3].split(", ") | ||
|  |                     row_line += "[" | ||
|  |                     if skill_strings: | ||
|  |                         split_skills = [skill.split(" ") for skill in skill_strings if skill != ""] | ||
|  |                         if split_skills: | ||
|  |                             for split in split_skills: | ||
|  |                                 row_line += f"SkillRequirement('{split[0]}', {split[1]}), " | ||
|  |                     row_line += "], " | ||
|  | 
 | ||
|  |                     item_strings = row[4].split(", ") if row[4] else [] | ||
|  |                     row_line += f"{str_list_to_py(item_strings)}, " | ||
|  |                     row_line += f"{row[5]})" if row[5] != "" else "0)" | ||
|  |                     locPyFile.write(f"\t{row_line},\n") | ||
|  |             locPyFile.write("]\n") | ||
|  | 
 | ||
|  |     def load_region_csv(): | ||
|  |         this_dir = os.path.dirname(os.path.abspath(__file__)) | ||
|  | 
 | ||
|  |         with open(os.path.join(this_dir, "regions_generated.py"), 'w+') as regPyFile: | ||
|  |             regPyFile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') | ||
|  |             regPyFile.write("from ..Regions import RegionRow\n") | ||
|  |             regPyFile.write("\n") | ||
|  |             regPyFile.write("region_rows = [\n") | ||
|  | 
 | ||
|  |             with requests.get(data_repository_address + "/" + data_csv_tag + "/regions.csv") as req: | ||
|  |                 regions_reader = csv.reader(req.text.splitlines()) | ||
|  |                 for row in regions_reader: | ||
|  |                     row_line = "RegionRow(" | ||
|  |                     row_line += str_format(row[0]) | ||
|  |                     row_line += str_format(row[1]) | ||
|  |                     connections = row[2].replace("'", "\\'") | ||
|  |                     row_line += f"{str_list_to_py(connections.split(', '))}, " | ||
|  |                     resources = row[3].replace("'", "\\'") | ||
|  |                     row_line += f"{str_list_to_py(resources.split(', '))})" | ||
|  |                     regPyFile.write(f"\t{row_line},\n") | ||
|  |             regPyFile.write("]\n") | ||
|  | 
 | ||
|  |     def load_resource_csv(): | ||
|  |         this_dir = os.path.dirname(os.path.abspath(__file__)) | ||
|  | 
 | ||
|  |         with open(os.path.join(this_dir, "resources_generated.py"), 'w+') as resPyFile: | ||
|  |             resPyFile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') | ||
|  |             resPyFile.write("from ..Regions import ResourceRow\n") | ||
|  |             resPyFile.write("\n") | ||
|  |             resPyFile.write("resource_rows = [\n") | ||
|  | 
 | ||
|  |             with requests.get(data_repository_address + "/" + data_csv_tag + "/resources.csv") as req: | ||
|  |                 resource_reader = csv.reader(req.text.splitlines()) | ||
|  |                 for row in resource_reader: | ||
|  |                     name = row[0].replace("'", "\\'") | ||
|  |                     row_line = f"ResourceRow('{name}')" | ||
|  |                     resPyFile.write(f"\t{row_line},\n") | ||
|  |             resPyFile.write("]\n") | ||
|  | 
 | ||
|  | 
 | ||
|  |     def load_item_csv(): | ||
|  |         this_dir = os.path.dirname(os.path.abspath(__file__)) | ||
|  | 
 | ||
|  |         with open(os.path.join(this_dir, "items_generated.py"), 'w+') as itemPyfile: | ||
|  |             itemPyfile.write('"""\nThis file was auto generated by LogicCSVToPython.py\n"""\n') | ||
|  |             itemPyfile.write("from BaseClasses import ItemClassification\n") | ||
|  |             itemPyfile.write("from ..Items import ItemRow\n") | ||
|  |             itemPyfile.write("\n") | ||
|  |             itemPyfile.write("item_rows = [\n") | ||
|  | 
 | ||
|  |             with requests.get(data_repository_address + "/" + data_csv_tag + "/items.csv") as req: | ||
|  |                 item_reader = csv.reader(req.text.splitlines()) | ||
|  |                 for row in item_reader: | ||
|  |                     row_line = "ItemRow(" | ||
|  |                     row_line += str_format(row[0]) | ||
|  |                     row_line += f"{row[1]}, " | ||
|  | 
 | ||
|  |                     row_line += f"ItemClassification.{row[2]})" | ||
|  | 
 | ||
|  |                     itemPyfile.write(f"\t{row_line},\n") | ||
|  |             itemPyfile.write("]\n") | ||
|  | 
 | ||
|  | 
 | ||
|  |     def str_format(s) -> str: | ||
|  |         ret_str = s.replace("'", "\\'") | ||
|  |         return f"'{ret_str}', " | ||
|  | 
 | ||
|  | 
 | ||
|  |     def str_list_to_py(str_list) -> str: | ||
|  |         ret_str = "[" | ||
|  |         for s in str_list: | ||
|  |             ret_str += f"'{s}', " | ||
|  |         ret_str += "]" | ||
|  |         return ret_str | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     load_location_csv() | ||
|  |     print("Generated locations py") | ||
|  |     load_region_csv() | ||
|  |     print("Generated regions py") | ||
|  |     load_resource_csv() | ||
|  |     print("Generated resource py") | ||
|  |     load_item_csv() | ||
|  |     print("Generated item py") |