Skip to content

Commit

Permalink
Merge branch 'sc2-next' into feature/missionOrderLocationScouting
Browse files Browse the repository at this point in the history
  • Loading branch information
neocerber committed Dec 30, 2024
2 parents 2701f05 + b29b37c commit 0799ee9
Show file tree
Hide file tree
Showing 12 changed files with 498 additions and 148 deletions.
34 changes: 31 additions & 3 deletions worlds/sc2/docs/setup_en.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,40 @@ If the Progression Balancing of one world is greater than that of others, items
obtained early, and vice versa if its value is smaller.
However, StarCraft 2 is more permissive regarding the items that can be used to progress, so this option has little
influence on progression in a StarCraft 2 world.
StarCraft 2.
Since this option increases the time required to generate a MultiWorld, we recommend deactivating it (i.e., setting it
to zero) for a StarCraft 2 world.

#### What does Tactics Level do?

Tactics level allows controlling the difficulty through what items you're likely to get early.
This is independent of game difficulty like causal, normal, hard, or brutal.

"Standard" and "Advanced" levels are guaranteed to be beatable with the items you are given.
The logic is a little more restrictive than a player's creativity, so an advanced player is likely to have
more items than they need in any situation. These levels are entirely safe to use in a multiworld.

The "Any Units" level only guarantees that a minimum number of faction-appropriate units or buildings are reachable
early on, but not what those units are.
Before starting a build mission, the generator will guarantee that N units or buildings can be acquired before starting it,
where N is the number of missions the player needs to beat to access the mission, and the units belong to the faction
the player will play in the mission. For a linear order of missions, ordered [zerg, protoss, terran], a protoss unit
is guaranteed to be unlocked in the zerg mission, and 2 terran units are guaranteed to be unlocked
in the preceding 2 missions. This effect maxes out at 5 units guaranteed for each faction.

It's possible to get stuck on "Any Units" if the units can't attack,
like getting only medics and medivacs for the first 2 units, only getting units that take too long to build
for the missions at hand, or simply not having enough damage output.
Some safeguards exist to make sure terrain traversal, no-builds, and having something that can hit air objectives exists,
so a stuck world can be recovered by either setting the difficulty to casual with `/difficulty casual` in the client
or using cheat codes like `terribleterribledamage` in-game.
This logic option is likely to be beatable without cheats, but not guaranteed to be.
Thus, it is only safe to use in a multiworld if the player is willing to use cheats to get a world unstuck if
the situation calls for it, or uses settings like start inventory or mission exclusions to guarantee beatability.

The "No Logic" level provides no logical safeguards for beatability. It is only safe to use in a multiworld if the player curates
a start inventory or the organizer is okay with the possibility of the StarCraft 2 world being unbeatable.
Safeguards exist so that other games' items placed in the StarCraft 2 world are reachable under "Advanced" logic rules.

#### How do I specify items in a list, like in excluded items?

You can look up the syntax for yaml collections in the
Expand Down Expand Up @@ -102,8 +132,6 @@ for each game that it currently supports, including StarCraft 2.
You can also look up a complete list of the item names in the
[Icon Repository](https://matthewmarinets.github.io/ap_sc2_icons/) page.
This page also contains supplementary information of each item.
However, the items shown in that page might differ from those shown in the datapackage page of Archipelago since the
former is generated, most of the time, from beta versions of StarCraft 2 Archipelago undergoing development.

As for the locations, you can see all the locations associated to a mission in your world by placing your cursor over
the mission in the 'StarCraft 2 Launcher' tab in the client.
Expand Down
6 changes: 3 additions & 3 deletions worlds/sc2/item/item_descriptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -734,8 +734,8 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description:
item_names.INFESTED_BUNKER_ENGORGED_BUNKERS: "Infested Bunkers gain +2 cargo slots. Infested Trooper spawn cooldown is reduced by 20%.",
item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD: "Increases anti-mechanical damage of Infested Missile Turrets by +6 per missile.",
item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS: "Infested Missile Turrets gain a secondary weapon that applies Devourer Acid Spores in an area around the target.",
item_names.TYRANNOZOR_TYRANTS_PROTECTION: "Tyrannozors grants nearby friendly units 2 armor.",
item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: "Unleash a Barrage of Spikes, dealing 100 damage to enemy ground and air units around the Tyrannozor.",
item_names.TYRANNOZOR_TYRANTS_PROTECTION: "Tyrannozors grant nearby friendly units 2 armor.",
item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: _ability_desc("Tyrannozors", "Barrage of Spikes", "deals 100 damage to enemy ground and air units around the Tyrannozor"),
item_names.TYRANNOZOR_IMPALING_STRIKE: "Ultralisk and Tyrannozor melee attacks have a 20% chance to stun for 2 seconds.",
item_names.TYRANNOZOR_HEALING_ADAPTATION: "Ultralisks and Tyrannozors regenerate life quickly when out of combat.",
item_names.BILE_LAUNCHER_ARTILLERY_DUCTS: "Increases Bile Launcher range by +8.",
Expand Down Expand Up @@ -990,7 +990,7 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description:
item_names.ENERGIZER_RECLAMATION: _ability_desc("Energizers", "Reclamation", "temporarily takes control of an enemy mechanical unit. When the ability expires, the enemy unit self-destructs"),
item_names.ENERGIZER_FORGED_CHASSIS: "Increases Energizer Life by +20.",
item_names.HAVOC_DETECT_WEAKNESS: "Havocs' Target Lock gives an additional +15% damage bonus.",
item_names.HAVOC_BLOODSHARD_RESONANCE: "Havoc gain increased range for Squad Sight, Target Lock, and Force Field.",
item_names.HAVOC_BLOODSHARD_RESONANCE: "Havocs gain increased range for Squad Sight, Target Lock, and Force Field.",
item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: "Zealots, Sentinels, and Centurions gain increased movement speed.",
item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: "Zealots, Sentinels, and Centurions gain +30 maximum shields.",
item_names.ZEALOT_WHIRLWIND: "Zealot War Council upgrade. Gives Zealots the whirlwind ability, dealing damage in an area over 3 seconds.",
Expand Down
2 changes: 1 addition & 1 deletion worlds/sc2/item/item_names.py
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@
DAWNBRINGER_SOLARITE_LENS = "Solarite Lens (Dawnbringer)"
CARRIER_REPAIR_DRONES = "Repair Drones (Carrier)"
SKYLORD_HYPERJUMP = "Hyperjump (Skylord)"
TRIREME_SOLAR_BEAM = "Solar Beam (Trieme)"
TRIREME_SOLAR_BEAM = "Solar Beam (Trireme)"
TEMPEST_DISINTEGRATION = "Disintegration (Tempest)"
# Scout
ARBITER_ABILITY_EFFICIENCY = "Ability Efficiency (Arbiter)"
Expand Down
21 changes: 11 additions & 10 deletions worlds/sc2/item/item_tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -655,7 +655,7 @@ def get_full_item_list():
classification=ItemClassification.progression, parent=item_names.LIBERATOR),
item_names.WIDOW_MINE_DRILLING_CLAWS:
ItemData(328 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 9, SC2Race.TERRAN,
classification=ItemClassification.filler, parent=item_names.WIDOW_MINE),
parent=item_names.WIDOW_MINE),
item_names.WIDOW_MINE_CONCEALMENT:
ItemData(329 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 10, SC2Race.TERRAN,
classification=ItemClassification.progression, parent=item_names.WIDOW_MINE),
Expand Down Expand Up @@ -917,7 +917,8 @@ def get_full_item_list():
ItemData(512 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 12, SC2Race.TERRAN,
classification=ItemClassification.progression),
item_names.JOTUN:
ItemData(513 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 13, SC2Race.TERRAN),
ItemData(513 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 13, SC2Race.TERRAN,
classification=ItemClassification.progression),

