Stardew Valley: Make progressive movie theater a progression trap (#3985)

This commit is contained in:
agilbert1412 2024-11-26 18:44:33 -05:00 committed by GitHub
parent 0dade05133
commit 75624042f7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 10 additions and 9 deletions

View File

@ -319,7 +319,7 @@ class StardewValleyWorld(World):
if override_classification is None: if override_classification is None:
override_classification = item.classification override_classification = item.classification
if override_classification == ItemClassification.progression: if override_classification & ItemClassification.progression:
self.total_progression_items += 1 self.total_progression_items += 1
return StardewItem(item.name, override_classification, item.code, self.player) return StardewItem(item.name, override_classification, item.code, self.player)

View File

@ -7,7 +7,7 @@ id,name,classification,groups,mod_name
19,Glittering Boulder Removed,progression,COMMUNITY_REWARD, 19,Glittering Boulder Removed,progression,COMMUNITY_REWARD,
20,Minecarts Repair,useful,COMMUNITY_REWARD, 20,Minecarts Repair,useful,COMMUNITY_REWARD,
21,Bus Repair,progression,COMMUNITY_REWARD, 21,Bus Repair,progression,COMMUNITY_REWARD,
22,Progressive Movie Theater,progression,COMMUNITY_REWARD, 22,Progressive Movie Theater,"progression,trap",COMMUNITY_REWARD,
23,Stardrop,progression,, 23,Stardrop,progression,,
24,Progressive Backpack,progression,, 24,Progressive Backpack,progression,,
25,Rusty Sword,filler,"WEAPON,DEPRECATED", 25,Rusty Sword,filler,"WEAPON,DEPRECATED",

1 id name classification groups mod_name
7 19 Glittering Boulder Removed progression COMMUNITY_REWARD
8 20 Minecarts Repair useful COMMUNITY_REWARD
9 21 Bus Repair progression COMMUNITY_REWARD
10 22 Progressive Movie Theater progression progression,trap COMMUNITY_REWARD
11 23 Stardrop progression
12 24 Progressive Backpack progression
13 25 Rusty Sword filler WEAPON,DEPRECATED

View File

@ -2,6 +2,7 @@ import csv
import enum import enum
import logging import logging
from dataclasses import dataclass, field from dataclasses import dataclass, field
from functools import reduce
from pathlib import Path from pathlib import Path
from random import Random from random import Random
from typing import Dict, List, Protocol, Union, Set, Optional from typing import Dict, List, Protocol, Union, Set, Optional
@ -134,7 +135,7 @@ def load_item_csv():
item_reader = csv.DictReader(file) item_reader = csv.DictReader(file)
for item in item_reader: for item in item_reader:
id = int(item["id"]) if item["id"] else None id = int(item["id"]) if item["id"] else None
classification = ItemClassification[item["classification"]] classification = reduce((lambda a, b: a | b), {ItemClassification[str_classification] for str_classification in item["classification"].split(",")})
groups = {Group[group] for group in item["groups"].split(",") if group} groups = {Group[group] for group in item["groups"].split(",") if group}
mod_name = str(item["mod_name"]) if item["mod_name"] else None mod_name = str(item["mod_name"]) if item["mod_name"] else None
items.append(ItemData(id, item["name"], classification, mod_name, groups)) items.append(ItemData(id, item["name"], classification, mod_name, groups))

View File

@ -35,7 +35,7 @@ class TestBaseItemGeneration(SVTestBase):
items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY])
items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK]) items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK])
items_to_ignore.append("The Gateway Gazette") items_to_ignore.append("The Gateway Gazette")
progression_items = [item for item in items.all_items if item.classification is ItemClassification.progression and item.name not in items_to_ignore] progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression and item.name not in items_to_ignore]
for progression_item in progression_items: for progression_item in progression_items:
with self.subTest(f"{progression_item.name}"): with self.subTest(f"{progression_item.name}"):
self.assertIn(progression_item.name, all_created_items) self.assertIn(progression_item.name, all_created_items)
@ -86,7 +86,7 @@ class TestNoGingerIslandItemGeneration(SVTestBase):
items_to_ignore.extend(season.name for season in items.items_by_group[Group.WEAPON]) items_to_ignore.extend(season.name for season in items.items_by_group[Group.WEAPON])
items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY])
items_to_ignore.append("The Gateway Gazette") items_to_ignore.append("The Gateway Gazette")
progression_items = [item for item in items.all_items if item.classification is ItemClassification.progression and item.name not in items_to_ignore] progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression and item.name not in items_to_ignore]
for progression_item in progression_items: for progression_item in progression_items:
with self.subTest(f"{progression_item.name}"): with self.subTest(f"{progression_item.name}"):
if Group.GINGER_ISLAND in progression_item.groups: if Group.GINGER_ISLAND in progression_item.groups:

View File

@ -306,7 +306,7 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase):
def create_item(self, item: str) -> StardewItem: def create_item(self, item: str) -> StardewItem:
created_item = self.world.create_item(item) created_item = self.world.create_item(item)
if created_item.classification == ItemClassification.progression: if created_item.classification & ItemClassification.progression:
self.multiworld.worlds[self.player].total_progression_items -= 1 self.multiworld.worlds[self.player].total_progression_items -= 1
return created_item return created_item

View File

@ -75,7 +75,7 @@ class TestBaseItemGeneration(SVTestBase):
items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY])
items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK]) items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK])
items_to_ignore.append("The Gateway Gazette") items_to_ignore.append("The Gateway Gazette")
progression_items = [item for item in items.all_items if item.classification is ItemClassification.progression progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression
and item.name not in items_to_ignore] and item.name not in items_to_ignore]
for progression_item in progression_items: for progression_item in progression_items:
with self.subTest(f"{progression_item.name}"): with self.subTest(f"{progression_item.name}"):
@ -105,7 +105,7 @@ class TestNoGingerIslandModItemGeneration(SVTestBase):
items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY]) items_to_ignore.extend(baby.name for baby in items.items_by_group[Group.BABY])
items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK]) items_to_ignore.extend(resource_pack.name for resource_pack in items.items_by_group[Group.RESOURCE_PACK])
items_to_ignore.append("The Gateway Gazette") items_to_ignore.append("The Gateway Gazette")
progression_items = [item for item in items.all_items if item.classification is ItemClassification.progression progression_items = [item for item in items.all_items if item.classification & ItemClassification.progression
and item.name not in items_to_ignore] and item.name not in items_to_ignore]
for progression_item in progression_items: for progression_item in progression_items:
with self.subTest(f"{progression_item.name}"): with self.subTest(f"{progression_item.name}"):

View File

@ -8,5 +8,5 @@ class TestHasProgressionPercent(unittest.TestCase):
def test_max_item_amount_is_full_collection(self): def test_max_item_amount_is_full_collection(self):
# Not caching because it fails too often for some reason # Not caching because it fails too often for some reason
with solo_multiworld(world_caching=False) as (multiworld, world): with solo_multiworld(world_caching=False) as (multiworld, world):
progression_item_count = sum(1 for i in multiworld.get_items() if ItemClassification.progression in i.classification) progression_item_count = sum(1 for i in multiworld.get_items() if i.classification & ItemClassification.progression)
self.assertEqual(world.total_progression_items, progression_item_count - 1) # -1 to skip Victory self.assertEqual(world.total_progression_items, progression_item_count - 1) # -1 to skip Victory