SC2: Fix Terran global upgrades present even if no Terran build missions are rolled (#5452)
* Fix Terran global upgrades present even if no Terran build missions are rolled * Code cleanup
This commit is contained in:
@@ -468,7 +468,8 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte
|
|||||||
|
|
||||||
for item in item_list:
|
for item in item_list:
|
||||||
# Catch-all for all of a faction's items
|
# Catch-all for all of a faction's items
|
||||||
if not terran_missions and item.data.race == SC2Race.TERRAN:
|
# Unit upgrades required for no-builds will get the FilterExcluded lifted when flagging AllowedOrphan
|
||||||
|
if not terran_build_missions and item.data.race == SC2Race.TERRAN:
|
||||||
if item.name not in item_groups.nova_equipment:
|
if item.name not in item_groups.nova_equipment:
|
||||||
item.flags |= ItemFilterFlags.FilterExcluded
|
item.flags |= ItemFilterFlags.FilterExcluded
|
||||||
continue
|
continue
|
||||||
@@ -483,10 +484,6 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
# Faction units
|
# Faction units
|
||||||
if (not terran_build_missions
|
|
||||||
and item.data.type in (item_tables.TerranItemType.Unit, item_tables.TerranItemType.Building, item_tables.TerranItemType.Mercenary)
|
|
||||||
):
|
|
||||||
item.flags |= ItemFilterFlags.FilterExcluded
|
|
||||||
if (not zerg_build_missions
|
if (not zerg_build_missions
|
||||||
and item.data.type in (item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Evolution_Pit)
|
and item.data.type in (item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Evolution_Pit)
|
||||||
):
|
):
|
||||||
@@ -661,6 +658,7 @@ def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> N
|
|||||||
item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MARINE_LASER_TARGETING_SYSTEM,
|
item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MARINE_LASER_TARGETING_SYSTEM,
|
||||||
):
|
):
|
||||||
item.flags |= ItemFilterFlags.AllowedOrphan
|
item.flags |= ItemFilterFlags.AllowedOrphan
|
||||||
|
item.flags &= ~ItemFilterFlags.FilterExcluded
|
||||||
# These rules only trigger on Standard tactics
|
# These rules only trigger on Standard tactics
|
||||||
if SC2Mission.BELLY_OF_THE_BEAST in missions and world.options.required_tactics == RequiredTactics.option_standard:
|
if SC2Mission.BELLY_OF_THE_BEAST in missions and world.options.required_tactics == RequiredTactics.option_standard:
|
||||||
for item in item_list:
|
for item in item_list:
|
||||||
@@ -670,6 +668,7 @@ def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> N
|
|||||||
item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_JUGGERNAUT_PLATING, item_names.FIREBAT_PROGRESSIVE_STIMPACK
|
item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_JUGGERNAUT_PLATING, item_names.FIREBAT_PROGRESSIVE_STIMPACK
|
||||||
):
|
):
|
||||||
item.flags |= ItemFilterFlags.AllowedOrphan
|
item.flags |= ItemFilterFlags.AllowedOrphan
|
||||||
|
item.flags &= ~ItemFilterFlags.FilterExcluded
|
||||||
if SC2Mission.EVIL_AWOKEN in missions and world.options.required_tactics == RequiredTactics.option_standard:
|
if SC2Mission.EVIL_AWOKEN in missions and world.options.required_tactics == RequiredTactics.option_standard:
|
||||||
for item in item_list:
|
for item in item_list:
|
||||||
if item.name in (item_names.STALKER_PHASE_REACTOR, item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION):
|
if item.name in (item_names.STALKER_PHASE_REACTOR, item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION):
|
||||||
|
|||||||
@@ -6,9 +6,14 @@ from .test_base import Sc2SetupTestBase
|
|||||||
from .. import get_all_missions, mission_tables, options
|
from .. import get_all_missions, mission_tables, options
|
||||||
from ..item import item_groups, item_tables, item_names
|
from ..item import item_groups, item_tables, item_names
|
||||||
from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag
|
from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag
|
||||||
from ..options import EnabledCampaigns, MasteryLocations, MissionOrder, EnableRaceSwapVariants, ShuffleCampaigns, \
|
from ..options import (
|
||||||
ShuffleNoBuild, StarterUnit, RequiredTactics, KerriganPresence, KerriganLevelItemDistribution, GrantStoryTech, \
|
EnabledCampaigns, MasteryLocations, MissionOrder, EnableRaceSwapVariants, ShuffleCampaigns,
|
||||||
GrantStoryLevels
|
ShuffleNoBuild, StarterUnit, RequiredTactics, KerriganPresence, KerriganLevelItemDistribution, GrantStoryTech,
|
||||||
|
GrantStoryLevels, BasebustLocations, ChallengeLocations, DifficultyCurve, EnableMorphling, ExcludeOverpoweredItems,
|
||||||
|
ExcludeVeryHardMissions, ExtraLocations, GenericUpgradeItems, GenericUpgradeResearch, GenericUpgradeResearchSpeedup,
|
||||||
|
KerriganPrimalStatus, KeyMode, MissionOrderScouting, EnableMissionRaceBalancing,
|
||||||
|
NovaGhostOfAChanceVariant, PreventativeLocations, SpeedrunLocations, TakeOverAIAllies, VanillaItemsOnly
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestSupportedUseCases(Sc2SetupTestBase):
|
class TestSupportedUseCases(Sc2SetupTestBase):
|
||||||
@@ -500,6 +505,69 @@ class TestSupportedUseCases(Sc2SetupTestBase):
|
|||||||
self.assertTupleEqual(terran_nonmerc_units, ())
|
self.assertTupleEqual(terran_nonmerc_units, ())
|
||||||
self.assertTupleEqual(zerg_nonmerc_units, ())
|
self.assertTupleEqual(zerg_nonmerc_units, ())
|
||||||
|
|
||||||
|
def test_zerg_hots_no_terran_items(self) -> None:
|
||||||
|
# The actual situation the bug got caught
|
||||||
|
world_options = {
|
||||||
|
'basebust_locations': BasebustLocations.option_enabled,
|
||||||
|
'challenge_locations': ChallengeLocations.option_enabled,
|
||||||
|
'difficulty_curve': DifficultyCurve.option_standard,
|
||||||
|
'enable_morphling': EnableMorphling.option_false,
|
||||||
|
'enable_race_swap': EnableRaceSwapVariants.option_disabled,
|
||||||
|
'enabled_campaigns': [SC2Campaign.HOTS.campaign_name],
|
||||||
|
'ensure_generic_items': 25,
|
||||||
|
'exclude_overpowered_items': ExcludeOverpoweredItems.option_false,
|
||||||
|
'exclude_very_hard_missions': ExcludeVeryHardMissions.option_default,
|
||||||
|
'excluded_missions': [
|
||||||
|
SC2Mission.SUPREME.mission_name
|
||||||
|
],
|
||||||
|
'extra_locations': ExtraLocations.option_enabled,
|
||||||
|
'generic_upgrade_items': GenericUpgradeItems.option_individual_items,
|
||||||
|
'generic_upgrade_missions': 0,
|
||||||
|
'generic_upgrade_research': GenericUpgradeResearch.option_auto_in_no_build,
|
||||||
|
'generic_upgrade_research_speedup': GenericUpgradeResearchSpeedup.option_false,
|
||||||
|
'grant_story_levels': GrantStoryLevels.option_disabled,
|
||||||
|
'grant_story_tech': GrantStoryTech.option_no_grant,
|
||||||
|
'kerrigan_level_item_distribution': KerriganLevelItemDistribution.option_size_14,
|
||||||
|
'kerrigan_level_item_sum': 86,
|
||||||
|
'kerrigan_levels_per_mission_completed': 0,
|
||||||
|
'kerrigan_levels_per_mission_completed_cap': -1,
|
||||||
|
'kerrigan_max_active_abilities': 12,
|
||||||
|
'kerrigan_max_passive_abilities': 5,
|
||||||
|
'kerrigan_presence': KerriganPresence.option_vanilla,
|
||||||
|
'kerrigan_primal_status': KerriganPrimalStatus.option_vanilla,
|
||||||
|
'kerrigan_total_level_cap': -1,
|
||||||
|
'key_mode': KeyMode.option_progressive_questlines,
|
||||||
|
'mastery_locations': MasteryLocations.option_disabled,
|
||||||
|
'max_number_of_upgrades': -1,
|
||||||
|
'max_upgrade_level': 4,
|
||||||
|
'maximum_campaign_size': 40,
|
||||||
|
'min_number_of_upgrades': 2,
|
||||||
|
'mission_order': MissionOrder.option_mini_campaign,
|
||||||
|
'mission_order_scouting': MissionOrderScouting.option_none,
|
||||||
|
'mission_race_balancing': EnableMissionRaceBalancing.option_semi_balanced,
|
||||||
|
'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_wol,
|
||||||
|
'preventative_locations': PreventativeLocations.option_enabled,
|
||||||
|
'required_tactics': RequiredTactics.option_standard,
|
||||||
|
'shuffle_campaigns': ShuffleCampaigns.option_true,
|
||||||
|
'shuffle_no_build': ShuffleNoBuild.option_true,
|
||||||
|
'speedrun_locations': SpeedrunLocations.option_disabled,
|
||||||
|
'start_primary_abilities': 0,
|
||||||
|
'starter_unit': StarterUnit.option_balanced,
|
||||||
|
'starting_supply_per_item': 2,
|
||||||
|
'take_over_ai_allies': TakeOverAIAllies.option_false,
|
||||||
|
'vanilla_items_only': VanillaItemsOnly.option_false,
|
||||||
|
'victory_cache': 0,
|
||||||
|
}
|
||||||
|
self.generate_world(world_options)
|
||||||
|
|
||||||
|
world_item_names = [item.name for item in self.multiworld.itempool]
|
||||||
|
|
||||||
|
self.assertNotIn(item_names.COMMAND_CENTER_SCANNER_SWEEP, world_item_names)
|
||||||
|
self.assertNotIn(item_names.COMMAND_CENTER_EXTRA_SUPPLIES, world_item_names)
|
||||||
|
self.assertNotIn(item_names.ULTRA_CAPACITORS, world_item_names)
|
||||||
|
self.assertNotIn(item_names.ORBITAL_DEPOTS, world_item_names)
|
||||||
|
self.assertNotIn(item_names.DOMINION_TROOPER, world_item_names)
|
||||||
|
|
||||||
def test_all_kerrigan_missions_are_nobuild_and_grant_story_tech_is_on(self) -> None:
|
def test_all_kerrigan_missions_are_nobuild_and_grant_story_tech_is_on(self) -> None:
|
||||||
# The actual situation the bug got caught
|
# The actual situation the bug got caught
|
||||||
world_options = {
|
world_options = {
|
||||||
|
|||||||
Reference in New Issue
Block a user