From 4536339739dbff82312fd27e8bdbaf74ea532dac Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Mon, 23 Dec 2024 21:07:53 +0100 Subject: [PATCH] Add Skylancer, redesign Skylord --- worlds/sc2/item/item_descriptions.py | 11 +++++++---- worlds/sc2/item/item_groups.py | 10 +++++----- worlds/sc2/item/item_names.py | 9 ++++++--- worlds/sc2/item/item_parents.py | 4 ++++ worlds/sc2/item/item_tables.py | 13 +++++++++---- worlds/sc2/item/parent_names.py | 1 + worlds/sc2/rules.py | 14 +++++++------- 7 files changed, 39 insertions(+), 23 deletions(-) diff --git a/worlds/sc2/item/item_descriptions.py b/worlds/sc2/item/item_descriptions.py index a62f414c7463..d7bdb890bf75 100644 --- a/worlds/sc2/item/item_descriptions.py +++ b/worlds/sc2/item/item_descriptions.py @@ -882,8 +882,9 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: item_names.MOTHERSHIP: "Ultimate Protoss vessel. Can use the Vortex and Mass Recall abilities.", item_names.ARBITER: "Army support craft. Has the Stasis Field and Recall abilities. Cloaks nearby units.", item_names.ORACLE: "Flying caster. Can use the Revelation and Stasis Ward abilities.", - item_names.SKYLORD: "Capital ship. Fires a powerful laser that deals damage in a line. Can use Tactical Jump ability.", + item_names.SKYLORD: "Capital ship. Builds and launches Interceptor that attack enemy targets. Has fewer interceptors those are exceptionally good vs air targets. Can use Tactical Jump ability.", item_names.TRIREME: "Capital ship. Builds and launches Bombers that attack enemy targets.", + item_names.SKYLANCER: "Capital ship. Fires a powerful laser that deals damage in a line.", item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", PROTOSS, "ground units"), item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", PROTOSS, "ground units"), item_names.PROGRESSIVE_PROTOSS_SHIELDS: GENERIC_UPGRADE_TEMPLATE.format("shields", PROTOSS, "units"), @@ -915,10 +916,12 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: item_names.SCOUT_GRAVITIC_THRUSTERS: "Scouts gain increased movement speed.", item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: "Scouts gain increased damage against ground targets.", item_names.SCOUT_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SCOUT), - item_names.TEMPEST_TECTONIC_DESTABILIZERS: "Tempests deal increased damage to buildings.", - item_names.TEMPEST_QUANTIC_REACTOR: "Tempests deal increased damage to massive units.", + item_names.TEMPEST_SKYLANCER_TECTONIC_DESTABILIZERS: "Tempests deal increased damage to buildings.", + item_names.TEMPEST_SKYLANCER_QUANTIC_REACTOR: "Tempests deal increased damage to massive units.", item_names.TEMPEST_GRAVITY_SLING: "Tempests gain +8 range against air targets and +8 cast range.", item_names.TEMPEST_INTERPLANETARY_RANGE: "Tempests gain +8 weapon range against all targets.", + item_names.SKYLANCER_BLINK: "Allows Skylancers to teleport over a short distance.", + item_names.SKYLANCER_CAPACITOR_OVERCHARGE: "Doubles Skylancer's attack speed. However, while attacking overheats, and reduces its attack speed back to the original value.", item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: "Increases Phoenix, Mirage, and Skirmisher weapon damage by +2.", item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: "Increases Phoenix, Mirage, and Skirmiser range by +2.", item_names.CORSAIR_STEALTH_DRIVE: "Corsairs become permanently cloaked.", @@ -934,7 +937,7 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: item_names.ARBITER_SPACETIME_ANCHOR: "Allows Arbiters to use an alternate version of Stasis Field which lasts 50 seconds longer.", item_names.ARBITER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.ARBITER), item_names.ARBITER_ENHANCED_CLOAK_FIELD: "Increases Arbiter Cloaking Field range.", - item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: "Carriers and Triremes can launch Interceptors and Bombers more quickly.", + item_names.CARRIER_SKYLORD_TRIREME_GRAVITON_CATAPULT: "Carriers and Triremes can launch Interceptors and Bombers more quickly.", item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: "Carrier-class ships gain +2 armour.", item_names.VOID_RAY_DESTROYER_WARP_RAY_DAWNBRINGER_FLUX_VANES: "Increases movement speed of Void Ray variants.", item_names.DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES: "Dawnbringers take reduced damage from non-spell ground sources.", diff --git a/worlds/sc2/item/item_groups.py b/worlds/sc2/item/item_groups.py index 223dc884046d..efeec6d78cd9 100644 --- a/worlds/sc2/item/item_groups.py +++ b/worlds/sc2/item/item_groups.py @@ -641,8 +641,8 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, item_names.SKIRMISHER, item_names.VOID_RAY, item_names.DESTROYER, item_names.WARP_RAY, item_names.DAWNBRINGER, item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, - item_names.SCOUT, item_names.TEMPEST, item_names.MOTHERSHIP, - item_names.ARBITER, item_names.ORACLE, + item_names.SCOUT, item_names.TEMPEST, item_names.SKYLANCER, + item_names.ARBITER, item_names.ORACLE, item_names.MOTHERSHIP, ] item_name_groups[ItemGroupNames.PROTOSS_GENERIC_UPGRADES] = protoss_generic_upgrades = [ item_name for item_name, item_data in item_tables.item_table.items() @@ -686,8 +686,8 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.PHOENIX, item_names.SKIRMISHER, item_names.MIRAGE, item_names.CORSAIR, item_names.VOID_RAY, item_names.DESTROYER, item_names.WARP_RAY, item_names.DAWNBRINGER, item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, - item_names.TEMPEST, item_names.SCOUT, item_names.MOTHERSHIP, - item_names.ARBITER, item_names.ORACLE, + item_names.TEMPEST, item_names.SCOUT, item_names.SKYLANCER, + item_names.ARBITER, item_names.ORACLE, item_names.MOTHERSHIP, ] item_name_groups[ItemGroupNames.PROTOSS_BUILDINGS] = protoss_buildings = [ item_name for item_name, item_data in item_tables.item_table.items() @@ -706,7 +706,7 @@ def get_all_group_names(cls) -> typing.Set[str]: item_name_groups[ItemGroupNames.TAL_DARIM_UNITS] = [ item_names.SUPPLICANT, item_names.SLAYER, item_names.HAVOC, item_names.BLOOD_HUNTER, item_names.ASCENDANT, item_names.VANGUARD, item_names.WRATHWALKER, - item_names.SKIRMISHER, item_names.DESTROYER, item_names.SKYLORD, item_names.MOTHERSHIP, + item_names.SKIRMISHER, item_names.DESTROYER, item_names.SKYLORD, item_names.SKYLANCER, item_names.MOTHERSHIP, ] item_name_groups[ItemGroupNames.PURIFIER_UNITS] = [ item_names.SENTINEL, item_names.ADEPT, item_names.INSTIGATOR, item_names.ENERGIZER, diff --git a/worlds/sc2/item/item_names.py b/worlds/sc2/item/item_names.py index 9d9d41c3e829..6af0ea5b4bcd 100644 --- a/worlds/sc2/item/item_names.py +++ b/worlds/sc2/item/item_names.py @@ -670,6 +670,7 @@ DAWNBRINGER = "Dawnbringer" SCOUT = "Scout" TEMPEST = "Tempest" +SKYLANCER = "Skylancer" MOTHERSHIP = "Mothership" ARBITER = "Arbiter" ORACLE = "Oracle" @@ -713,10 +714,11 @@ SCOUT_GRAVITIC_THRUSTERS = "Gravitic Thrusters (Scout)" SCOUT_ADVANCED_PHOTON_BLASTERS = "Advanced Photon Blasters (Scout)" SCOUT_RESOURCE_EFFICIENCY = "Resource Efficiency (Scout)" -TEMPEST_TECTONIC_DESTABILIZERS = "Tectonic Destabilizers (Tempest)" -TEMPEST_QUANTIC_REACTOR = "Quantic Reactor (Tempest)" +TEMPEST_SKYLANCER_TECTONIC_DESTABILIZERS = "Tectonic Destabilizers (Tempest/Skylancer)" +TEMPEST_SKYLANCER_QUANTIC_REACTOR = "Quantic Reactor (Tempest/Skylancer)" TEMPEST_GRAVITY_SLING = "Gravity Sling (Tempest)" TEMPEST_INTERPLANETARY_RANGE = "Interplanetary Range (Tempest)" +SKYLANCER_BLINK = "Blink (Skylancer)" PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX = "Ionic Wavelength Flux (Phoenix/Mirage/Skirmisher)" PHOENIX_CLASS_ANION_PULSE_CRYSTALS = "Anion Pulse-Crystals (Phoenix/Mirage/Skirmisher)" CORSAIR_STEALTH_DRIVE = "Stealth Drive (Corsair)" @@ -732,7 +734,7 @@ ARBITER_SPACETIME_ANCHOR = "Spacetime Anchor (Arbiter)" ARBITER_RESOURCE_EFFICIENCY = "Resource Efficiency (Arbiter)" ARBITER_ENHANCED_CLOAK_FIELD = "Enhanced Cloak Field (Arbiter)" -CARRIER_TRIREME_GRAVITON_CATAPULT = "Graviton Catapult (Carrier/Trireme)" +CARRIER_SKYLORD_TRIREME_GRAVITON_CATAPULT = "Graviton Catapult (Carrier/Skylord/Trireme)" CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES = "Hull of Past Glories (Carrier/Skylord/Trireme)" VOID_RAY_DESTROYER_WARP_RAY_DAWNBRINGER_FLUX_VANES = "Flux Vanes (Void Ray/Destroyer/Warp Ray/Dawnbringer)" DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES = "Anti-Surface Countermeasures (Dawnbringer)" @@ -835,6 +837,7 @@ SKYLORD_HYPERJUMP = "Hyperjump (Skylord)" TRIREME_SOLAR_BEAM = "Solar Beam (Trieme)" TEMPEST_DISINTEGRATION = "Disintegration (Tempest)" +SKYLANCER_CAPACITOR_OVERCHARGE = "Capacitor Overcharge (Skylancer)" # Scout ARBITER_ABILITY_EFFICIENCY = "Ability Efficiency (Arbiter)" # Oracle diff --git a/worlds/sc2/item/item_parents.py b/worlds/sc2/item/item_parents.py index 87072f9aa476..2cbb5ef14212 100644 --- a/worlds/sc2/item/item_parents.py +++ b/worlds/sc2/item/item_parents.py @@ -161,6 +161,10 @@ def parent_items(self) -> List[str]: (item_names.CARRIER, item_names.TRIREME, item_names.SKYLORD), main_item=item_names.CARRIER, ) +parent_present[parent_names.TEMPEST_CLASS] = AnyOf( + (item_names.TEMPEST, item_names.SKYLANCER), + main_item=item_names.TEMPEST, +) parent_present[parent_names.CARRIER_OR_TRIREME] = AnyOf( (item_names.CARRIER, item_names.TRIREME), main_item=item_names.CARRIER, diff --git a/worlds/sc2/item/item_tables.py b/worlds/sc2/item/item_tables.py index 3d4613f6c924..cb9b37d85703 100644 --- a/worlds/sc2/item/item_tables.py +++ b/worlds/sc2/item/item_tables.py @@ -1770,6 +1770,9 @@ def get_full_item_list(): item_names.SKIRMISHER: ItemData(35 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 14, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SKYLANCER: + ItemData(36 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 15, SC2Race.PROTOSS, + classification=ItemClassification.progression), # Protoss Upgrades item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), @@ -1806,8 +1809,8 @@ def get_full_item_list(): item_names.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 13, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=item_names.SCOUT), item_names.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 14, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=item_names.SCOUT), item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 15, SC2Race.PROTOSS, parent=item_names.SCOUT), - item_names.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 16, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=item_names.TEMPEST), - item_names.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 17, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=item_names.TEMPEST), + item_names.TEMPEST_SKYLANCER_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 16, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=parent_names.TEMPEST_CLASS), + item_names.TEMPEST_SKYLANCER_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 17, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=parent_names.TEMPEST_CLASS), item_names.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 18, SC2Race.PROTOSS, parent=item_names.TEMPEST), item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 19, SC2Race.PROTOSS, parent=parent_names.PHOENIX_CLASS), item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 20, SC2Race.PROTOSS, parent=parent_names.PHOENIX_CLASS), @@ -1823,8 +1826,8 @@ def get_full_item_list(): item_names.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 0, SC2Race.PROTOSS, parent=item_names.ARBITER), item_names.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 1, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=item_names.ARBITER), item_names.ARBITER_ENHANCED_CLOAK_FIELD: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 2, SC2Race.PROTOSS, classification=ItemClassification.filler, parent=item_names.ARBITER), - item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: - ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 3, SC2Race.PROTOSS, parent=parent_names.CARRIER_OR_TRIREME), + item_names.CARRIER_SKYLORD_TRIREME_GRAVITON_CATAPULT: + ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 3, SC2Race.PROTOSS, parent=parent_names.CARRIER_CLASS), item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 4, SC2Race.PROTOSS, parent=parent_names.CARRIER_CLASS), item_names.VOID_RAY_DESTROYER_WARP_RAY_DAWNBRINGER_FLUX_VANES: @@ -1892,6 +1895,7 @@ def get_full_item_list(): item_names.ARCHON_ERADICATE: ItemData(393 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 3, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), item_names.ARCHON_OBLITERATE: ItemData(394 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 4, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), item_names.SUPPLICANT_ZENITH_PITCH: ItemData(395 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 5, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + item_names.SKYLANCER_BLINK: ItemData(396 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 6, SC2Race.PROTOSS, parent=item_names.SKYLANCER), # War Council item_names.ZEALOT_WHIRLWIND: ItemData(500 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ZEALOT), @@ -1940,6 +1944,7 @@ def get_full_item_list(): item_names.ARBITER_ABILITY_EFFICIENCY: ItemData(543 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 13, SC2Race.PROTOSS, parent=item_names.ARBITER), # 544 reserved for Oracle item_names.MOTHERSHIP_INTEGRATED_POWER: ItemData(545 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 15, SC2Race.PROTOSS, parent=item_names.MOTHERSHIP), + item_names.SKYLANCER_CAPACITOR_OVERCHARGE: ItemData(546 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 16, SC2Race.PROTOSS, parent=item_names.SKYLANCER), # SoA Calldown powers item_names.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 0, SC2Race.PROTOSS), diff --git a/worlds/sc2/item/parent_names.py b/worlds/sc2/item/parent_names.py index 5d257c3212af..c54e03c6a2f7 100644 --- a/worlds/sc2/item/parent_names.py +++ b/worlds/sc2/item/parent_names.py @@ -34,6 +34,7 @@ # Protoss ARCHON_SOURCE = "Any Archon Source" +TEMPEST_CLASS = "Tempest Class" CARRIER_CLASS = "Carrier Class" CARRIER_OR_TRIREME = "Carrier | Trireme" DARK_ARCHON_SOURCE = "Dark Archon Source" diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py index 69c6c7d825b0..c72de53f1af7 100644 --- a/worlds/sc2/rules.py +++ b/worlds/sc2/rules.py @@ -776,7 +776,7 @@ def all_in_p_requirement(self, state: CollectionState): defense_rating >= 9 and beats_kerrigan and self.protoss_anti_light_anti_air(state) and state.has_any( - {item_names.TEMPEST, item_names.SKYLORD, item_names.VOID_RAY}, + {item_names.TEMPEST, item_names.SKYLANCER, item_names.VOID_RAY}, self.player) ) @@ -1336,7 +1336,7 @@ def protoss_basic_anti_air(self, state: CollectionState) -> bool: return ( self.protoss_competent_anti_air(state) or state.has_any({ - item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, item_names.CARRIER, item_names.SKYLORD, + item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, item_names.CARRIER, item_names.SCOUT, item_names.DARK_ARCHON, item_names.MOTHERSHIP }, self.player) or state.has_all({item_names.TRIREME, item_names.TRIREME_SOLAR_BEAM}, self.player) @@ -1378,7 +1378,7 @@ def protoss_competent_anti_air(self, state: CollectionState) -> bool: return ( state.has_any({ item_names.STALKER, item_names.SLAYER, item_names.INSTIGATOR, item_names.DRAGOON, item_names.ADEPT, - item_names.VOID_RAY, item_names.DESTROYER, item_names.TEMPEST, item_names.SKYLORD, + item_names.VOID_RAY, item_names.DESTROYER, item_names.TEMPEST, item_names.SKYLORD, item_names.SKYLANCER, }, self.player) or (( state.has_any({ @@ -1410,7 +1410,7 @@ def protoss_has_blink(self, state: CollectionState) -> bool: def protoss_can_attack_behind_chasm(self, state: CollectionState) -> bool: return ( state.has_any({ - item_names.SCOUT, item_names.TEMPEST, + item_names.SCOUT, item_names.TEMPEST, item_names.SKYLANCER, item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, item_names.VOID_RAY, item_names.DESTROYER, item_names.WARP_RAY, item_names.DAWNBRINGER, item_names.MOTHERSHIP, @@ -1431,7 +1431,7 @@ def protoss_respond_to_colony_infestations(self, state: CollectionState) -> bool and self.protoss_competent_anti_air(state) and ( state.has_any({ - item_names.CARRIER, item_names.SKYLORD, + item_names.CARRIER, item_names.SKYLORD, item_names.SKYLANCER, }, self.player) # handle mutas or (state.has_any({ @@ -1452,8 +1452,8 @@ def protoss_respond_to_colony_infestations(self, state: CollectionState) -> bool def protoss_fleet(self, state: CollectionState) -> bool: return state.has_any({ - item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, item_names.TEMPEST, item_names.VOID_RAY, - item_names.DESTROYER, item_names.WARP_RAY, item_names.DAWNBRINGER + item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, item_names.TEMPEST, item_names.SKYLANCER, + item_names.VOID_RAY, item_names.DESTROYER, item_names.WARP_RAY, item_names.DAWNBRINGER }, self.player) def templars_return_phase_2_requirement(self, state: CollectionState) -> bool: