diff --git a/worlds/sims4/Names/CareerNames.py b/worlds/sims4/Names/CareerNames.py index 6ba3aadf3db9..2090dd0273df 100644 --- a/worlds/sims4/Names/CareerNames.py +++ b/worlds/sims4/Names/CareerNames.py @@ -1,5 +1,6 @@ # Base game careers # Astronaut +base_career_astronaut = "Astronaut" base_career_astronaut_2 = "Module Cleaner (Astronaut 2)" base_career_astronaut_3 = "Technician (Astronaut 3)" base_career_astronaut_4 = "Command Center Lead (Astronaut 4)" @@ -13,6 +14,7 @@ base_career_astronaut_9B = "Alien Goods Trader (Astronaut / Interstellar Smuggler 9)" base_career_astronaut_10B = "Interstellar Smuggler (Astronaut / Interstellar Smuggler 10)" # Athlete +base_career_athlete = "Athlete" base_career_athlete_2 = "Locker Room Attendant (Athlete 2)" base_career_athlete_3 = "Team Mascot (Athlete 3)" base_career_athlete_4 = "Dance Team Captain (Athlete 4)" @@ -29,6 +31,7 @@ base_career_athlete_9B = "Celebrity Bodybuilder (Athlete / Bodybuilder 9)" base_career_athlete_10B = "Mr. / Mrs. Solar System (Athlete / Bodybuilder 10)" # Business +base_career_business = "Business" base_career_business_2 = "Office Assistant (Business 2)" base_career_business_3 = "Assistant to the Manager (Business 3)" base_career_business_4 = "Assistant Manager (Business 4)" @@ -43,6 +46,7 @@ base_career_business_9B = "Corporate Raider (Business / Investor 9)" base_career_business_10B = "Angel Investor (Business / Investor 10)" # Criminal +base_career_criminal = "Criminal" base_career_criminal_2 = "Petty Thief (Criminal 2)" base_career_criminal_3 = "Ringleader (Criminal 3)" base_career_criminal_4 = "Felonius Monk (Criminal 4)" @@ -58,6 +62,7 @@ base_career_criminal_9B = "Net Demon (Criminal / Oracle 9)" base_career_criminal_10B = "The Oracle (Criminal / Oracle 10)" # Culinary +base_career_culinary = "Culinary" base_career_culinary_2 = "Head Dishwasher (Culinary 2)" base_career_culinary_3 = "Caterer (Culinary 3)" base_career_culinary_4 = "Mixologist (Culinary 4)" @@ -73,6 +78,7 @@ base_career_culinary_9B = "Drinkmaster (Culinary / Mixologist 9)" base_career_culinary_10B = "Celebrity Mixologist (Culinary / Mixologist 10)" # Entertainer +base_career_entertainer = "Entertainer" base_career_entertainer_2 = "Open Mic Seeker (Entertainer 2)" base_career_entertainer_3 = "C-Lister (Entertainer 3)" base_career_entertainer_4 = "Opening Act (Entertainer 4)" @@ -89,6 +95,7 @@ base_career_entertainer_9B = "Stand Up Star (Entertainer / Comedian 9)" base_career_entertainer_10B = "Show Stopper (Entertainer / Comedian 10)" # Painter +base_career_painter = "Painter" base_career_painter_2 = "Art Book Collator (Painter 2)" base_career_painter_3 = "Hungry Artist (Painter 3)" base_career_painter_4 = "Watercolor Dabbler (Painter 4)" @@ -103,6 +110,7 @@ base_career_painter_9B = "Composition Curator (Painter / Patron of the Arts 9)" base_career_painter_10B = "Patron of the Arts (Painter / Patron of the Arts 10)" # Secret Agent +base_career_secret_agent = "Secret Agent" base_career_secret_agent_2 = "Intelligence Researcher (Secret Agent 2)" base_career_secret_agent_3 = "Agent Handler (Secret Agent 3)" base_career_secret_agent_4 = "Field Agent (Secret Agent 4)" @@ -117,6 +125,7 @@ base_career_secret_agent_10B = "Supreme Villain (Secret Agent / Villain 10)" base_career_secret_agent_11B = "Triple Agent (Secret Agent / Villain 11)" # Style Influencer +base_career_style_influencer = "Style Influencer" base_career_style_influencer_2 = "Consignment Commentator (Style Influencer 2)" base_career_style_influencer_3 = "Wearable Wordsmith (Style Influencer 3)" base_career_style_influencer_4 = "Ensemble Author (Style Influencer 4)" @@ -132,6 +141,7 @@ base_career_style_influencer_9B = "It Sim (Style Influencer / Trend Setter 9)" base_career_style_influencer_10B = "Icon O'Class (Style Influencer / Trend Setter 10)" # Tech Guru +base_career_tech_guru = "Tech Guru" base_career_tech_guru_2 = "Quality Assurance (Tech Guru 2)" base_career_tech_guru_3 = "Code Monkey (Tech Guru 3)" base_career_tech_guru_4 = "Ace Engineer (Tech Guru 4)" @@ -147,6 +157,7 @@ base_career_tech_guru_10B = "Start-up Genius (Tech Guru / Start-up Entrepreneur 10)" # Writer +base_career_writer = "Writer" base_career_writer_2 = "Blogger (Writer 2)" base_career_writer_3 = "Freelance Article Writer (Writer 3)" base_career_writer_4 = "Advice Columnist (Writer 4)" diff --git a/worlds/sims4/Options.py b/worlds/sims4/Options.py index ed44fee4931f..7863ae5c7f8b 100644 --- a/worlds/sims4/Options.py +++ b/worlds/sims4/Options.py @@ -2,6 +2,7 @@ from Options import Choice, PerGameCommonOptions, OptionSet, StartInventoryPool, Visibility +from .Names import CareerNames from .Names.DLC import ExpansionNames, GamePackNames, StuffNames, CASKitNames, BuildKitNames class AspirationGoal(Choice): @@ -29,21 +30,27 @@ class AspirationGoal(Choice): -class Career(Choice): - """The career that will be the only one included in the locations""" +class Career(OptionSet): + """The careers that will be included in the shuffling. + Valid Careers include: + - Astronaut + - Athlete + - Business + - Criminal + - Culinary + - Entertainer + - Painter + - Secret Agent + - Style Influencer + - Tech Guru + - Writer + Currently only Base Game Careers are supported. Part-Time Jobs are not yet able to be included in the shuffling.""" display_name = "career" - default = 1 - option_astronaut = 0 - option_athlete = 1 - option_business = 2 - option_criminal = 3 - option_culinary = 4 - option_entertainer = 5 - option_painter = 6 - option_secret_agent = 7 - option_style_influencer = 8 - option_tech_guru = 9 - option_writer = 10 + valid_keys = {CareerNames.base_career_astronaut, CareerNames.base_career_athlete, CareerNames.base_career_business, + CareerNames.base_career_criminal, CareerNames.base_career_culinary, CareerNames.base_career_entertainer, + CareerNames.base_career_painter, CareerNames.base_career_secret_agent, CareerNames.base_career_style_influencer, + CareerNames.base_career_tech_guru, CareerNames.base_career_writer} + default = sorted({CareerNames.base_career_athlete}) class ExpansionPacks(OptionSet): diff --git a/worlds/sims4/Rules.py b/worlds/sims4/Rules.py index 504893ef7715..6462f14ff5e6 100644 --- a/worlds/sims4/Rules.py +++ b/worlds/sims4/Rules.py @@ -25,7 +25,7 @@ def set_rules(sims4_world: Sims4World): # Career Rules # Athlete - if options.career.value == options.career.option_athlete: + if CareerNames.base_career_athlete in options.career: set_rule(world.get_location(CareerNames.base_career_athlete_4, player), lambda state: state.has(SkillNames.base_skill_charisma, player, count=1) and state.has(SkillNames.base_skill_fitness, player, count=1)) @@ -66,7 +66,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_charisma, player, count=6) and state.has(SkillNames.base_skill_fitness, player, count=8)) # Astronaut - elif options.career.value == options.career.option_astronaut: + if CareerNames.base_career_astronaut in options.career: set_rule(world.get_location(CareerNames.base_career_astronaut_4, player), lambda state: state.has(SkillNames.base_skill_logic, player, count=1)) set_rule(world.get_location(CareerNames.base_career_astronaut_5, player), @@ -95,7 +95,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_rocket_science, player, count=2) and state.has(SkillNames.base_skill_fitness, player, count=8)) # Business - elif options.career.value == options.career.option_business: + if CareerNames.base_career_business in options.career: set_rule(world.get_location(CareerNames.base_career_business_5, player), lambda state: state.has(SkillNames.base_skill_charisma, player, count=1)) set_rule(world.get_location(CareerNames.base_career_business_6, player), @@ -125,7 +125,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_charisma, player, count=6) and state.has(SkillNames.base_skill_logic, player, count=8)) # Criminal - elif options.career.value == options.career.option_criminal: + if CareerNames.base_career_criminal in options.career: set_rule(world.get_location(CareerNames.base_career_criminal_4, player), lambda state: state.has(SkillNames.base_skill_mischief, player, count=1)) set_rule(world.get_location(CareerNames.base_career_criminal_5, player), @@ -157,7 +157,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_mischief, player, count=8) and state.has(SkillNames.base_skill_programming, player, count=6)) # Culinary - elif options.career.value == options.career.option_culinary: + if CareerNames.base_career_culinary in options.career: set_rule(world.get_location(CareerNames.base_career_culinary_5, player), lambda state: state.has(SkillNames.base_skill_cooking, player, count=1) and state.has(SkillNames.base_skill_mixology, player, count=1)) @@ -200,7 +200,7 @@ def set_rules(sims4_world: Sims4World): and state.has(SkillNames.base_skill_charisma, player, count=6) and state.has(SkillNames.base_skill_cooking, player, count=2)) # Entertainer - elif options.career.value == options.career.option_entertainer: + if CareerNames.base_career_entertainer in options.career: set_rule(world.get_location(CareerNames.base_career_entertainer_5A, player), lambda state: (state.has(SkillNames.base_skill_guitar, player, count=1) or state.has(SkillNames.base_skill_violin, player, count=1)) @@ -241,7 +241,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_comedy, player, count=8) and state.has(SkillNames.base_skill_charisma, player, count=6)) # Painter - elif options.career.value == options.career.option_painter: + if CareerNames.base_career_painter in options.career: set_rule(world.get_location(CareerNames.base_career_painter_4, player), lambda state: state.has(SkillNames.base_skill_painting, player, count=2)) set_rule(world.get_location(CareerNames.base_career_painter_5, player), @@ -269,7 +269,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_painting, player, count=8) and state.has(SkillNames.base_skill_charisma, player, count=4)) # Secret Agent - elif options.career.value == options.career.option_secret_agent: + if CareerNames.base_career_secret_agent in options.career: set_rule(world.get_location(CareerNames.base_career_secret_agent_4, player), lambda state: state.has(SkillNames.base_skill_logic, player, count=1) and state.has(SkillNames.base_skill_charisma, player, count=1)) @@ -303,7 +303,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_logic, player, count=8) and state.has(SkillNames.base_skill_mischief, player, count=4)) # Style Influencer - elif options.career.value == options.career.option_style_influencer: + if CareerNames.base_career_style_influencer in options.career: set_rule(world.get_location(CareerNames.base_career_style_influencer_4, player), lambda state: state.has(SkillNames.base_skill_writing, player, count=1)) set_rule(world.get_location(CareerNames.base_career_style_influencer_5, player), @@ -351,7 +351,7 @@ def set_rules(sims4_world: Sims4World): and state.has(SkillNames.base_skill_charisma, player, count=6) and state.has(SkillNames.base_skill_painting, player, count=5)) # Tech Guru - elif options.career.value == options.career.option_tech_guru: + if CareerNames.base_career_tech_guru in options.career: set_rule(world.get_location(CareerNames.base_career_tech_guru_4, player), lambda state: state.has(SkillNames.base_skill_programming, player, count=1)) set_rule(world.get_location(CareerNames.base_career_tech_guru_5, player), @@ -385,7 +385,7 @@ def set_rules(sims4_world: Sims4World): lambda state: state.has(SkillNames.base_skill_programming, player, count=8) and state.has(SkillNames.base_skill_charisma, player, count=4)) # Writer - elif options.career.value == options.career.option_writer: + if CareerNames.base_career_writer in options.career: set_rule(world.get_location(CareerNames.base_career_writer_4, player), lambda state: state.has(SkillNames.base_skill_writing, player, count=1)) set_rule(world.get_location(CareerNames.base_career_writer_5, player), diff --git a/worlds/sims4/__init__.py b/worlds/sims4/__init__.py index dfabb0709454..aad5464cfc35 100644 --- a/worlds/sims4/__init__.py +++ b/worlds/sims4/__init__.py @@ -102,26 +102,18 @@ def create_event(self, event: str): return Sims4Item(event, ItemClassification.progression, None, self.player) def create_items(self) -> None: - career_key = self.options.career.current_key - aspiration_key = self.options.goal.current_key - pool = [] - count_to_fill = ( - len(sims4_careers[career_key]) + - len(sims4_aspiration_milestones[aspiration_key]) + - len(skill_locations_table) - ) + unfilled_locations = len(self.multiworld.get_unfilled_locations(self.player)) for item in item_table.values(): for i in range(item["count"]): sims4_item = self.create_item(item["name"]) pool.append(sims4_item) - count_to_fill = count_to_fill - len(pool) + filler_needed = unfilled_locations - len(pool) - for item_name in self.random.choices(sorted(filler_set), k=count_to_fill): + for item_name in self.random.choices(sorted(filler_set), k=filler_needed): item = self.create_item(item_name) - item.classification = item.classification pool.append(item) self.multiworld.itempool += pool @@ -140,11 +132,12 @@ def create_region(self, name: str, locations=None, exits=None): def create_regions(self): menu = self.create_region("Menu", locations=None, exits=None) - career_key = self.options.career.current_key + chosen_careers = sorted(self.options.career.value) aspiration_key = self.options.goal.current_key - for career in sims4_careers[career_key]: - menu.locations.append( - Sims4Location(self.player, career, self.location_name_to_id.get(career), menu)) + for career_key in chosen_careers: + for career in sims4_careers[career_key.lower().replace(" ", "_")]: + menu.locations.append( + Sims4Location(self.player, career, self.location_name_to_id.get(career), menu)) for aspiration in sims4_aspiration_milestones[aspiration_key]: menu.locations.append( Sims4Location(self.player, aspiration, self.location_name_to_id.get(aspiration), menu) @@ -163,9 +156,7 @@ def fill_slot_data(self) -> Mapping[str, Any]: # slot_data = self.options.as_dict("goal", "career", "expansion_packs", "game_packs", "stuff_packs", "cas_kits", "build_kits") slot_data = { "goal": self.options.goal.current_key, - "goal_value": self.options.goal.value, - "career": self.options.career.current_key, - "career_value": self.options.career.value, + "career": self.options.career.value, "expansion_packs": self.options.expansion_packs.value, "game_packs": self.options.game_packs.value, "stuff_packs": self.options.stuff_packs.value,