Stardew Valley: Added missing logic rules for dating and marriage (#2160)
* - Added missing logic rules where, to earn hearts above 8 and 10, you need access to dating and marriage respectively. * - Slight cleanup based on Black Sliver's suggestion
This commit is contained in:
parent
7522a32ad6
commit
fdac50523b
|
@ -1043,11 +1043,12 @@ class StardewLogic:
|
||||||
def has_relationship(self, npc: str, hearts: int = 1) -> StardewRule:
|
def has_relationship(self, npc: str, hearts: int = 1) -> StardewRule:
|
||||||
if hearts <= 0:
|
if hearts <= 0:
|
||||||
return True_()
|
return True_()
|
||||||
if self.options[options.Friendsanity] == options.Friendsanity.option_none:
|
friendsanity = self.options[options.Friendsanity]
|
||||||
|
if friendsanity == options.Friendsanity.option_none:
|
||||||
return self.can_earn_relationship(npc, hearts)
|
return self.can_earn_relationship(npc, hearts)
|
||||||
if npc not in all_villagers_by_name:
|
if npc not in all_villagers_by_name:
|
||||||
if npc == NPC.pet:
|
if npc == NPC.pet:
|
||||||
if self.options[options.Friendsanity] == options.Friendsanity.option_bachelors:
|
if friendsanity == options.Friendsanity.option_bachelors:
|
||||||
return self.can_befriend_pet(hearts)
|
return self.can_befriend_pet(hearts)
|
||||||
return self.received_hearts(NPC.pet, hearts)
|
return self.received_hearts(NPC.pet, hearts)
|
||||||
if npc == Generic.any or npc == Generic.bachelor:
|
if npc == Generic.any or npc == Generic.bachelor:
|
||||||
|
@ -1077,12 +1078,12 @@ class StardewLogic:
|
||||||
if not self.npc_is_in_current_slot(npc):
|
if not self.npc_is_in_current_slot(npc):
|
||||||
return True_()
|
return True_()
|
||||||
villager = all_villagers_by_name[npc]
|
villager = all_villagers_by_name[npc]
|
||||||
if self.options[options.Friendsanity] == options.Friendsanity.option_bachelors and not villager.bachelor:
|
if friendsanity == options.Friendsanity.option_bachelors and not villager.bachelor:
|
||||||
return self.can_earn_relationship(npc, hearts)
|
return self.can_earn_relationship(npc, hearts)
|
||||||
if self.options[options.Friendsanity] == options.Friendsanity.option_starting_npcs and not villager.available:
|
if friendsanity == options.Friendsanity.option_starting_npcs and not villager.available:
|
||||||
return self.can_earn_relationship(npc, hearts)
|
return self.can_earn_relationship(npc, hearts)
|
||||||
if self.options[
|
is_capped_at_8 = villager.bachelor and friendsanity != options.Friendsanity.option_all_with_marriage
|
||||||
options.Friendsanity] != options.Friendsanity.option_all_with_marriage and villager.bachelor and hearts > 8:
|
if is_capped_at_8 and hearts > 8:
|
||||||
return self.received_hearts(villager, 8) & self.can_earn_relationship(npc, hearts)
|
return self.received_hearts(villager, 8) & self.can_earn_relationship(npc, hearts)
|
||||||
return self.received_hearts(villager, hearts)
|
return self.received_hearts(villager, hearts)
|
||||||
|
|
||||||
|
@ -1136,11 +1137,22 @@ class StardewLogic:
|
||||||
rule_if_birthday = self.has_season(villager.birthday) & self.has_any_universal_love() & self.has_lived_months(hearts // 2)
|
rule_if_birthday = self.has_season(villager.birthday) & self.has_any_universal_love() & self.has_lived_months(hearts // 2)
|
||||||
rule_if_not_birthday = self.has_lived_months(hearts)
|
rule_if_not_birthday = self.has_lived_months(hearts)
|
||||||
earn_rule = self.can_meet(npc) & (rule_if_birthday | rule_if_not_birthday)
|
earn_rule = self.can_meet(npc) & (rule_if_birthday | rule_if_not_birthday)
|
||||||
|
if villager.bachelor:
|
||||||
|
if hearts > 8:
|
||||||
|
earn_rule = earn_rule & self.can_date(npc)
|
||||||
|
if hearts > 10:
|
||||||
|
earn_rule = earn_rule & self.can_marry(npc)
|
||||||
else:
|
else:
|
||||||
earn_rule = self.has_lived_months(min(hearts // 2, 8))
|
earn_rule = self.has_lived_months(min(hearts // 2, 8))
|
||||||
|
|
||||||
return previous_heart_rule & earn_rule
|
return previous_heart_rule & earn_rule
|
||||||
|
|
||||||
|
def can_date(self, npc: str) -> StardewRule:
|
||||||
|
return self.has_relationship(npc, 8) & self.has(Gift.bouquet)
|
||||||
|
|
||||||
|
def can_marry(self, npc: str) -> StardewRule:
|
||||||
|
return self.has_relationship(npc, 10) & self.has(Gift.mermaid_pendant)
|
||||||
|
|
||||||
def can_befriend_pet(self, hearts: int):
|
def can_befriend_pet(self, hearts: int):
|
||||||
if hearts <= 0:
|
if hearts <= 0:
|
||||||
return True_()
|
return True_()
|
||||||
|
|
|
@ -444,3 +444,63 @@ def collect_all_except(multiworld, item_to_not_collect: str):
|
||||||
for item in multiworld.get_items():
|
for item in multiworld.get_items():
|
||||||
if item.name != item_to_not_collect:
|
if item.name != item_to_not_collect:
|
||||||
multiworld.state.collect(item)
|
multiworld.state.collect(item)
|
||||||
|
|
||||||
|
|
||||||
|
class TestFriendsanityDatingRules(SVTestBase):
|
||||||
|
options = {
|
||||||
|
options.SeasonRandomization.internal_name: options.SeasonRandomization.option_randomized_not_winter,
|
||||||
|
options.Friendsanity.internal_name: options.Friendsanity.option_all_with_marriage,
|
||||||
|
options.FriendsanityHeartSize.internal_name: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_earning_dating_heart_requires_dating(self):
|
||||||
|
month_name = "Month End"
|
||||||
|
for i in range(12):
|
||||||
|
month_item = self.world.create_item(month_name)
|
||||||
|
self.multiworld.state.collect(month_item, event=True)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Beach Bridge"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Progressive House"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Adventurer's Guild"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Galaxy Hammer"), event=False)
|
||||||
|
for i in range(3):
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Progressive Pickaxe"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Progressive Axe"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Progressive Barn"), event=False)
|
||||||
|
for i in range(10):
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Foraging Level"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Farming Level"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Mining Level"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Combat Level"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Progressive Mine Elevator"), event=False)
|
||||||
|
self.multiworld.state.collect(self.world.create_item("Progressive Mine Elevator"), event=False)
|
||||||
|
|
||||||
|
npc = "Abigail"
|
||||||
|
heart_name = f"{npc} <3"
|
||||||
|
step = 3
|
||||||
|
|
||||||
|
self.assert_can_reach_heart_up_to(npc, 3, step)
|
||||||
|
self.multiworld.state.collect(self.world.create_item(heart_name), event=False)
|
||||||
|
self.assert_can_reach_heart_up_to(npc, 6, step)
|
||||||
|
self.multiworld.state.collect(self.world.create_item(heart_name), event=False)
|
||||||
|
self.assert_can_reach_heart_up_to(npc, 8, step)
|
||||||
|
self.multiworld.state.collect(self.world.create_item(heart_name), event=False)
|
||||||
|
self.assert_can_reach_heart_up_to(npc, 10, step)
|
||||||
|
self.multiworld.state.collect(self.world.create_item(heart_name), event=False)
|
||||||
|
self.assert_can_reach_heart_up_to(npc, 14, step)
|
||||||
|
|
||||||
|
def assert_can_reach_heart_up_to(self, npc: str, max_reachable: int, step: int):
|
||||||
|
prefix = "Friendsanity: "
|
||||||
|
suffix = " <3"
|
||||||
|
for i in range(1, max_reachable + 1):
|
||||||
|
if i % step != 0 and i != 14:
|
||||||
|
continue
|
||||||
|
location = f"{prefix}{npc} {i}{suffix}"
|
||||||
|
can_reach = self.world.logic.can_reach_location(location)(self.multiworld.state)
|
||||||
|
self.assertTrue(can_reach, f"Should be able to earn relationship up to {i} hearts")
|
||||||
|
for i in range(max_reachable + 1, 14 + 1):
|
||||||
|
if i % step != 0 and i != 14:
|
||||||
|
continue
|
||||||
|
location = f"{prefix}{npc} {i}{suffix}"
|
||||||
|
can_reach = self.world.logic.can_reach_location(location)(self.multiworld.state)
|
||||||
|
self.assertFalse(can_reach, f"Should not be able to earn relationship up to {i} hearts")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue