Archipelago/worlds/stardew_valley/scripts/update_data.py

90 lines
3.6 KiB
Python
Raw Normal View History

"""Update data script
This script can be used to assign new ids for the items and locations in the CSV file. It also regenerates the items
based on the resource packs.
To run the script, use `python -m worlds.stardew_valley.scripts.update_data` from the repository root.
"""
import csv
import itertools
from pathlib import Path
from typing import List
from worlds.stardew_valley import LocationData
2023-07-19 18:26:38 +00:00
from worlds.stardew_valley.items import load_item_csv, Group, ItemData
from worlds.stardew_valley.locations import load_location_csv, LocationTags
RESOURCE_PACK_CODE_OFFSET = 5000
script_folder = Path(__file__)
def write_item_csv(items: List[ItemData]):
with open((script_folder.parent.parent / "data/items.csv").resolve(), "w", newline="") as file:
writer = csv.DictWriter(file, ["id", "name", "classification", "groups"])
writer.writeheader()
for item in items:
item_dict = {
"id": item.code_without_offset,
"name": item.name,
"classification": item.classification.name,
"groups": ",".join(sorted(group.name for group in item.groups))
}
writer.writerow(item_dict)
def write_location_csv(locations: List[LocationData]):
with open((script_folder.parent.parent / "data/locations.csv").resolve(), "w", newline="") as file:
write = csv.DictWriter(file, ["id", "region", "name", "tags", "mod_name"])
write.writeheader()
for location in locations:
location_dict = {
"id": location.code_without_offset,
"name": location.name,
"region": location.region,
"tags": ",".join(sorted(group.name for group in location.tags)),
"mod_name": location.mod_name
}
write.writerow(location_dict)
if __name__ == "__main__":
loaded_items = load_item_csv()
item_counter = itertools.count(max(item.code_without_offset
for item in loaded_items
if Group.RESOURCE_PACK not in item.groups
and item.code_without_offset is not None) + 1)
2023-07-19 18:26:38 +00:00
resource_pack_counter = itertools.count(max(item.code_without_offset
for item in loaded_items
if Group.RESOURCE_PACK in item.groups
and item.code_without_offset is not None) + 1)
items_to_write = []
for item in loaded_items:
if item.code_without_offset is None:
2023-07-19 18:26:38 +00:00
if Group.RESOURCE_PACK in item.groups:
new_code = next(resource_pack_counter)
else:
new_code = next(item_counter)
items_to_write.append(ItemData(new_code, item.name, item.classification, item.groups))
continue
items_to_write.append(item)
write_item_csv(items_to_write)
loaded_locations = load_location_csv()
location_counter = itertools.count(max(location.code_without_offset
for location in loaded_locations
if location.code_without_offset is not None) + 1)
locations_to_write = []
for location in loaded_locations:
if location.code_without_offset is None:
locations_to_write.append(
LocationData(next(location_counter), location.region, location.name, location.mod_name, location.tags))
continue
locations_to_write.append(location)
write_location_csv(locations_to_write)