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")
 |