item_names.ULTRA_CAPACITORS:
ItemData(600 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 0, SC2Race.TERRAN),
Expand Down Expand Up @@ -1674,7 +1675,7 @@ def get_full_item_list():
classification=ItemClassification.progression),
item_names.SUPPLICANT:
ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 12, SC2Race.PROTOSS,
classification=ItemClassification.filler, important_for_filtering=True),
classification=ItemClassification.progression),
item_names.INSTIGATOR:
ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 13, SC2Race.PROTOSS,
classification=ItemClassification.progression),
Expand Down Expand Up @@ -1891,7 +1892,7 @@ def get_full_item_list():
item_names.ARCHON_POWER_SIPHON: ItemData(392 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 2, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE),
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.SUPPLICANT_ZENITH_PITCH: ItemData(395 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 5, SC2Race.PROTOSS, parent=item_names.SUPPLICANT, classification=ItemClassification.progression),

# 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),
Expand All @@ -1916,7 +1917,7 @@ def get_full_item_list():
item_names.IMMORTAL_IMPROVED_BARRIER: ItemData(519 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 19, SC2Race.PROTOSS, parent=item_names.IMMORTAL),
item_names.VANGUARD_RAPIDFIRE_CANNON: ItemData(520 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.VANGUARD),
item_names.VANGUARD_FUSION_MORTARS: ItemData(521 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 21, SC2Race.PROTOSS, parent=item_names.VANGUARD),
item_names.ANNIHILATOR_AERIAL_TRACKING: ItemData(522 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 22, SC2Race.PROTOSS, parent=item_names.ANNIHILATOR),
item_names.ANNIHILATOR_AERIAL_TRACKING: ItemData(522 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 22, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ANNIHILATOR),
item_names.STALWART_ARC_INDUCERS: ItemData(523 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 23, SC2Race.PROTOSS, parent=item_names.STALWART),
item_names.COLOSSUS_FIRE_LANCE: ItemData(524 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 24, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.COLOSSUS),
item_names.WRATHWALKER_AERIAL_TRACKING: ItemData(525 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.WRATHWALKER),
Expand All @@ -1943,17 +1944,17 @@ def get_full_item_list():

# SoA Calldown powers
item_names.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 0, SC2Race.PROTOSS),
item_names.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 0, SC2Race.PROTOSS, quantity=2),
item_names.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 1, SC2Race.PROTOSS),
item_names.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 2, SC2Race.PROTOSS),
item_names.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 0, SC2Race.PROTOSS, quantity=2, classification=ItemClassification.progression),
item_names.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 1, SC2Race.PROTOSS, classification=ItemClassification.progression),
item_names.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 2, SC2Race.PROTOSS, classification=ItemClassification.progression),
item_names.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 3, SC2Race.PROTOSS),
item_names.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 4, SC2Race.PROTOSS, classification=ItemClassification.progression),
item_names.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 5, SC2Race.PROTOSS),
item_names.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 6, SC2Race.PROTOSS),
item_names.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 7, SC2Race.PROTOSS, classification=ItemClassification.progression),
item_names.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 8, SC2Race.PROTOSS),
item_names.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 8, SC2Race.PROTOSS, classification=ItemClassification.progression),
item_names.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 9, SC2Race.PROTOSS, classification=ItemClassification.progression),
item_names.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 10, SC2Race.PROTOSS),
item_names.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 10, SC2Race.PROTOSS, classification=ItemClassification.progression),

# Generic Protoss Upgrades
item_names.MATRIX_OVERLOAD:
Expand Down
Loading

0 comments on commit 0799ee9

Please sign in to comment.