Files
Grinch-AP/worlds/stardew_valley/scripts/update_data.py
agilbert1412 52e65e208e Stardew Valley: 5.x.x - The Allsanity Update (#2764)
Major Content update for Stardew Valley, including the following features

- Major performance improvements all across the Stardew Valley apworld, including a significant reduction in the test time
- Randomized Farm Type
- Bundles rework (Remixed Bundles and Missing Bundle!)
- New Settings:
  * Shipsanity - Shipping individual items
  * Monstersanity - Slaying monsters
  * Cooksanity - Cooking individual recipes
  * Chefsanity - Learning individual recipes
  * Craftsanity - Crafting individual items
- New Goals:
  * Protector of the Valley - Complete every monster slayer goal
  * Full Shipment - Ship every item
  * Craftmaster - Craft every item
  * Gourmet Chef - Cook every recipe
  * Legend - Earn 10 000 000g
  * Mystery of the Stardrops - Find every stardrop (Maguffin Hunt)
  * Allsanity - Complete every check in your slot
- Building Shuffle: Cheaper options
- Tool Shuffle: Cheaper options
- Money rework
- New traps
- New isolated checks and items, including the farm cave, the movie theater, etc
- Mod Support: SVE [Albrekka]
- Mod Support: Distant Lands [Albrekka]
- Mod Support: Hat Mouse Lacey [Albrekka]
- Mod Support: Boarding House [Albrekka]

Co-authored-by: Witchybun <elnendil@gmail.com>
Co-authored-by: Witchybun <96719127+Witchybun@users.noreply.github.com>
Co-authored-by: Jouramie <jouramie@hotmail.com>
Co-authored-by: Alchav <59858495+Alchav@users.noreply.github.com>
2024-03-15 13:05:14 +01:00

90 lines
3.6 KiB
Python

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