SC2 WoL - Mod, Item and Location update (#2113)
Migrates SC2 WoL world to the new mod with new items and locations. The new mod has a different architecture making it more future proof (with planned adding of other campaigns). Also gets rid of several old bugs Adds new short game formats intended for sync games (Tiny Grid, Mini Gauntlet). The final mission isn't decided by campaign length anymore but it's configurable instead. Allow excluding missions for Vanilla Shuffled, corrected some documentation. NOTE: This is a squashed commit with Salz' HotS excluded (not ready for the release and I plan multi-campaign instead) --------- Co-authored-by: Matthew <matthew.marinets@gmail.com>
1050
Starcraft2Client.py
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 6.5 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 8.3 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 8.3 KiB |
After Width: | Height: | Size: 6.6 KiB |
After Width: | Height: | Size: 8.0 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 9.6 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 8.2 KiB |
After Width: | Height: | Size: 7.9 KiB |
After Width: | Height: | Size: 7.5 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 12 KiB |
|
@ -9,7 +9,7 @@
|
|||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
padding: 3px 3px 10px;
|
||||
width: 500px;
|
||||
width: 710px;
|
||||
background-color: #525494;
|
||||
}
|
||||
|
||||
|
@ -34,10 +34,12 @@
|
|||
max-height: 40px;
|
||||
border: 1px solid #000000;
|
||||
filter: grayscale(100%) contrast(75%) brightness(20%);
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
#inventory-table img.acquired{
|
||||
filter: none;
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
#inventory-table div.counted-item {
|
||||
|
@ -52,7 +54,7 @@
|
|||
}
|
||||
|
||||
#location-table{
|
||||
width: 500px;
|
||||
width: 710px;
|
||||
border-left: 2px solid #000000;
|
||||
border-right: 2px solid #000000;
|
||||
border-bottom: 2px solid #000000;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<div id="player-tracker-wrapper" data-tracker="{{ room.tracker|suuid }}">
|
||||
<table id="inventory-table">
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td colspan="15" class="title">
|
||||
Starting Resources
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -26,7 +26,7 @@
|
|||
-->
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td colspan="15" class="title">
|
||||
Weapon & Armor Upgrades
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -37,120 +37,266 @@
|
|||
<td><img src="{{ vehicle_armor_url }}" class="{{ 'acquired' if 'Progressive Vehicle Armor' in acquired_items }}" title="Progressive Vehicle Armor{% if vehicle_armor_level > 0 %} (Level {{ vehicle_armor_level }}){% endif %}" /></td>
|
||||
<td><img src="{{ ship_weapon_url }}" class="{{ 'acquired' if 'Progressive Ship Weapon' in acquired_items }}" title="Progressive Ship Weapons{% if ship_weapon_level > 0 %} (Level {{ ship_weapon_level }}){% endif %}" /></td>
|
||||
<td><img src="{{ ship_armor_url }}" class="{{ 'acquired' if 'Progressive Ship Armor' in acquired_items }}" title="Progressive Ship Armor{% if ship_armor_level > 0 %} (Level {{ ship_armor_level }}){% endif %}" /></td>
|
||||
<td colspan="2"></td>
|
||||
<td><img src="{{ icons['Ultra-Capacitors'] }}" class="{{ 'acquired' if 'Ultra-Capacitors' in acquired_items }}" title="Ultra-Capacitors" /></td>
|
||||
<td><img src="{{ icons['Vanadium Plating'] }}" class="{{ 'acquired' if 'Vanadium Plating' in acquired_items }}" title="Vanadium Plating" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td colspan="15" class="title">
|
||||
Base
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"><img src="{{ icons['Bunker'] }}" class="{{ 'acquired' if 'Bunker' in acquired_items }}" title="Bunker" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Missile Turret'] }}" class="{{ 'acquired' if 'Missile Turret' in acquired_items }}" title="Missile Turret" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Sensor Tower'] }}" class="{{ 'acquired' if 'Sensor Tower' in acquired_items }}" title="Sensor Tower" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Bunker'] }}" class="{{ 'acquired' if 'Bunker' in acquired_items }}" title="Bunker" /></td>
|
||||
<td><img src="{{ icons['Projectile Accelerator (Bunker)'] }}" class="{{ 'acquired' if 'Projectile Accelerator (Bunker)' in acquired_items }}" title="Projectile Accelerator (Bunker)" /></td>
|
||||
<td><img src="{{ icons['Neosteel Bunker (Bunker)'] }}" class="{{ 'acquired' if 'Neosteel Bunker (Bunker)' in acquired_items }}" title="Neosteel Bunker (Bunker)" /></td>
|
||||
<td><img src="{{ icons['Shrike Turret (Bunker)'] }}" class="{{ 'acquired' if 'Shrike Turret (Bunker)' in acquired_items }}" title="Shrike Turret (Bunker)" /></td>
|
||||
<td><img src="{{ icons['Fortified Bunker (Bunker)'] }}" class="{{ 'acquired' if 'Fortified Bunker (Bunker)' in acquired_items }}" title="Fortified Bunker (Bunker)" /></td>
|
||||
<td colspan="3"></td>
|
||||
<td><img src="{{ icons['Missile Turret'] }}" class="{{ 'acquired' if 'Missile Turret' in acquired_items }}" title="Missile Turret" /></td>
|
||||
<td><img src="{{ icons['Titanium Housing (Missile Turret)'] }}" class="{{ 'acquired' if 'Titanium Housing (Missile Turret)' in acquired_items }}" title="Titanium Housing (Missile Turret)" /></td>
|
||||
<td><img src="{{ icons['Hellstorm Batteries (Missile Turret)'] }}" class="{{ 'acquired' if 'Hellstorm Batteries (Missile Turret)' in acquired_items }}" title="Hellstorm Batteries (Missile Turret)" /></td>
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Orbital Command (Building)'] }}" class="{{ 'acquired' if 'Orbital Command (Building)' in acquired_items }}" title="Orbital Command (Building)" /></td>
|
||||
<td><img src="{{ icons['Command Center Reactor'] }}" class="{{ 'acquired' if 'Command Center Reactor' in acquired_items }}" title="Command Center Reactor" /></td>
|
||||
<td><img src="{{ icons['Planetary Fortress'] }}" class="{{ 'acquired' if 'Planetary Fortress' in acquired_items }}" title="Planetary Fortress" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Advanced Construction (SCV)'] }}" class="{{ 'acquired' if 'Advanced Construction (SCV)' in acquired_items }}" title="Advanced Construction (SCV)" /></td>
|
||||
<td><img src="{{ icons['Dual-Fusion Welders (SCV)'] }}" class="{{ 'acquired' if 'Dual-Fusion Welders (SCV)' in acquired_items }}" title="Dual-Fusion Welders (SCV)" /></td>
|
||||
<td><img src="{{ icons['Fire-Suppression System (Building)'] }}" class="{{ 'acquired' if 'Fire-Suppression System (Building)' in acquired_items }}" title="Fire-Suppression System (Building)" /></td>
|
||||
<td><img src="{{ icons['Orbital Command (Building)'] }}" class="{{ 'acquired' if 'Orbital Command (Building)' in acquired_items }}" title="Orbital Command (Building)" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Micro-Filtering'] }}" class="{{ 'acquired' if 'Micro-Filtering' in acquired_items }}" title="Micro-Filtering" /></td>
|
||||
<td><img src="{{ icons['Automated Refinery'] }}" class="{{ 'acquired' if 'Automated Refinery' in acquired_items }}" title="Automated Refinery" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Tech Reactor'] }}" class="{{ 'acquired' if 'Tech Reactor' in acquired_items }}" title="Tech Reactor" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Orbital Depots'] }}" class="{{ 'acquired' if 'Orbital Depots' in acquired_items }}" title="Orbital Depots" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td><img src="{{ icons['Sensor Tower'] }}" class="{{ 'acquired' if 'Sensor Tower' in acquired_items }}" title="Sensor Tower" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Perdition Turret'] }}" class="{{ 'acquired' if 'Perdition Turret' in acquired_items }}" title="Perdition Turret" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Hive Mind Emulator'] }}" class="{{ 'acquired' if 'Hive Mind Emulator' in acquired_items }}" title="Hive Mind Emulator" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Psi Disrupter'] }}" class="{{ 'acquired' if 'Psi Disrupter' in acquired_items }}" title="Psi Disrupter" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" class="title">
|
||||
Infantry
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"><img src="{{ icons['Marine'] }}" class="{{ 'acquired' if 'Marine' in acquired_items }}" title="Marine" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Medic'] }}" class="{{ 'acquired' if 'Medic' in acquired_items }}" title="Medic" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Firebat'] }}" class="{{ 'acquired' if 'Firebat' in acquired_items }}" title="Firebat" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Marauder'] }}" class="{{ 'acquired' if 'Marauder' in acquired_items }}" title="Marauder" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Reaper'] }}" class="{{ 'acquired' if 'Reaper' in acquired_items }}" title="Reaper" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Stimpack (Marine)'] }}" class="{{ 'acquired' if 'Stimpack (Marine)' in acquired_items }}" title="Stimpack (Marine)" /></td>
|
||||
<td><img src="{{ icons['Combat Shield (Marine)'] }}" class="{{ 'acquired' if 'Combat Shield (Marine)' in acquired_items }}" title="Combat Shield (Marine)" /></td>
|
||||
<td><img src="{{ icons['Advanced Medic Facilities (Medic)'] }}" class="{{ 'acquired' if 'Advanced Medic Facilities (Medic)' in acquired_items }}" title="Advanced Medic Facilities (Medic)" /></td>
|
||||
<td><img src="{{ icons['Stabilizer Medpacks (Medic)'] }}" class="{{ 'acquired' if 'Stabilizer Medpacks (Medic)' in acquired_items }}" title="Stabilizer Medpacks (Medic)" /></td>
|
||||
<td><img src="{{ icons['Incinerator Gauntlets (Firebat)'] }}" class="{{ 'acquired' if 'Incinerator Gauntlets (Firebat)' in acquired_items }}" title="Incinerator Gauntlets (Firebat)" /></td>
|
||||
<td><img src="{{ icons['Juggernaut Plating (Firebat)'] }}" class="{{ 'acquired' if 'Juggernaut Plating (Firebat)' in acquired_items }}" title="Juggernaut Plating (Firebat)" /></td>
|
||||
<td><img src="{{ icons['Concussive Shells (Marauder)'] }}" class="{{ 'acquired' if 'Concussive Shells (Marauder)' in acquired_items }}" title="Concussive Shells (Marauder)" /></td>
|
||||
<td><img src="{{ icons['Kinetic Foam (Marauder)'] }}" class="{{ 'acquired' if 'Kinetic Foam (Marauder)' in acquired_items }}" title="Kinetic Foam (Marauder)" /></td>
|
||||
<td><img src="{{ icons['U-238 Rounds (Reaper)'] }}" class="{{ 'acquired' if 'U-238 Rounds (Reaper)' in acquired_items }}" title="U-238 Rounds (Reaper)" /></td>
|
||||
<td><img src="{{ icons['G-4 Clusterbomb (Reaper)'] }}" class="{{ 'acquired' if 'G-4 Clusterbomb (Reaper)' in acquired_items }}" title="G-4 Clusterbomb (Reaper)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td></td>
|
||||
<td colspan="7" class="title">
|
||||
Vehicles
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"><img src="{{ icons['Hellion'] }}" class="{{ 'acquired' if 'Hellion' in acquired_items }}" title="Hellion" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Vulture'] }}" class="{{ 'acquired' if 'Vulture' in acquired_items }}" title="Vulture" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Goliath'] }}" class="{{ 'acquired' if 'Goliath' in acquired_items }}" title="Goliath" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Diamondback'] }}" class="{{ 'acquired' if 'Diamondback' in acquired_items }}" title="Diamondback" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Siege Tank'] }}" class="{{ 'acquired' if 'Siege Tank' in acquired_items }}" title="Siege Tank" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Marine'] }}" class="{{ 'acquired' if 'Marine' in acquired_items }}" title="Marine" /></td>
|
||||
<td><img src="{{ stimpack_marine_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Marine)' in acquired_items }}" title="{{ stimpack_marine_name }}" /></td>
|
||||
<td><img src="{{ icons['Combat Shield (Marine)'] }}" class="{{ 'acquired' if 'Combat Shield (Marine)' in acquired_items }}" title="Combat Shield (Marine)" /></td>
|
||||
<td><img src="{{ icons['Laser Targeting System (Marine)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Marine)' in acquired_items }}" title="Laser Targeting System (Marine)" /></td>
|
||||
<td><img src="{{ icons['Magrail Munitions (Marine)'] }}" class="{{ 'acquired' if 'Magrail Munitions (Marine)' in acquired_items }}" title="Magrail Munitions (Marine)" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Marine)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Marine)' in acquired_items }}" title="Optimized Logistics (Marine)" /></td>
|
||||
<td colspan="2"></td>
|
||||
<td><img src="{{ icons['Hellion'] }}" class="{{ 'acquired' if 'Hellion' in acquired_items }}" title="Hellion" /></td>
|
||||
<td><img src="{{ icons['Twin-Linked Flamethrower (Hellion)'] }}" class="{{ 'acquired' if 'Twin-Linked Flamethrower (Hellion)' in acquired_items }}" title="Twin-Linked Flamethrower (Hellion)" /></td>
|
||||
<td><img src="{{ icons['Thermite Filaments (Hellion)'] }}" class="{{ 'acquired' if 'Thermite Filaments (Hellion)' in acquired_items }}" title="Thermite Filaments (Hellion)" /></td>
|
||||
<td><img src="{{ icons['Cerberus Mine (Vulture)'] }}" class="{{ 'acquired' if 'Cerberus Mine (Vulture)' in acquired_items }}" title="Cerberus Mine (Vulture)" /></td>
|
||||
<td><img src="{{ icons['Replenishable Magazine (Vulture)'] }}" class="{{ 'acquired' if 'Replenishable Magazine (Vulture)' in acquired_items }}" title="Replenishable Magazine (Vulture)" /></td>
|
||||
<td><img src="{{ icons['Multi-Lock Weapons System (Goliath)'] }}" class="{{ 'acquired' if 'Multi-Lock Weapons System (Goliath)' in acquired_items }}" title="Multi-Lock Weapons System (Goliath)" /></td>
|
||||
<td><img src="{{ icons['Ares-Class Targeting System (Goliath)'] }}" class="{{ 'acquired' if 'Ares-Class Targeting System (Goliath)' in acquired_items }}" title="Ares-Class Targeting System (Goliath)" /></td>
|
||||
<td><img src="{{ icons['Tri-Lithium Power Cell (Diamondback)'] }}" class="{{ 'acquired' if 'Tri-Lithium Power Cell (Diamondback)' in acquired_items }}" title="Tri-Lithium Power Cell (Diamondback)" /></td>
|
||||
<td><img src="{{ icons['Shaped Hull (Diamondback)'] }}" class="{{ 'acquired' if 'Shaped Hull (Diamondback)' in acquired_items }}" title="Shaped Hull (Diamondback)" /></td>
|
||||
<td><img src="{{ icons['Maelstrom Rounds (Siege Tank)'] }}" class="{{ 'acquired' if 'Maelstrom Rounds (Siege Tank)' in acquired_items }}" title="Maelstrom Rounds (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Shaped Blast (Siege Tank)'] }}" class="{{ 'acquired' if 'Shaped Blast (Siege Tank)' in acquired_items }}" title="Shaped Blast (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Hellbat Aspect (Hellion)'] }}" class="{{ 'acquired' if 'Hellbat Aspect (Hellion)' in acquired_items }}" title="Hellbat Aspect (Hellion)" /></td>
|
||||
<td><img src="{{ icons['Smart Servos (Hellion)'] }}" class="{{ 'acquired' if 'Smart Servos (Hellion)' in acquired_items }}" title="Smart Servos (Hellion)" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Hellion)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Hellion)' in acquired_items }}" title="Optimized Logistics (Hellion)" /></td>
|
||||
<td><img src="{{ icons['Jump Jets (Hellion)'] }}" class="{{ 'acquired' if 'Jump Jets (Hellion)' in acquired_items }}" title="Jump Jets (Hellion)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td><img src="{{ icons['Medic'] }}" class="{{ 'acquired' if 'Medic' in acquired_items }}" title="Medic" /></td>
|
||||
<td><img src="{{ icons['Advanced Medic Facilities (Medic)'] }}" class="{{ 'acquired' if 'Advanced Medic Facilities (Medic)' in acquired_items }}" title="Advanced Medic Facilities (Medic)" /></td>
|
||||
<td><img src="{{ icons['Stabilizer Medpacks (Medic)'] }}" class="{{ 'acquired' if 'Stabilizer Medpacks (Medic)' in acquired_items }}" title="Stabilizer Medpacks (Medic)" /></td>
|
||||
<td><img src="{{ icons['Restoration (Medic)'] }}" class="{{ 'acquired' if 'Restoration (Medic)' in acquired_items }}" title="Restoration (Medic)" /></td>
|
||||
<td><img src="{{ icons['Optical Flare (Medic)'] }}" class="{{ 'acquired' if 'Optical Flare (Medic)' in acquired_items }}" title="Optical Flare (Medic)" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Medic)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Medic)' in acquired_items }}" title="Optimized Logistics (Medic)" /></td>
|
||||
<td colspan="2"></td>
|
||||
<td></td>
|
||||
<td><img src="{{ stimpack_hellion_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Hellion)' in acquired_items }}" title="{{ stimpack_hellion_name }}" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Firebat'] }}" class="{{ 'acquired' if 'Firebat' in acquired_items }}" title="Firebat" /></td>
|
||||
<td><img src="{{ icons['Incinerator Gauntlets (Firebat)'] }}" class="{{ 'acquired' if 'Incinerator Gauntlets (Firebat)' in acquired_items }}" title="Incinerator Gauntlets (Firebat)" /></td>
|
||||
<td><img src="{{ icons['Juggernaut Plating (Firebat)'] }}" class="{{ 'acquired' if 'Juggernaut Plating (Firebat)' in acquired_items }}" title="Juggernaut Plating (Firebat)" /></td>
|
||||
<td><img src="{{ stimpack_firebat_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Firebat)' in acquired_items }}" title="{{ stimpack_firebat_name }}" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Firebat)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Firebat)' in acquired_items }}" title="Optimized Logistics (Firebat)" /></td>
|
||||
<td colspan="3"></td>
|
||||
<td><img src="{{ icons['Vulture'] }}" class="{{ 'acquired' if 'Vulture' in acquired_items }}" title="Vulture" /></td>
|
||||
<td><img src="{{ icons['Replenishable Magazine (Vulture)'] }}" class="{{ 'acquired' if 'Replenishable Magazine (Vulture)' in acquired_items }}" title="Replenishable Magazine (Vulture)" /></td>
|
||||
<td><img src="{{ icons['Ion Thrusters (Vulture)'] }}" class="{{ 'acquired' if 'Ion Thrusters (Vulture)' in acquired_items }}" title="Ion Thrusters (Vulture)" /></td>
|
||||
<td><img src="{{ icons['Auto Launchers (Vulture)'] }}" class="{{ 'acquired' if 'Auto Launchers (Vulture)' in acquired_items }}" title="Auto Launchers (Vulture)" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Cerberus Mine (Spider Mine)'] }}" class="{{ 'acquired' if 'Cerberus Mine (Spider Mine)' in acquired_items }}" title="Cerberus Mine (Spider Mine)" /></td>
|
||||
<td><img src="{{ icons['High Explosive Munition (Spider Mine)'] }}" class="{{ 'acquired' if 'High Explosive Munition (Spider Mine)' in acquired_items }}" title="High Explosive Munition (Spider Mine)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Marauder'] }}" class="{{ 'acquired' if 'Marauder' in acquired_items }}" title="Marauder" /></td>
|
||||
<td><img src="{{ icons['Concussive Shells (Marauder)'] }}" class="{{ 'acquired' if 'Concussive Shells (Marauder)' in acquired_items }}" title="Concussive Shells (Marauder)" /></td>
|
||||
<td><img src="{{ icons['Kinetic Foam (Marauder)'] }}" class="{{ 'acquired' if 'Kinetic Foam (Marauder)' in acquired_items }}" title="Kinetic Foam (Marauder)" /></td>
|
||||
<td><img src="{{ stimpack_marauder_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Marauder)' in acquired_items }}" title="{{ stimpack_marauder_name }}" /></td>
|
||||
<td><img src="{{ icons['Laser Targeting System (Marauder)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Marauder)' in acquired_items }}" title="Laser Targeting System (Marauder)" /></td>
|
||||
<td><img src="{{ icons['Magrail Munitions (Marauder)'] }}" class="{{ 'acquired' if 'Magrail Munitions (Marauder)' in acquired_items }}" title="Magrail Munitions (Marauder)" /></td>
|
||||
<td><img src="{{ icons['Internal Tech Module (Marauder)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Marauder)' in acquired_items }}" title="Internal Tech Module (Marauder)" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Goliath'] }}" class="{{ 'acquired' if 'Goliath' in acquired_items }}" title="Goliath" /></td>
|
||||
<td><img src="{{ icons['Multi-Lock Weapons System (Goliath)'] }}" class="{{ 'acquired' if 'Multi-Lock Weapons System (Goliath)' in acquired_items }}" title="Multi-Lock Weapons System (Goliath)" /></td>
|
||||
<td><img src="{{ icons['Ares-Class Targeting System (Goliath)'] }}" class="{{ 'acquired' if 'Ares-Class Targeting System (Goliath)' in acquired_items }}" title="Ares-Class Targeting System (Goliath)" /></td>
|
||||
<td><img src="{{ icons['Jump Jets (Goliath)'] }}" class="{{ 'acquired' if 'Jump Jets (Goliath)' in acquired_items }}" title="Jump Jets (Goliath)" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Goliath)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Goliath)' in acquired_items }}" title="Optimized Logistics (Goliath)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Reaper'] }}" class="{{ 'acquired' if 'Reaper' in acquired_items }}" title="Reaper" /></td>
|
||||
<td><img src="{{ icons['U-238 Rounds (Reaper)'] }}" class="{{ 'acquired' if 'U-238 Rounds (Reaper)' in acquired_items }}" title="U-238 Rounds (Reaper)" /></td>
|
||||
<td><img src="{{ icons['G-4 Clusterbomb (Reaper)'] }}" class="{{ 'acquired' if 'G-4 Clusterbomb (Reaper)' in acquired_items }}" title="G-4 Clusterbomb (Reaper)" /></td>
|
||||
<td><img src="{{ stimpack_reaper_url }}" class="{{ 'acquired' if 'Progressive Stimpack (Reaper)' in acquired_items }}" title="{{ stimpack_reaper_name }}" /></td>
|
||||
<td><img src="{{ icons['Laser Targeting System (Reaper)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Reaper)' in acquired_items }}" title="Laser Targeting System (Reaper)" /></td>
|
||||
<td><img src="{{ icons['Advanced Cloaking Field (Reaper)'] }}" class="{{ 'acquired' if 'Advanced Cloaking Field (Reaper)' in acquired_items }}" title="Advanced Cloaking Field (Reaper)" /></td>
|
||||
<td><img src="{{ icons['Spider Mines (Reaper)'] }}" class="{{ 'acquired' if 'Spider Mines (Reaper)' in acquired_items }}" title="Spider Mines (Reaper)" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Diamondback'] }}" class="{{ 'acquired' if 'Diamondback' in acquired_items }}" title="Diamondback" /></td>
|
||||
<td><img src="{{ icons['Tri-Lithium Power Cell (Diamondback)'] }}" class="{{ 'acquired' if 'Tri-Lithium Power Cell (Diamondback)' in acquired_items }}" title="Tri-Lithium Power Cell (Diamondback)" /></td>
|
||||
<td><img src="{{ icons['Shaped Hull (Diamondback)'] }}" class="{{ 'acquired' if 'Shaped Hull (Diamondback)' in acquired_items }}" title="Shaped Hull (Diamondback)" /></td>
|
||||
<td><img src="{{ icons['Hyperfluxor (Diamondback)'] }}" class="{{ 'acquired' if 'Hyperfluxor (Diamondback)' in acquired_items }}" title="Hyperfluxor (Diamondback)" /></td>
|
||||
<td><img src="{{ icons['Burst Capacitors (Diamondback)'] }}" class="{{ 'acquired' if 'Burst Capacitors (Diamondback)' in acquired_items }}" title="Burst Capacitors (Diamondback)" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Diamondback)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Diamondback)' in acquired_items }}" title="Optimized Logistics (Diamondback)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Combat Drugs (Reaper)'] }}" class="{{ 'acquired' if 'Combat Drugs (Reaper)' in acquired_items }}" title="Combat Drugs (Reaper)" /></td>
|
||||
<td colspan="6"></td>
|
||||
<td><img src="{{ icons['Siege Tank'] }}" class="{{ 'acquired' if 'Siege Tank' in acquired_items }}" title="Siege Tank" /></td>
|
||||
<td><img src="{{ icons['Maelstrom Rounds (Siege Tank)'] }}" class="{{ 'acquired' if 'Maelstrom Rounds (Siege Tank)' in acquired_items }}" title="Maelstrom Rounds (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Shaped Blast (Siege Tank)'] }}" class="{{ 'acquired' if 'Shaped Blast (Siege Tank)' in acquired_items }}" title="Shaped Blast (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Jump Jets (Siege Tank)'] }}" class="{{ 'acquired' if 'Jump Jets (Siege Tank)' in acquired_items }}" title="Jump Jets (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Spider Mines (Siege Tank)'] }}" class="{{ 'acquired' if 'Spider Mines (Siege Tank)' in acquired_items }}" title="Spider Mines (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Smart Servos (Siege Tank)'] }}" class="{{ 'acquired' if 'Smart Servos (Siege Tank)' in acquired_items }}" title="Smart Servos (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Graduating Range (Siege Tank)'] }}" class="{{ 'acquired' if 'Graduating Range (Siege Tank)' in acquired_items }}" title="Graduating Range (Siege Tank)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Ghost'] }}" class="{{ 'acquired' if 'Ghost' in acquired_items }}" title="Ghost" /></td>
|
||||
<td><img src="{{ icons['Ocular Implants (Ghost)'] }}" class="{{ 'acquired' if 'Ocular Implants (Ghost)' in acquired_items }}" title="Ocular Implants (Ghost)" /></td>
|
||||
<td><img src="{{ icons['Crius Suit (Ghost)'] }}" class="{{ 'acquired' if 'Crius Suit (Ghost)' in acquired_items }}" title="Crius Suit (Ghost)" /></td>
|
||||
<td><img src="{{ icons['EMP Rounds (Ghost)'] }}" class="{{ 'acquired' if 'EMP Rounds (Ghost)' in acquired_items }}" title="EMP Rounds (Ghost)" /></td>
|
||||
<td><img src="{{ icons['Lockdown (Ghost)'] }}" class="{{ 'acquired' if 'Lockdown (Ghost)' in acquired_items }}" title="Lockdown (Ghost)" /></td>
|
||||
<td colspan="3"></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Laser Targeting System (Siege Tank)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Siege Tank)' in acquired_items }}" title="Laser Targeting System (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Advanced Siege Tech (Siege Tank)'] }}" class="{{ 'acquired' if 'Advanced Siege Tech (Siege Tank)' in acquired_items }}" title="Advanced Siege Tech (Siege Tank)" /></td>
|
||||
<td><img src="{{ icons['Internal Tech Module (Siege Tank)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Siege Tank)' in acquired_items }}" title="Internal Tech Module (Siege Tank)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Spectre'] }}" class="{{ 'acquired' if 'Spectre' in acquired_items }}" title="Spectre" /></td>
|
||||
<td><img src="{{ icons['Psionic Lash (Spectre)'] }}" class="{{ 'acquired' if 'Psionic Lash (Spectre)' in acquired_items }}" title="Psionic Lash (Spectre)" /></td>
|
||||
<td><img src="{{ icons['Nyx-Class Cloaking Module (Spectre)'] }}" class="{{ 'acquired' if 'Nyx-Class Cloaking Module (Spectre)' in acquired_items }}" title="Nyx-Class Cloaking Module (Spectre)" /></td>
|
||||
<td><img src="{{ icons['Impaler Rounds (Spectre)'] }}" class="{{ 'acquired' if 'Impaler Rounds (Spectre)' in acquired_items }}" title="Impaler Rounds (Spectre)" /></td>
|
||||
<td colspan="4"></td>
|
||||
<td><img src="{{ icons['Thor'] }}" class="{{ 'acquired' if 'Thor' in acquired_items }}" title="Thor" /></td>
|
||||
<td><img src="{{ icons['330mm Barrage Cannon (Thor)'] }}" class="{{ 'acquired' if '330mm Barrage Cannon (Thor)' in acquired_items }}" title="330mm Barrage Cannon (Thor)" /></td>
|
||||
<td><img src="{{ icons['Immortality Protocol (Thor)'] }}" class="{{ 'acquired' if 'Immortality Protocol (Thor)' in acquired_items }}" title="Immortality Protocol (Thor)" /></td>
|
||||
<td><img src="{{ high_impact_payload_thor_url }}" class="{{ 'acquired' if 'Progressive High Impact Payload (Thor)' in acquired_items }}" title="{{ high_impact_payload_thor_name }}" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8"></td>
|
||||
<td><img src="{{ icons['Predator'] }}" class="{{ 'acquired' if 'Predator' in acquired_items }}" title="Predator" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Predator)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Predator)' in acquired_items }}" title="Optimized Logistics (Predator)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8"></td>
|
||||
<td><img src="{{ icons['Widow Mine'] }}" class="{{ 'acquired' if 'Widow Mine' in acquired_items }}" title="Widow Mine" /></td>
|
||||
<td><img src="{{ icons['Drilling Claws (Widow Mine)'] }}" class="{{ 'acquired' if 'Drilling Claws (Widow Mine)' in acquired_items }}" title="Drilling Claws (Widow Mine)" /></td>
|
||||
<td><img src="{{ icons['Concealment (Widow Mine)'] }}" class="{{ 'acquired' if 'Concealment (Widow Mine)' in acquired_items }}" title="Concealment (Widow Mine)" /></td>
|
||||
<td><img src="{{ icons['Black Market Launchers (Widow Mine)'] }}" class="{{ 'acquired' if 'Black Market Launchers (Widow Mine)' in acquired_items }}" title="Black Market Launchers (Widow Mine)" /></td>
|
||||
<td><img src="{{ icons['Executioner Missiles (Widow Mine)'] }}" class="{{ 'acquired' if 'Executioner Missiles (Widow Mine)' in acquired_items }}" title="Executioner Missiles (Widow Mine)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8"></td>
|
||||
<td><img src="{{ icons['Cyclone'] }}" class="{{ 'acquired' if 'Cyclone' in acquired_items }}" title="Cyclone" /></td>
|
||||
<td><img src="{{ icons['Mag-Field Accelerators (Cyclone)'] }}" class="{{ 'acquired' if 'Mag-Field Accelerators (Cyclone)' in acquired_items }}" title="Mag-Field Accelerators (Cyclone)" /></td>
|
||||
<td><img src="{{ icons['Mag-Field Launchers (Cyclone)'] }}" class="{{ 'acquired' if 'Mag-Field Launchers (Cyclone)' in acquired_items }}" title="Mag-Field Launchers (Cyclone)" /></td>
|
||||
<td><img src="{{ icons['Targeting Optics (Cyclone)'] }}" class="{{ 'acquired' if 'Targeting Optics (Cyclone)' in acquired_items }}" title="Targeting Optics (Cyclone)" /></td>
|
||||
<td><img src="{{ icons['Rapid Fire Launchers (Cyclone)'] }}" class="{{ 'acquired' if 'Rapid Fire Launchers (Cyclone)' in acquired_items }}" title="Rapid Fire Launchers (Cyclone)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="15" class="title">
|
||||
Starships
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"><img src="{{ icons['Medivac'] }}" class="{{ 'acquired' if 'Medivac' in acquired_items }}" title="Medivac" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Wraith'] }}" class="{{ 'acquired' if 'Wraith' in acquired_items }}" title="Wraith" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Viking'] }}" class="{{ 'acquired' if 'Viking' in acquired_items }}" title="Viking" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Banshee'] }}" class="{{ 'acquired' if 'Banshee' in acquired_items }}" title="Banshee" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Battlecruiser'] }}" class="{{ 'acquired' if 'Battlecruiser' in acquired_items }}" title="Battlecruiser" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Medivac'] }}" class="{{ 'acquired' if 'Medivac' in acquired_items }}" title="Medivac" /></td>
|
||||
<td><img src="{{ icons['Rapid Deployment Tube (Medivac)'] }}" class="{{ 'acquired' if 'Rapid Deployment Tube (Medivac)' in acquired_items }}" title="Rapid Deployment Tube (Medivac)" /></td>
|
||||
<td><img src="{{ icons['Advanced Healing AI (Medivac)'] }}" class="{{ 'acquired' if 'Advanced Healing AI (Medivac)' in acquired_items }}" title="Advanced Healing AI (Medivac)" /></td>
|
||||
<td><img src="{{ icons['Expanded Hull (Medivac)'] }}" class="{{ 'acquired' if 'Expanded Hull (Medivac)' in acquired_items }}" title="Expanded Hull (Medivac)" /></td>
|
||||
<td><img src="{{ icons['Afterburners (Medivac)'] }}" class="{{ 'acquired' if 'Afterburners (Medivac)' in acquired_items }}" title="Afterburners (Medivac)" /></td>
|
||||
<td colspan="3"></td>
|
||||
<td><img src="{{ icons['Raven'] }}" class="{{ 'acquired' if 'Raven' in acquired_items }}" title="Raven" /></td>
|
||||
<td><img src="{{ icons['Bio Mechanical Repair Drone (Raven)'] }}" class="{{ 'acquired' if 'Bio Mechanical Repair Drone (Raven)' in acquired_items }}" title="Bio Mechanical Repair Drone (Raven)" /></td>
|
||||
<td><img src="{{ icons['Spider Mines (Raven)'] }}" class="{{ 'acquired' if 'Spider Mines (Raven)' in acquired_items }}" title="Spider Mines (Raven)" /></td>
|
||||
<td><img src="{{ icons['Railgun Turret (Raven)'] }}" class="{{ 'acquired' if 'Railgun Turret (Raven)' in acquired_items }}" title="Railgun Turret (Raven)" /></td>
|
||||
<td><img src="{{ icons['Hunter-Seeker Weapon (Raven)'] }}" class="{{ 'acquired' if 'Hunter-Seeker Weapon (Raven)' in acquired_items }}" title="Hunter-Seeker Weapon (Raven)" /></td>
|
||||
<td><img src="{{ icons['Interference Matrix (Raven)'] }}" class="{{ 'acquired' if 'Interference Matrix (Raven)' in acquired_items }}" title="Interference Matrix (Raven)" /></td>
|
||||
<td><img src="{{ icons['Anti-Armor Missile (Raven)'] }}" class="{{ 'acquired' if 'Anti-Armor Missile (Raven)' in acquired_items }}" title="Anti-Armor Missile (Raven)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Wraith'] }}" class="{{ 'acquired' if 'Wraith' in acquired_items }}" title="Wraith" /></td>
|
||||
<td><img src="{{ icons['Tomahawk Power Cells (Wraith)'] }}" class="{{ 'acquired' if 'Tomahawk Power Cells (Wraith)' in acquired_items }}" title="Tomahawk Power Cells (Wraith)" /></td>
|
||||
<td><img src="{{ icons['Displacement Field (Wraith)'] }}" class="{{ 'acquired' if 'Displacement Field (Wraith)' in acquired_items }}" title="Displacement Field (Wraith)" /></td>
|
||||
<td><img src="{{ icons['Advanced Laser Technology (Wraith)'] }}" class="{{ 'acquired' if 'Advanced Laser Technology (Wraith)' in acquired_items }}" title="Advanced Laser Technology (Wraith)" /></td>
|
||||
<td colspan="4"></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Internal Tech Module (Raven)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Raven)' in acquired_items }}" title="Internal Tech Module (Raven)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Viking'] }}" class="{{ 'acquired' if 'Viking' in acquired_items }}" title="Viking" /></td>
|
||||
<td><img src="{{ icons['Ripwave Missiles (Viking)'] }}" class="{{ 'acquired' if 'Ripwave Missiles (Viking)' in acquired_items }}" title="Ripwave Missiles (Viking)" /></td>
|
||||
<td><img src="{{ icons['Phobos-Class Weapons System (Viking)'] }}" class="{{ 'acquired' if 'Phobos-Class Weapons System (Viking)' in acquired_items }}" title="Phobos-Class Weapons System (Viking)" /></td>
|
||||
<td><img src="{{ icons['Cross-Spectrum Dampeners (Banshee)'] }}" class="{{ 'acquired' if 'Cross-Spectrum Dampeners (Banshee)' in acquired_items }}" title="Cross-Spectrum Dampeners (Banshee)" /></td>
|
||||
<td><img src="{{ icons['Smart Servos (Viking)'] }}" class="{{ 'acquired' if 'Smart Servos (Viking)' in acquired_items }}" title="Smart Servos (Viking)" /></td>
|
||||
<td><img src="{{ icons['Magrail Munitions (Viking)'] }}" class="{{ 'acquired' if 'Magrail Munitions (Viking)' in acquired_items }}" title="Magrail Munitions (Viking)" /></td>
|
||||
<td colspan="3"></td>
|
||||
<td><img src="{{ icons['Science Vessel'] }}" class="{{ 'acquired' if 'Science Vessel' in acquired_items }}" title="Science Vessel" /></td>
|
||||
<td><img src="{{ icons['EMP Shockwave (Science Vessel)'] }}" class="{{ 'acquired' if 'EMP Shockwave (Science Vessel)' in acquired_items }}" title="EMP Shockwave (Science Vessel)" /></td>
|
||||
<td><img src="{{ icons['Defensive Matrix (Science Vessel)'] }}" class="{{ 'acquired' if 'Defensive Matrix (Science Vessel)' in acquired_items }}" title="Defensive Matrix (Science Vessel)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Banshee'] }}" class="{{ 'acquired' if 'Banshee' in acquired_items }}" title="Banshee" /></td>
|
||||
<td><img src="{{ crossspectrum_dampeners_banshee_url }}" class="{{ 'acquired' if 'Progressive Cross-Spectrum Dampeners (Banshee)' in acquired_items }}" title="{{ crossspectrum_dampeners_banshee_name }}" /></td>
|
||||
<td><img src="{{ icons['Shockwave Missile Battery (Banshee)'] }}" class="{{ 'acquired' if 'Shockwave Missile Battery (Banshee)' in acquired_items }}" title="Shockwave Missile Battery (Banshee)" /></td>
|
||||
<td><img src="{{ icons['Hyperflight Rotors (Banshee)'] }}" class="{{ 'acquired' if 'Hyperflight Rotors (Banshee)' in acquired_items }}" title="Hyperflight Rotors (Banshee)" /></td>
|
||||
<td><img src="{{ icons['Laser Targeting System (Banshee)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Banshee)' in acquired_items }}" title="Laser Targeting System (Banshee)" /></td>
|
||||
<td><img src="{{ icons['Internal Tech Module (Banshee)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Banshee)' in acquired_items }}" title="Internal Tech Module (Banshee)" /></td>
|
||||
<td colspan="2"></td>
|
||||
<td><img src="{{ icons['Hercules'] }}" class="{{ 'acquired' if 'Hercules' in acquired_items }}" title="Hercules" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Battlecruiser'] }}" class="{{ 'acquired' if 'Battlecruiser' in acquired_items }}" title="Battlecruiser" /></td>
|
||||
<td><img src="{{ icons['Missile Pods (Battlecruiser)'] }}" class="{{ 'acquired' if 'Missile Pods (Battlecruiser)' in acquired_items }}" title="Missile Pods (Battlecruiser)" /></td>
|
||||
<td><img src="{{ icons['Defensive Matrix (Battlecruiser)'] }}" class="{{ 'acquired' if 'Defensive Matrix (Battlecruiser)' in acquired_items }}" title="Defensive Matrix (Battlecruiser)" /></td>
|
||||
<td><img src="{{ icons['Tactical Jump (Battlecruiser)'] }}" class="{{ 'acquired' if 'Tactical Jump (Battlecruiser)' in acquired_items }}" title="Tactical Jump (Battlecruiser)" /></td>
|
||||
<td><img src="{{ icons['Cloak (Battlecruiser)'] }}" class="{{ 'acquired' if 'Cloak (Battlecruiser)' in acquired_items }}" title="Cloak (Battlecruiser)" /></td>
|
||||
<td><img src="{{ icons['ATX Laser Battery (Battlecruiser)'] }}" class="{{ 'acquired' if 'ATX Laser Battery (Battlecruiser)' in acquired_items }}" title="ATX Laser Battery (Battlecruiser)" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Battlecruiser)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Battlecruiser)' in acquired_items }}" title="Optimized Logistics (Battlecruiser)" /></td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Liberator'] }}" class="{{ 'acquired' if 'Liberator' in acquired_items }}" title="Liberator" /></td>
|
||||
<td><img src="{{ icons['Advanced Ballistics (Liberator)'] }}" class="{{ 'acquired' if 'Advanced Ballistics (Liberator)' in acquired_items }}" title="Advanced Ballistics (Liberator)" /></td>
|
||||
<td><img src="{{ icons['Raid Artillery (Liberator)'] }}" class="{{ 'acquired' if 'Raid Artillery (Liberator)' in acquired_items }}" title="Raid Artillery (Liberator)" /></td>
|
||||
<td><img src="{{ icons['Cloak (Liberator)'] }}" class="{{ 'acquired' if 'Cloak (Liberator)' in acquired_items }}" title="Cloak (Liberator)" /></td>
|
||||
<td><img src="{{ icons['Laser Targeting System (Liberator)'] }}" class="{{ 'acquired' if 'Laser Targeting System (Liberator)' in acquired_items }}" title="Laser Targeting System (Liberator)" /></td>
|
||||
<td><img src="{{ icons['Optimized Logistics (Liberator)'] }}" class="{{ 'acquired' if 'Optimized Logistics (Liberator)' in acquired_items }}" title="Optimized Logistics (Liberator)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
Dominion
|
||||
</td>
|
||||
<td></td>
|
||||
<td><img src="{{ icons['Internal Tech Module (Battlecruiser)'] }}" class="{{ 'acquired' if 'Internal Tech Module (Battlecruiser)' in acquired_items }}" title="Internal Tech Module (Battlecruiser)" /></td>
|
||||
<td colspan="6"></td>
|
||||
<td><img src="{{ icons['Valkyrie'] }}" class="{{ 'acquired' if 'Valkyrie' in acquired_items }}" title="Valkyrie" /></td>
|
||||
<td><img src="{{ icons['Enhanced Cluster Launchers (Valkyrie)'] }}" class="{{ 'acquired' if 'Enhanced Cluster Launchers (Valkyrie)' in acquired_items }}" title="Enhanced Cluster Launchers (Valkyrie)" /></td>
|
||||
<td><img src="{{ icons['Shaped Hull (Valkyrie)'] }}" class="{{ 'acquired' if 'Shaped Hull (Valkyrie)' in acquired_items }}" title="Shaped Hull (Valkyrie)" /></td>
|
||||
<td><img src="{{ icons['Burst Lasers (Valkyrie)'] }}" class="{{ 'acquired' if 'Burst Lasers (Valkyrie)' in acquired_items }}" title="Burst Lasers (Valkyrie)" /></td>
|
||||
<td><img src="{{ icons['Afterburners (Valkyrie)'] }}" class="{{ 'acquired' if 'Afterburners (Valkyrie)' in acquired_items }}" title="Afterburners (Valkyrie)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"><img src="{{ icons['Ghost'] }}" class="{{ 'acquired' if 'Ghost' in acquired_items }}" title="Ghost" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Spectre'] }}" class="{{ 'acquired' if 'Spectre' in acquired_items }}" title="Spectre" /></td>
|
||||
<td colspan="2"><img src="{{ icons['Thor'] }}" class="{{ 'acquired' if 'Thor' in acquired_items }}" title="Thor" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Ocular Implants (Ghost)'] }}" class="{{ 'acquired' if 'Ocular Implants (Ghost)' in acquired_items }}" title="Ocular Implants (Ghost)" /></td>
|
||||
<td><img src="{{ icons['Crius Suit (Ghost)'] }}" class="{{ 'acquired' if 'Crius Suit (Ghost)' in acquired_items }}" title="Crius Suit (Ghost)" /></td>
|
||||
<td><img src="{{ icons['Psionic Lash (Spectre)'] }}" class="{{ 'acquired' if 'Psionic Lash (Spectre)' in acquired_items }}" title="Psionic Lash (Spectre)" /></td>
|
||||
<td><img src="{{ icons['Nyx-Class Cloaking Module (Spectre)'] }}" class="{{ 'acquired' if 'Nyx-Class Cloaking Module (Spectre)' in acquired_items }}" title="Nyx-Class Cloaking Module (Spectre)" /></td>
|
||||
<td><img src="{{ icons['330mm Barrage Cannon (Thor)'] }}" class="{{ 'acquired' if '330mm Barrage Cannon (Thor)' in acquired_items }}" title="330mm Barrage Cannon (Thor)" /></td>
|
||||
<td><img src="{{ icons['Immortality Protocol (Thor)'] }}" class="{{ 'acquired' if 'Immortality Protocol (Thor)' in acquired_items }}" title="Immortality Protocol (Thor)" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td colspan="15" class="title">
|
||||
Mercenaries
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -165,36 +311,18 @@
|
|||
<td><img src="{{ icons['Jackson\'s Revenge'] }}" class="{{ 'acquired' if 'Jackson\'s Revenge' in acquired_items }}" title="Jackson's Revenge" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
Lab Upgrades
|
||||
<td colspan="15" class="title">
|
||||
General Upgrades
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Ultra-Capacitors'] }}" class="{{ 'acquired' if 'Ultra-Capacitors' in acquired_items }}" title="Ultra-Capacitors" /></td>
|
||||
<td><img src="{{ icons['Vanadium Plating'] }}" class="{{ 'acquired' if 'Vanadium Plating' in acquired_items }}" title="Vanadium Plating" /></td>
|
||||
<td><img src="{{ icons['Orbital Depots'] }}" class="{{ 'acquired' if 'Orbital Depots' in acquired_items }}" title="Orbital Depots" /></td>
|
||||
<td><img src="{{ icons['Micro-Filtering'] }}" class="{{ 'acquired' if 'Micro-Filtering' in acquired_items }}" title="Micro-Filtering" /></td>
|
||||
<td><img src="{{ icons['Automated Refinery'] }}" class="{{ 'acquired' if 'Automated Refinery' in acquired_items }}" title="Automated Refinery" /></td>
|
||||
<td><img src="{{ icons['Command Center Reactor'] }}" class="{{ 'acquired' if 'Command Center Reactor' in acquired_items }}" title="Command Center Reactor" /></td>
|
||||
<td><img src="{{ icons['Raven'] }}" class="{{ 'acquired' if 'Raven' in acquired_items }}" title="Raven" /></td>
|
||||
<td><img src="{{ icons['Science Vessel'] }}" class="{{ 'acquired' if 'Science Vessel' in acquired_items }}" title="Science Vessel" /></td>
|
||||
<td><img src="{{ icons['Tech Reactor'] }}" class="{{ 'acquired' if 'Tech Reactor' in acquired_items }}" title="Tech Reactor" /></td>
|
||||
<td><img src="{{ icons['Fire-Suppression System (Building)'] }}" class="{{ 'acquired' if 'Fire-Suppression System (Building)' in acquired_items }}" title="Fire-Suppression System (Building)" /></td>
|
||||
<td><img src="{{ icons['Orbital Strike'] }}" class="{{ 'acquired' if 'Orbital Strike' in acquired_items }}" title="Orbital Strike" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ icons['Shrike Turret'] }}" class="{{ 'acquired' if 'Shrike Turret' in acquired_items }}" title="Shrike Turret" /></td>
|
||||
<td><img src="{{ icons['Fortified Bunker'] }}" class="{{ 'acquired' if 'Fortified Bunker' in acquired_items }}" title="Fortified Bunker" /></td>
|
||||
<td><img src="{{ icons['Planetary Fortress'] }}" class="{{ 'acquired' if 'Planetary Fortress' in acquired_items }}" title="Planetary Fortress" /></td>
|
||||
<td><img src="{{ icons['Perdition Turret'] }}" class="{{ 'acquired' if 'Perdition Turret' in acquired_items }}" title="Perdition Turret" /></td>
|
||||
<td><img src="{{ icons['Predator'] }}" class="{{ 'acquired' if 'Predator' in acquired_items }}" title="Predator" /></td>
|
||||
<td><img src="{{ icons['Hercules'] }}" class="{{ 'acquired' if 'Hercules' in acquired_items }}" title="Hercules" /></td>
|
||||
<td><img src="{{ icons['Cellular Reactor'] }}" class="{{ 'acquired' if 'Cellular Reactor' in acquired_items }}" title="Cellular Reactor" /></td>
|
||||
<td><img src="{{ icons['Regenerative Bio-Steel'] }}" class="{{ 'acquired' if 'Regenerative Bio-Steel' in acquired_items }}" title="Regenerative Bio-Steel" /></td>
|
||||
<td><img src="{{ icons['Hive Mind Emulator'] }}" class="{{ 'acquired' if 'Hive Mind Emulator' in acquired_items }}" title="Hive Mind Emulator" /></td>
|
||||
<td><img src="{{ icons['Psi Disrupter'] }}" class="{{ 'acquired' if 'Psi Disrupter' in acquired_items }}" title="Psi Disrupter" /></td>
|
||||
<td><img src="{{ regenerative_biosteel_url }}" class="{{ 'acquired' if 'Progressive Regenerative Bio-Steel' in acquired_items }}" title="Progressive Regenerative Bio-Steel{% if regenerative_biosteel_level > 0 %} (Level {{ regenerative_biosteel_level }}){% endif %}" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="10" class="title">
|
||||
<td colspan="15" class="title">
|
||||
Protoss Units
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -990,6 +990,7 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
SC2WOL_LOC_ID_OFFSET = 1000
|
||||
SC2WOL_ITEM_ID_OFFSET = 1000
|
||||
|
||||
|
||||
icons = {
|
||||
"Starting Minerals": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-mineral-protoss.png",
|
||||
"Starting Vespene": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-gas-terran.png",
|
||||
|
@ -1034,15 +1035,36 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
"Reaper": "https://static.wikia.nocookie.net/starcraft/images/7/7d/Reaper_SC2_Icon1.jpg",
|
||||
|
||||
"Stimpack (Marine)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
|
||||
"Super Stimpack (Marine)": "/static/static/icons/sc2/superstimpack.png",
|
||||
"Combat Shield (Marine)": "https://0rganics.org/archipelago/sc2wol/CombatShieldCampaign.png",
|
||||
"Laser Targeting System (Marine)": "/static/static/icons/sc2/lasertargetingsystem.png",
|
||||
"Magrail Munitions (Marine)": "/static/static/icons/sc2/magrailmunitions.png",
|
||||
"Optimized Logistics (Marine)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Advanced Medic Facilities (Medic)": "https://0rganics.org/archipelago/sc2wol/AdvancedMedicFacilities.png",
|
||||
"Stabilizer Medpacks (Medic)": "https://0rganics.org/archipelago/sc2wol/StabilizerMedpacks.png",
|
||||
"Restoration (Medic)": "/static/static/icons/sc2/restoration.png",
|
||||
"Optical Flare (Medic)": "/static/static/icons/sc2/opticalflare.png",
|
||||
"Optimized Logistics (Medic)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Incinerator Gauntlets (Firebat)": "https://0rganics.org/archipelago/sc2wol/IncineratorGauntlets.png",
|
||||
"Juggernaut Plating (Firebat)": "https://0rganics.org/archipelago/sc2wol/JuggernautPlating.png",
|
||||
"Stimpack (Firebat)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
|
||||
"Super Stimpack (Firebat)": "/static/static/icons/sc2/superstimpack.png",
|
||||
"Optimized Logistics (Firebat)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Concussive Shells (Marauder)": "https://0rganics.org/archipelago/sc2wol/ConcussiveShellsCampaign.png",
|
||||
"Kinetic Foam (Marauder)": "https://0rganics.org/archipelago/sc2wol/KineticFoam.png",
|
||||
"Stimpack (Marauder)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
|
||||
"Super Stimpack (Marauder)": "/static/static/icons/sc2/superstimpack.png",
|
||||
"Laser Targeting System (Marauder)": "/static/static/icons/sc2/lasertargetingsystem.png",
|
||||
"Magrail Munitions (Marauder)": "/static/static/icons/sc2/magrailmunitions.png",
|
||||
"Internal Tech Module (Marauder)": "/static/static/icons/sc2/internalizedtechmodule.png",
|
||||
"U-238 Rounds (Reaper)": "https://0rganics.org/archipelago/sc2wol/U-238Rounds.png",
|
||||
"G-4 Clusterbomb (Reaper)": "https://0rganics.org/archipelago/sc2wol/G-4Clusterbomb.png",
|
||||
"Stimpack (Reaper)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
|
||||
"Super Stimpack (Reaper)": "/static/static/icons/sc2/superstimpack.png",
|
||||
"Laser Targeting System (Reaper)": "/static/static/icons/sc2/lasertargetingsystem.png",
|
||||
"Advanced Cloaking Field (Reaper)": "/static/static/icons/sc2/terran-cloak-color.png",
|
||||
"Spider Mines (Reaper)": "/static/static/icons/sc2/spidermine.png",
|
||||
"Combat Drugs (Reaper)": "/static/static/icons/sc2/reapercombatdrugs.png",
|
||||
|
||||
"Hellion": "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg",
|
||||
"Vulture": "https://static.wikia.nocookie.net/starcraft/images/d/da/Vulture_WoL.jpg",
|
||||
|
@ -1052,14 +1074,35 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
|
||||
"Twin-Linked Flamethrower (Hellion)": "https://0rganics.org/archipelago/sc2wol/Twin-LinkedFlamethrower.png",
|
||||
"Thermite Filaments (Hellion)": "https://0rganics.org/archipelago/sc2wol/ThermiteFilaments.png",
|
||||
"Cerberus Mine (Vulture)": "https://0rganics.org/archipelago/sc2wol/CerberusMine.png",
|
||||
"Hellbat Aspect (Hellion)": "/static/static/icons/sc2/hellionbattlemode.png",
|
||||
"Smart Servos (Hellion)": "/static/static/icons/sc2/transformationservos.png",
|
||||
"Optimized Logistics (Hellion)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Jump Jets (Hellion)": "/static/static/icons/sc2/jumpjets.png",
|
||||
"Stimpack (Hellion)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png",
|
||||
"Super Stimpack (Hellion)": "/static/static/icons/sc2/superstimpack.png",
|
||||
"Cerberus Mine (Spider Mine)": "https://0rganics.org/archipelago/sc2wol/CerberusMine.png",
|
||||
"High Explosive Munition (Spider Mine)": "/static/static/icons/sc2/high-explosive-spidermine.png",
|
||||
"Replenishable Magazine (Vulture)": "https://0rganics.org/archipelago/sc2wol/ReplenishableMagazine.png",
|
||||
"Ion Thrusters (Vulture)": "/static/static/icons/sc2/emergencythrusters.png",
|
||||
"Auto Launchers (Vulture)": "/static/static/icons/sc2/jotunboosters.png",
|
||||
"Multi-Lock Weapons System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Multi-LockWeaponsSystem.png",
|
||||
"Ares-Class Targeting System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Ares-ClassTargetingSystem.png",
|
||||
"Jump Jets (Goliath)": "/static/static/icons/sc2/jumpjets.png",
|
||||
"Optimized Logistics (Goliath)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Tri-Lithium Power Cell (Diamondback)": "https://0rganics.org/archipelago/sc2wol/Tri-LithiumPowerCell.png",
|
||||
"Shaped Hull (Diamondback)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png",
|
||||
"Hyperfluxor (Diamondback)": "/static/static/icons/sc2/hyperfluxor.png",
|
||||
"Burst Capacitors (Diamondback)": "/static/static/icons/sc2/burstcapacitors.png",
|
||||
"Optimized Logistics (Diamondback)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Maelstrom Rounds (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/MaelstromRounds.png",
|
||||
"Shaped Blast (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/ShapedBlast.png",
|
||||
"Jump Jets (Siege Tank)": "/static/static/icons/sc2/jumpjets.png",
|
||||
"Spider Mines (Siege Tank)": "/static/static/icons/sc2/siegetank-spidermines.png",
|
||||
"Smart Servos (Siege Tank)": "/static/static/icons/sc2/transformationservos.png",
|
||||
"Graduating Range (Siege Tank)": "/static/static/icons/sc2/siegetankrange.png",
|
||||
"Laser Targeting System (Siege Tank)": "/static/static/icons/sc2/lasertargetingsystem.png",
|
||||
"Advanced Siege Tech (Siege Tank)": "/static/static/icons/sc2/improvedsiegemode.png",
|
||||
"Internal Tech Module (Siege Tank)": "/static/static/icons/sc2/internalizedtechmodule.png",
|
||||
|
||||
"Medivac": "https://static.wikia.nocookie.net/starcraft/images/d/db/Medivac_SC2_Icon1.jpg",
|
||||
"Wraith": "https://static.wikia.nocookie.net/starcraft/images/7/75/Wraith_WoL.jpg",
|
||||
|
@ -1069,25 +1112,77 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
|
||||
"Rapid Deployment Tube (Medivac)": "https://0rganics.org/archipelago/sc2wol/RapidDeploymentTube.png",
|
||||
"Advanced Healing AI (Medivac)": "https://0rganics.org/archipelago/sc2wol/AdvancedHealingAI.png",
|
||||
"Expanded Hull (Medivac)": "/static/static/icons/sc2/neosteelfortifiedarmor.png",
|
||||
"Afterburners (Medivac)": "/static/static/icons/sc2/medivacemergencythrusters.png",
|
||||
"Tomahawk Power Cells (Wraith)": "https://0rganics.org/archipelago/sc2wol/TomahawkPowerCells.png",
|
||||
"Displacement Field (Wraith)": "https://0rganics.org/archipelago/sc2wol/DisplacementField.png",
|
||||
"Advanced Laser Technology (Wraith)": "/static/static/icons/sc2/improvedburstlaser.png",
|
||||
"Ripwave Missiles (Viking)": "https://0rganics.org/archipelago/sc2wol/RipwaveMissiles.png",
|
||||
"Phobos-Class Weapons System (Viking)": "https://0rganics.org/archipelago/sc2wol/Phobos-ClassWeaponsSystem.png",
|
||||
"Cross-Spectrum Dampeners (Banshee)": "https://0rganics.org/archipelago/sc2wol/Cross-SpectrumDampeners.png",
|
||||
"Smart Servos (Viking)": "/static/static/icons/sc2/transformationservos.png",
|
||||
"Magrail Munitions (Viking)": "/static/static/icons/sc2/magrailmunitions.png",
|
||||
"Cross-Spectrum Dampeners (Banshee)": "/static/static/icons/sc2/crossspectrumdampeners.png",
|
||||
"Advanced Cross-Spectrum Dampeners (Banshee)": "https://0rganics.org/archipelago/sc2wol/Cross-SpectrumDampeners.png",
|
||||
"Shockwave Missile Battery (Banshee)": "https://0rganics.org/archipelago/sc2wol/ShockwaveMissileBattery.png",
|
||||
"Hyperflight Rotors (Banshee)": "/static/static/icons/sc2/hyperflightrotors.png",
|
||||
"Laser Targeting System (Banshee)": "/static/static/icons/sc2/lasertargetingsystem.png",
|
||||
"Internal Tech Module (Banshee)": "/static/static/icons/sc2/internalizedtechmodule.png",
|
||||
"Missile Pods (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/MissilePods.png",
|
||||
"Defensive Matrix (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png",
|
||||
"Tactical Jump (Battlecruiser)": "/static/static/icons/sc2/warpjump.png",
|
||||
"Cloak (Battlecruiser)": "/static/static/icons/sc2/terran-cloak-color.png",
|
||||
"ATX Laser Battery (Battlecruiser)": "/static/static/icons/sc2/specialordance.png",
|
||||
"Optimized Logistics (Battlecruiser)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Internal Tech Module (Battlecruiser)": "/static/static/icons/sc2/internalizedtechmodule.png",
|
||||
|
||||
"Ghost": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg",
|
||||
"Spectre": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Spectre_WoL.jpg",
|
||||
"Thor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg",
|
||||
|
||||
"Widow Mine": "/static/static/icons/sc2/widowmine.png",
|
||||
"Cyclone": "/static/static/icons/sc2/cyclone.png",
|
||||
"Liberator": "/static/static/icons/sc2/liberator.png",
|
||||
"Valkyrie": "/static/static/icons/sc2/valkyrie.png",
|
||||
|
||||
"Ocular Implants (Ghost)": "https://0rganics.org/archipelago/sc2wol/OcularImplants.png",
|
||||
"Crius Suit (Ghost)": "https://0rganics.org/archipelago/sc2wol/CriusSuit.png",
|
||||
"EMP Rounds (Ghost)": "/static/static/icons/sc2/terran-emp-color.png",
|
||||
"Lockdown (Ghost)": "/static/static/icons/sc2/lockdown.png",
|
||||
"Psionic Lash (Spectre)": "https://0rganics.org/archipelago/sc2wol/PsionicLash.png",
|
||||
"Nyx-Class Cloaking Module (Spectre)": "https://0rganics.org/archipelago/sc2wol/Nyx-ClassCloakingModule.png",
|
||||
"Impaler Rounds (Spectre)": "/static/static/icons/sc2/impalerrounds.png",
|
||||
"330mm Barrage Cannon (Thor)": "https://0rganics.org/archipelago/sc2wol/330mmBarrageCannon.png",
|
||||
"Immortality Protocol (Thor)": "https://0rganics.org/archipelago/sc2wol/ImmortalityProtocol.png",
|
||||
"High Impact Payload (Thor)": "/static/static/icons/sc2/thorsiegemode.png",
|
||||
"Smart Servos (Thor)": "/static/static/icons/sc2/transformationservos.png",
|
||||
|
||||
"Optimized Logistics (Predator)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Drilling Claws (Widow Mine)": "/static/static/icons/sc2/drillingclaws.png",
|
||||
"Concealment (Widow Mine)": "/static/static/icons/sc2/widowminehidden.png",
|
||||
"Black Market Launchers (Widow Mine)": "/static/static/icons/sc2/widowmine-attackrange.png",
|
||||
"Executioner Missiles (Widow Mine)": "/static/static/icons/sc2/widowmine-deathblossom.png",
|
||||
"Mag-Field Accelerators (Cyclone)": "/static/static/icons/sc2/magfieldaccelerator.png",
|
||||
"Mag-Field Launchers (Cyclone)": "/static/static/icons/sc2/cyclonerangeupgrade.png",
|
||||
"Targeting Optics (Cyclone)": "/static/static/icons/sc2/targetingoptics.png",
|
||||
"Rapid Fire Launchers (Cyclone)": "/static/static/icons/sc2/ripwavemissiles.png",
|
||||
"Bio Mechanical Repair Drone (Raven)": "/static/static/icons/sc2/biomechanicaldrone.png",
|
||||
"Spider Mines (Raven)": "/static/static/icons/sc2/siegetank-spidermines.png",
|
||||
"Railgun Turret (Raven)": "/static/static/icons/sc2/autoturretblackops.png",
|
||||
"Hunter-Seeker Weapon (Raven)": "/static/static/icons/sc2/specialordance.png",
|
||||
"Interference Matrix (Raven)": "/static/static/icons/sc2/interferencematrix.png",
|
||||
"Anti-Armor Missile (Raven)": "/static/static/icons/sc2/shreddermissile.png",
|
||||
"Internal Tech Module (Raven)": "/static/static/icons/sc2/internalizedtechmodule.png",
|
||||
"EMP Shockwave (Science Vessel)": "/static/static/icons/sc2/staticempblast.png",
|
||||
"Defensive Matrix (Science Vessel)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png",
|
||||
"Advanced Ballistics (Liberator)": "/static/static/icons/sc2/advanceballistics.png",
|
||||
"Raid Artillery (Liberator)": "/static/static/icons/sc2/terrandefendermodestructureattack.png",
|
||||
"Cloak (Liberator)": "/static/static/icons/sc2/terran-cloak-color.png",
|
||||
"Laser Targeting System (Liberator)": "/static/static/icons/sc2/lasertargetingsystem.png",
|
||||
"Optimized Logistics (Liberator)": "/static/static/icons/sc2/optimizedlogistics.png",
|
||||
"Enhanced Cluster Launchers (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png",
|
||||
"Shaped Hull (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png",
|
||||
"Burst Lasers (Valkyrie)": "/static/static/icons/sc2/improvedburstlaser.png",
|
||||
"Afterburners (Valkyrie)": "/static/static/icons/sc2/medivacemergencythrusters.png",
|
||||
|
||||
"War Pigs": "https://static.wikia.nocookie.net/starcraft/images/e/ed/WarPigs_SC2_Icon1.jpg",
|
||||
"Devil Dogs": "https://static.wikia.nocookie.net/starcraft/images/3/33/DevilDogs_SC2_Icon1.jpg",
|
||||
|
@ -1109,14 +1204,15 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
"Tech Reactor": "https://static.wikia.nocookie.net/starcraft/images/c/c5/SC2_Lab_Tech_Reactor_Icon.png",
|
||||
"Orbital Strike": "https://static.wikia.nocookie.net/starcraft/images/d/df/SC2_Lab_Orb_Strike_Icon.png",
|
||||
|
||||
"Shrike Turret": "https://static.wikia.nocookie.net/starcraft/images/4/44/SC2_Lab_Shrike_Turret_Icon.png",
|
||||
"Fortified Bunker": "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png",
|
||||
"Shrike Turret (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/44/SC2_Lab_Shrike_Turret_Icon.png",
|
||||
"Fortified Bunker (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png",
|
||||
"Planetary Fortress": "https://static.wikia.nocookie.net/starcraft/images/0/0b/SC2_Lab_PlanetFortress_Icon.png",
|
||||
"Perdition Turret": "https://static.wikia.nocookie.net/starcraft/images/a/af/SC2_Lab_PerdTurret_Icon.png",
|
||||
"Predator": "https://static.wikia.nocookie.net/starcraft/images/8/83/SC2_Lab_Predator_Icon.png",
|
||||
"Hercules": "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png",
|
||||
"Cellular Reactor": "https://static.wikia.nocookie.net/starcraft/images/d/d8/SC2_Lab_CellReactor_Icon.png",
|
||||
"Regenerative Bio-Steel": "https://static.wikia.nocookie.net/starcraft/images/d/d3/SC2_Lab_BioSteel_Icon.png",
|
||||
"Regenerative Bio-Steel Level 1": "/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png",
|
||||
"Regenerative Bio-Steel Level 2": "/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png",
|
||||
"Hive Mind Emulator": "https://static.wikia.nocookie.net/starcraft/images/b/bc/SC2_Lab_Hive_Emulator_Icon.png",
|
||||
"Psi Disrupter": "https://static.wikia.nocookie.net/starcraft/images/c/cf/SC2_Lab_Psi_Disruptor_Icon.png",
|
||||
|
||||
|
@ -1132,40 +1228,71 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
|
||||
"Nothing": "",
|
||||
}
|
||||
|
||||
sc2wol_location_ids = {
|
||||
"Liberation Day": [SC2WOL_LOC_ID_OFFSET + 100, SC2WOL_LOC_ID_OFFSET + 101, SC2WOL_LOC_ID_OFFSET + 102, SC2WOL_LOC_ID_OFFSET + 103, SC2WOL_LOC_ID_OFFSET + 104, SC2WOL_LOC_ID_OFFSET + 105, SC2WOL_LOC_ID_OFFSET + 106],
|
||||
"The Outlaws": [SC2WOL_LOC_ID_OFFSET + 200, SC2WOL_LOC_ID_OFFSET + 201],
|
||||
"Zero Hour": [SC2WOL_LOC_ID_OFFSET + 300, SC2WOL_LOC_ID_OFFSET + 301, SC2WOL_LOC_ID_OFFSET + 302, SC2WOL_LOC_ID_OFFSET + 303],
|
||||
"Evacuation": [SC2WOL_LOC_ID_OFFSET + 400, SC2WOL_LOC_ID_OFFSET + 401, SC2WOL_LOC_ID_OFFSET + 402, SC2WOL_LOC_ID_OFFSET + 403],
|
||||
"Outbreak": [SC2WOL_LOC_ID_OFFSET + 500, SC2WOL_LOC_ID_OFFSET + 501, SC2WOL_LOC_ID_OFFSET + 502],
|
||||
"Safe Haven": [SC2WOL_LOC_ID_OFFSET + 600, SC2WOL_LOC_ID_OFFSET + 601, SC2WOL_LOC_ID_OFFSET + 602, SC2WOL_LOC_ID_OFFSET + 603],
|
||||
"Haven's Fall": [SC2WOL_LOC_ID_OFFSET + 700, SC2WOL_LOC_ID_OFFSET + 701, SC2WOL_LOC_ID_OFFSET + 702, SC2WOL_LOC_ID_OFFSET + 703],
|
||||
"Smash and Grab": [SC2WOL_LOC_ID_OFFSET + 800, SC2WOL_LOC_ID_OFFSET + 801, SC2WOL_LOC_ID_OFFSET + 802, SC2WOL_LOC_ID_OFFSET + 803, SC2WOL_LOC_ID_OFFSET + 804],
|
||||
"The Dig": [SC2WOL_LOC_ID_OFFSET + 900, SC2WOL_LOC_ID_OFFSET + 901, SC2WOL_LOC_ID_OFFSET + 902, SC2WOL_LOC_ID_OFFSET + 903],
|
||||
"The Moebius Factor": [SC2WOL_LOC_ID_OFFSET + 1000, SC2WOL_LOC_ID_OFFSET + 1003, SC2WOL_LOC_ID_OFFSET + 1004, SC2WOL_LOC_ID_OFFSET + 1005, SC2WOL_LOC_ID_OFFSET + 1006, SC2WOL_LOC_ID_OFFSET + 1007, SC2WOL_LOC_ID_OFFSET + 1008],
|
||||
"Supernova": [SC2WOL_LOC_ID_OFFSET + 1100, SC2WOL_LOC_ID_OFFSET + 1101, SC2WOL_LOC_ID_OFFSET + 1102, SC2WOL_LOC_ID_OFFSET + 1103, SC2WOL_LOC_ID_OFFSET + 1104],
|
||||
"Maw of the Void": [SC2WOL_LOC_ID_OFFSET + 1200, SC2WOL_LOC_ID_OFFSET + 1201, SC2WOL_LOC_ID_OFFSET + 1202, SC2WOL_LOC_ID_OFFSET + 1203, SC2WOL_LOC_ID_OFFSET + 1204, SC2WOL_LOC_ID_OFFSET + 1205],
|
||||
"Devil's Playground": [SC2WOL_LOC_ID_OFFSET + 1300, SC2WOL_LOC_ID_OFFSET + 1301, SC2WOL_LOC_ID_OFFSET + 1302],
|
||||
"Welcome to the Jungle": [SC2WOL_LOC_ID_OFFSET + 1400, SC2WOL_LOC_ID_OFFSET + 1401, SC2WOL_LOC_ID_OFFSET + 1402, SC2WOL_LOC_ID_OFFSET + 1403],
|
||||
"Breakout": [SC2WOL_LOC_ID_OFFSET + 1500, SC2WOL_LOC_ID_OFFSET + 1501, SC2WOL_LOC_ID_OFFSET + 1502],
|
||||
"Ghost of a Chance": [SC2WOL_LOC_ID_OFFSET + 1600, SC2WOL_LOC_ID_OFFSET + 1601, SC2WOL_LOC_ID_OFFSET + 1602, SC2WOL_LOC_ID_OFFSET + 1603, SC2WOL_LOC_ID_OFFSET + 1604, SC2WOL_LOC_ID_OFFSET + 1605],
|
||||
"The Great Train Robbery": [SC2WOL_LOC_ID_OFFSET + 1700, SC2WOL_LOC_ID_OFFSET + 1701, SC2WOL_LOC_ID_OFFSET + 1702, SC2WOL_LOC_ID_OFFSET + 1703],
|
||||
"Cutthroat": [SC2WOL_LOC_ID_OFFSET + 1800, SC2WOL_LOC_ID_OFFSET + 1801, SC2WOL_LOC_ID_OFFSET + 1802, SC2WOL_LOC_ID_OFFSET + 1803, SC2WOL_LOC_ID_OFFSET + 1804],
|
||||
"Engine of Destruction": [SC2WOL_LOC_ID_OFFSET + 1900, SC2WOL_LOC_ID_OFFSET + 1901, SC2WOL_LOC_ID_OFFSET + 1902, SC2WOL_LOC_ID_OFFSET + 1903, SC2WOL_LOC_ID_OFFSET + 1904, SC2WOL_LOC_ID_OFFSET + 1905],
|
||||
"Media Blitz": [SC2WOL_LOC_ID_OFFSET + 2000, SC2WOL_LOC_ID_OFFSET + 2001, SC2WOL_LOC_ID_OFFSET + 2002, SC2WOL_LOC_ID_OFFSET + 2003, SC2WOL_LOC_ID_OFFSET + 2004],
|
||||
"Piercing the Shroud": [SC2WOL_LOC_ID_OFFSET + 2100, SC2WOL_LOC_ID_OFFSET + 2101, SC2WOL_LOC_ID_OFFSET + 2102, SC2WOL_LOC_ID_OFFSET + 2103, SC2WOL_LOC_ID_OFFSET + 2104, SC2WOL_LOC_ID_OFFSET + 2105],
|
||||
"Whispers of Doom": [SC2WOL_LOC_ID_OFFSET + 2200, SC2WOL_LOC_ID_OFFSET + 2201, SC2WOL_LOC_ID_OFFSET + 2202, SC2WOL_LOC_ID_OFFSET + 2203],
|
||||
"A Sinister Turn": [SC2WOL_LOC_ID_OFFSET + 2300, SC2WOL_LOC_ID_OFFSET + 2301, SC2WOL_LOC_ID_OFFSET + 2302, SC2WOL_LOC_ID_OFFSET + 2303],
|
||||
"Echoes of the Future": [SC2WOL_LOC_ID_OFFSET + 2400, SC2WOL_LOC_ID_OFFSET + 2401, SC2WOL_LOC_ID_OFFSET + 2402],
|
||||
"In Utter Darkness": [SC2WOL_LOC_ID_OFFSET + 2500, SC2WOL_LOC_ID_OFFSET + 2501, SC2WOL_LOC_ID_OFFSET + 2502],
|
||||
"Gates of Hell": [SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2601],
|
||||
"Belly of the Beast": [SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2701, SC2WOL_LOC_ID_OFFSET + 2702, SC2WOL_LOC_ID_OFFSET + 2703],
|
||||
"Shatter the Sky": [SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2801, SC2WOL_LOC_ID_OFFSET + 2802, SC2WOL_LOC_ID_OFFSET + 2803, SC2WOL_LOC_ID_OFFSET + 2804, SC2WOL_LOC_ID_OFFSET + 2805],
|
||||
"Liberation Day": range(SC2WOL_LOC_ID_OFFSET + 100, SC2WOL_LOC_ID_OFFSET + 200),
|
||||
"The Outlaws": range(SC2WOL_LOC_ID_OFFSET + 200, SC2WOL_LOC_ID_OFFSET + 300),
|
||||
"Zero Hour": range(SC2WOL_LOC_ID_OFFSET + 300, SC2WOL_LOC_ID_OFFSET + 400),
|
||||
"Evacuation": range(SC2WOL_LOC_ID_OFFSET + 400, SC2WOL_LOC_ID_OFFSET + 500),
|
||||
"Outbreak": range(SC2WOL_LOC_ID_OFFSET + 500, SC2WOL_LOC_ID_OFFSET + 600),
|
||||
"Safe Haven": range(SC2WOL_LOC_ID_OFFSET + 600, SC2WOL_LOC_ID_OFFSET + 700),
|
||||
"Haven's Fall": range(SC2WOL_LOC_ID_OFFSET + 700, SC2WOL_LOC_ID_OFFSET + 800),
|
||||
"Smash and Grab": range(SC2WOL_LOC_ID_OFFSET + 800, SC2WOL_LOC_ID_OFFSET + 900),
|
||||
"The Dig": range(SC2WOL_LOC_ID_OFFSET + 900, SC2WOL_LOC_ID_OFFSET + 1000),
|
||||
"The Moebius Factor": range(SC2WOL_LOC_ID_OFFSET + 1000, SC2WOL_LOC_ID_OFFSET + 1100),
|
||||
"Supernova": range(SC2WOL_LOC_ID_OFFSET + 1100, SC2WOL_LOC_ID_OFFSET + 1200),
|
||||
"Maw of the Void": range(SC2WOL_LOC_ID_OFFSET + 1200, SC2WOL_LOC_ID_OFFSET + 1300),
|
||||
"Devil's Playground": range(SC2WOL_LOC_ID_OFFSET + 1300, SC2WOL_LOC_ID_OFFSET + 1400),
|
||||
"Welcome to the Jungle": range(SC2WOL_LOC_ID_OFFSET + 1400, SC2WOL_LOC_ID_OFFSET + 1500),
|
||||
"Breakout": range(SC2WOL_LOC_ID_OFFSET + 1500, SC2WOL_LOC_ID_OFFSET + 1600),
|
||||
"Ghost of a Chance": range(SC2WOL_LOC_ID_OFFSET + 1600, SC2WOL_LOC_ID_OFFSET + 1700),
|
||||
"The Great Train Robbery": range(SC2WOL_LOC_ID_OFFSET + 1700, SC2WOL_LOC_ID_OFFSET + 1800),
|
||||
"Cutthroat": range(SC2WOL_LOC_ID_OFFSET + 1800, SC2WOL_LOC_ID_OFFSET + 1900),
|
||||
"Engine of Destruction": range(SC2WOL_LOC_ID_OFFSET + 1900, SC2WOL_LOC_ID_OFFSET + 2000),
|
||||
"Media Blitz": range(SC2WOL_LOC_ID_OFFSET + 2000, SC2WOL_LOC_ID_OFFSET + 2100),
|
||||
"Piercing the Shroud": range(SC2WOL_LOC_ID_OFFSET + 2100, SC2WOL_LOC_ID_OFFSET + 2200),
|
||||
"Whispers of Doom": range(SC2WOL_LOC_ID_OFFSET + 2200, SC2WOL_LOC_ID_OFFSET + 2300),
|
||||
"A Sinister Turn": range(SC2WOL_LOC_ID_OFFSET + 2300, SC2WOL_LOC_ID_OFFSET + 2400),
|
||||
"Echoes of the Future": range(SC2WOL_LOC_ID_OFFSET + 2400, SC2WOL_LOC_ID_OFFSET + 2500),
|
||||
"In Utter Darkness": range(SC2WOL_LOC_ID_OFFSET + 2500, SC2WOL_LOC_ID_OFFSET + 2600),
|
||||
"Gates of Hell": range(SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2700),
|
||||
"Belly of the Beast": range(SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2800),
|
||||
"Shatter the Sky": range(SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2900),
|
||||
}
|
||||
|
||||
display_data = {}
|
||||
|
||||
# Grouped Items
|
||||
grouped_item_ids = {
|
||||
"Progressive Weapon Upgrade": 107 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Armor Upgrade": 108 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Infantry Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Vehicle Upgrade": 110 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Ship Upgrade": 111 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Weapon/Armor Upgrade": 112 + SC2WOL_ITEM_ID_OFFSET
|
||||
}
|
||||
grouped_item_replacements = {
|
||||
"Progressive Weapon Upgrade": ["Progressive Infantry Weapon", "Progressive Vehicle Weapon", "Progressive Ship Weapon"],
|
||||
"Progressive Armor Upgrade": ["Progressive Infantry Armor", "Progressive Vehicle Armor", "Progressive Ship Armor"],
|
||||
"Progressive Infantry Upgrade": ["Progressive Infantry Weapon", "Progressive Infantry Armor"],
|
||||
"Progressive Vehicle Upgrade": ["Progressive Vehicle Weapon", "Progressive Vehicle Armor"],
|
||||
"Progressive Ship Upgrade": ["Progressive Ship Weapon", "Progressive Ship Armor"]
|
||||
}
|
||||
grouped_item_replacements["Progressive Weapon/Armor Upgrade"] = grouped_item_replacements["Progressive Weapon Upgrade"] + grouped_item_replacements["Progressive Armor Upgrade"]
|
||||
replacement_item_ids = {
|
||||
"Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET,
|
||||
}
|
||||
for grouped_item_name, grouped_item_id in grouped_item_ids.items():
|
||||
count: int = inventory[grouped_item_id]
|
||||
if count > 0:
|
||||
for replacement_item in grouped_item_replacements[grouped_item_name]:
|
||||
replacement_id: int = replacement_item_ids[replacement_item]
|
||||
inventory[replacement_id] = count
|
||||
|
||||
# Determine display for progressive items
|
||||
progressive_items = {
|
||||
"Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET,
|
||||
|
@ -1173,7 +1300,15 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
"Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET
|
||||
"Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Stimpack (Marine)": 208 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Stimpack (Firebat)": 226 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Stimpack (Marauder)": 228 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Stimpack (Reaper)": 250 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Stimpack (Hellion)": 259 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive High Impact Payload (Thor)": 361 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Cross-Spectrum Dampeners (Banshee)": 316 + SC2WOL_ITEM_ID_OFFSET,
|
||||
"Progressive Regenerative Bio-Steel": 617 + SC2WOL_ITEM_ID_OFFSET
|
||||
}
|
||||
progressive_names = {
|
||||
"Progressive Infantry Weapon": ["Infantry Weapons Level 1", "Infantry Weapons Level 1", "Infantry Weapons Level 2", "Infantry Weapons Level 3"],
|
||||
|
@ -1181,14 +1316,27 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
|
|||
"Progressive Vehicle Weapon": ["Vehicle Weapons Level 1", "Vehicle Weapons Level 1", "Vehicle Weapons Level 2", "Vehicle Weapons Level 3"],
|
||||
"Progressive Vehicle Armor": ["Vehicle Armor Level 1", "Vehicle Armor Level 1", "Vehicle Armor Level 2", "Vehicle Armor Level 3"],
|
||||
"Progressive Ship Weapon": ["Ship Weapons Level 1", "Ship Weapons Level 1", "Ship Weapons Level 2", "Ship Weapons Level 3"],
|
||||
"Progressive Ship Armor": ["Ship Armor Level 1", "Ship Armor Level 1", "Ship Armor Level 2", "Ship Armor Level 3"]
|
||||
"Progressive Ship Armor": ["Ship Armor Level 1", "Ship Armor Level 1", "Ship Armor Level 2", "Ship Armor Level 3"],
|
||||
"Progressive Stimpack (Marine)": ["Stimpack (Marine)", "Stimpack (Marine)", "Super Stimpack (Marine)"],
|
||||
"Progressive Stimpack (Firebat)": ["Stimpack (Firebat)", "Stimpack (Firebat)", "Super Stimpack (Firebat)"],
|
||||
"Progressive Stimpack (Marauder)": ["Stimpack (Marauder)", "Stimpack (Marauder)", "Super Stimpack (Marauder)"],
|
||||
"Progressive Stimpack (Reaper)": ["Stimpack (Reaper)", "Stimpack (Reaper)", "Super Stimpack (Reaper)"],
|
||||
"Progressive Stimpack (Hellion)": ["Stimpack (Hellion)", "Stimpack (Hellion)", "Super Stimpack (Hellion)"],
|
||||
"Progressive High Impact Payload (Thor)": ["High Impact Payload (Thor)", "High Impact Payload (Thor)", "Smart Servos (Thor)"],
|
||||
"Progressive Cross-Spectrum Dampeners (Banshee)": ["Cross-Spectrum Dampeners (Banshee)", "Cross-Spectrum Dampeners (Banshee)", "Advanced Cross-Spectrum Dampeners (Banshee)"],
|
||||
"Progressive Regenerative Bio-Steel": ["Regenerative Bio-Steel Level 1", "Regenerative Bio-Steel Level 1", "Regenerative Bio-Steel Level 2"]
|
||||
}
|
||||
for item_name, item_id in progressive_items.items():
|
||||
level = min(inventory[item_id], len(progressive_names[item_name]) - 1)
|
||||
display_name = progressive_names[item_name][level]
|
||||
base_name = item_name.split(maxsplit=1)[1].lower().replace(' ', '_')
|
||||
base_name = (item_name.split(maxsplit=1)[1].lower()
|
||||
.replace(' ', '_')
|
||||
.replace("-", "")
|
||||
.replace("(", "")
|
||||
.replace(")", ""))
|
||||
display_data[base_name + "_level"] = level
|
||||
display_data[base_name + "_url"] = icons[display_name]
|
||||
display_data[base_name + "_name"] = display_name
|
||||
|
||||
# Multi-items
|
||||
multi_items = {
|
||||
|
|
2
setup.py
|
@ -80,7 +80,6 @@ non_apworlds: set = {
|
|||
"Raft",
|
||||
"Secret of Evermore",
|
||||
"Slay the Spire",
|
||||
"Starcraft 2 Wings of Liberty",
|
||||
"Sudoku",
|
||||
"Super Mario 64",
|
||||
"VVVVVV",
|
||||
|
@ -91,6 +90,7 @@ non_apworlds: set = {
|
|||
# LogicMixin is broken before 3.10 import revamp
|
||||
if sys.version_info < (3,10):
|
||||
non_apworlds.add("Hollow Knight")
|
||||
non_apworlds.add("Starcraft 2 Wings of Liberty")
|
||||
|
||||
def download_SNI():
|
||||
print("Updating SNI")
|
||||
|
|
|
@ -8,18 +8,31 @@ from .paths import Paths
|
|||
|
||||
|
||||
def get(name: str) -> Map:
|
||||
# Iterate through 2 folder depths
|
||||
for map_dir in (p for p in Paths.MAPS.iterdir()):
|
||||
if map_dir.is_dir():
|
||||
for map_file in (p for p in map_dir.iterdir()):
|
||||
if Map.matches_target_map_name(map_file, name):
|
||||
return Map(map_file)
|
||||
elif Map.matches_target_map_name(map_dir, name):
|
||||
return Map(map_dir)
|
||||
map = find_map_in_dir(name, map_dir)
|
||||
if map is not None:
|
||||
return map
|
||||
|
||||
raise KeyError(f"Map '{name}' was not found. Please put the map file in \"/StarCraft II/Maps/\".")
|
||||
|
||||
|
||||
# Go deeper
|
||||
def find_map_in_dir(name, path):
|
||||
if Map.matches_target_map_name(path, name):
|
||||
return Map(path)
|
||||
|
||||
if path.name.endswith("SC2Map"):
|
||||
return None
|
||||
|
||||
if path.is_dir():
|
||||
for childPath in (p for p in path.iterdir()):
|
||||
map = find_map_in_dir(name, childPath)
|
||||
if map is not None:
|
||||
return map
|
||||
|
||||
return None
|
||||
|
||||
|
||||
class Map:
|
||||
|
||||
def __init__(self, path: Path):
|
||||
|
|
|
@ -12,6 +12,7 @@ class ItemData(typing.NamedTuple):
|
|||
classification: ItemClassification = ItemClassification.useful
|
||||
quantity: int = 1
|
||||
parent_item: str = None
|
||||
origin: typing.Set[str] = {"wol"}
|
||||
|
||||
|
||||
class StarcraftWoLItem(Item):
|
||||
|
@ -43,23 +44,36 @@ item_table = {
|
|||
"Ghost": ItemData(15 + SC2WOL_ITEM_ID_OFFSET, "Unit", 15, classification=ItemClassification.progression),
|
||||
"Spectre": ItemData(16 + SC2WOL_ITEM_ID_OFFSET, "Unit", 16, classification=ItemClassification.progression),
|
||||
"Thor": ItemData(17 + SC2WOL_ITEM_ID_OFFSET, "Unit", 17, classification=ItemClassification.progression),
|
||||
# EE units
|
||||
"Liberator": ItemData(18 + SC2WOL_ITEM_ID_OFFSET, "Unit", 18, classification=ItemClassification.progression, origin={"nco", "ext"}),
|
||||
"Valkyrie": ItemData(19 + SC2WOL_ITEM_ID_OFFSET, "Unit", 19, classification=ItemClassification.progression, origin={"bw"}),
|
||||
"Widow Mine": ItemData(20 + SC2WOL_ITEM_ID_OFFSET, "Unit", 20, classification=ItemClassification.progression, origin={"ext"}),
|
||||
"Cyclone": ItemData(21 + SC2WOL_ITEM_ID_OFFSET, "Unit", 21, classification=ItemClassification.progression, origin={"ext"}),
|
||||
|
||||
# Some other items are moved to Upgrade group because of the way how the bot message is parsed
|
||||
"Progressive Infantry Weapon": ItemData(100 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, quantity=3),
|
||||
"Progressive Infantry Armor": ItemData(102 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, quantity=3),
|
||||
"Progressive Vehicle Weapon": ItemData(103 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, quantity=3),
|
||||
"Progressive Vehicle Armor": ItemData(104 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 6, quantity=3),
|
||||
"Progressive Ship Weapon": ItemData(105 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 8, quantity=3),
|
||||
"Progressive Ship Armor": ItemData(106 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 10, quantity=3),
|
||||
# Upgrade bundle 'number' values are used as indices to get affected 'number's
|
||||
"Progressive Weapon Upgrade": ItemData(107 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, quantity=3),
|
||||
"Progressive Armor Upgrade": ItemData(108 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 1, quantity=3),
|
||||
"Progressive Infantry Upgrade": ItemData(109 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, quantity=3),
|
||||
"Progressive Vehicle Upgrade": ItemData(110 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 3, quantity=3),
|
||||
"Progressive Ship Upgrade": ItemData(111 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, quantity=3),
|
||||
"Progressive Weapon/Armor Upgrade": ItemData(112 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 5, quantity=3),
|
||||
|
||||
"Projectile Accelerator (Bunker)": ItemData(200 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 0, parent_item="Bunker"),
|
||||
"Neosteel Bunker (Bunker)": ItemData(201 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 1, parent_item="Bunker"),
|
||||
"Titanium Housing (Missile Turret)": ItemData(202 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 2, classification=ItemClassification.filler, parent_item="Missile Turret"),
|
||||
"Hellstorm Batteries (Missile Turret)": ItemData(203 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 3, parent_item="Missile Turret"),
|
||||
"Advanced Construction (SCV)": ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4, parent_item="SCV"),
|
||||
"Dual-Fusion Welders (SCV)": ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5, parent_item="SCV"),
|
||||
"Advanced Construction (SCV)": ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4),
|
||||
"Dual-Fusion Welders (SCV)": ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5),
|
||||
"Fire-Suppression System (Building)": ItemData(206 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 6),
|
||||
"Orbital Command (Building)": ItemData(207 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 7),
|
||||
"Stimpack (Marine)": ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, parent_item="Marine"),
|
||||
"Progressive Stimpack (Marine)": ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 0, parent_item="Marine", quantity=2),
|
||||
"Combat Shield (Marine)": ItemData(209 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 9, classification=ItemClassification.progression, parent_item="Marine"),
|
||||
"Advanced Medic Facilities (Medic)": ItemData(210 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 10, classification=ItemClassification.filler, parent_item="Medic"),
|
||||
"Stabilizer Medpacks (Medic)": ItemData(211 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 11, classification=ItemClassification.progression, parent_item="Medic"),
|
||||
|
@ -69,10 +83,59 @@ item_table = {
|
|||
"Kinetic Foam (Marauder)": ItemData(215 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 15, parent_item="Marauder"),
|
||||
"U-238 Rounds (Reaper)": ItemData(216 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 16, parent_item="Reaper"),
|
||||
"G-4 Clusterbomb (Reaper)": ItemData(217 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 17, classification=ItemClassification.progression, parent_item="Reaper"),
|
||||
# Items from EE
|
||||
"Mag-Field Accelerators (Cyclone)": ItemData(218 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 18, parent_item="Cyclone", origin={"ext"}),
|
||||
"Mag-Field Launchers (Cyclone)": ItemData(219 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 19, parent_item="Cyclone", origin={"ext"}),
|
||||
# Items from new mod
|
||||
"Laser Targeting System (Marine)": ItemData(220 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, classification=ItemClassification.filler, parent_item="Marine", origin={"nco"}), # Freed slot from Stimpack
|
||||
"Magrail Munitions (Marine)": ItemData(221 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 20, parent_item="Marine", origin={"nco"}),
|
||||
"Optimized Logistics (Marine)": ItemData(222 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 21, classification=ItemClassification.filler, parent_item="Marine", origin={"nco"}),
|
||||
"Restoration (Medic)": ItemData(223 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 22, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}),
|
||||
"Optical Flare (Medic)": ItemData(224 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 23, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}),
|
||||
"Optimized Logistics (Medic)": ItemData(225 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 24, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}),
|
||||
"Progressive Stimpack (Firebat)": ItemData(226 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 6, parent_item="Firebat", quantity=2, origin={"bw"}),
|
||||
"Optimized Logistics (Firebat)": ItemData(227 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 25, parent_item="Firebat", origin={"bw"}),
|
||||
"Progressive Stimpack (Marauder)": ItemData(228 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 8, parent_item="Marauder", quantity=2, origin={"nco"}),
|
||||
"Laser Targeting System (Marauder)": ItemData(229 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 26, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}),
|
||||
"Magrail Munitions (Marauder)": ItemData(230 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 27, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}),
|
||||
"Internal Tech Module (Marauder)": ItemData(231 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 28, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}),
|
||||
|
||||
# Items from new mod
|
||||
"Progressive Stimpack (Reaper)": ItemData(250 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 10, parent_item="Reaper", quantity=2, origin={"nco"}),
|
||||
"Laser Targeting System (Reaper)": ItemData(251 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 0, classification=ItemClassification.filler, parent_item="Reaper", origin={"nco"}),
|
||||
"Advanced Cloaking Field (Reaper)": ItemData(252 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 1, parent_item="Reaper", origin={"nco"}),
|
||||
"Spider Mines (Reaper)": ItemData(253 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 2, classification=ItemClassification.filler, parent_item="Reaper", origin={"nco"}),
|
||||
"Combat Drugs (Reaper)": ItemData(254 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 3, classification=ItemClassification.filler, parent_item="Reaper", origin={"ext"}),
|
||||
"Hellbat Aspect (Hellion)": ItemData(255 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 4, parent_item="Hellion", origin={"nco"}),
|
||||
"Smart Servos (Hellion)": ItemData(256 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 5, parent_item="Hellion", origin={"nco"}),
|
||||
"Optimized Logistics (Hellion)": ItemData(257 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 6, classification=ItemClassification.filler, parent_item="Hellion", origin={"nco"}),
|
||||
"Jump Jets (Hellion)": ItemData(258 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 7, classification=ItemClassification.filler, parent_item="Hellion", origin={"nco"}),
|
||||
"Progressive Stimpack (Hellion)": ItemData(259 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 12, parent_item="Hellion", quantity=2, origin={"nco"}),
|
||||
"Ion Thrusters (Vulture)": ItemData(260 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 8, classification=ItemClassification.filler, parent_item="Vulture", origin={"bw"}),
|
||||
"Auto Launchers (Vulture)": ItemData(261 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 9, parent_item="Vulture", origin={"bw"}),
|
||||
"High Explosive Munition (Spider Mine)": ItemData(262 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 10, origin={"bw"}),
|
||||
"Jump Jets (Goliath)": ItemData(263 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 11, classification=ItemClassification.filler, parent_item="Goliath", origin={"nco"}),
|
||||
"Optimized Logistics (Goliath)": ItemData(264 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 12, classification=ItemClassification.filler, parent_item="Goliath", origin={"nco"}),
|
||||
"Hyperfluxor (Diamondback)": ItemData(265 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 13, parent_item="Diamondback", origin={"ext"}),
|
||||
"Burst Capacitors (Diamondback)": ItemData(266 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 14, classification=ItemClassification.filler, parent_item="Diamondback", origin={"ext"}),
|
||||
"Optimized Logistics (Diamondback)": ItemData(267 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 15, parent_item="Diamondback", origin={"ext"}),
|
||||
"Jump Jets (Siege Tank)": ItemData(268 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 16, parent_item="Siege Tank", origin={"nco"}),
|
||||
"Spider Mines (Siege Tank)": ItemData(269 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 17, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}),
|
||||
"Smart Servos (Siege Tank)": ItemData(270 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 18, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}),
|
||||
"Graduating Range (Siege Tank)": ItemData(271 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 19, classification=ItemClassification.progression, parent_item="Siege Tank", origin={"ext"}),
|
||||
"Laser Targeting System (Siege Tank)": ItemData(272 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 20, parent_item="Siege Tank", origin={"nco"}),
|
||||
"Advanced Siege Tech (Siege Tank)": ItemData(273 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 21, parent_item="Siege Tank", origin={"ext"}),
|
||||
"Internal Tech Module (Siege Tank)": ItemData(274 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 22, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}),
|
||||
"Optimized Logistics (Predator)": ItemData(275 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 23, classification=ItemClassification.filler, parent_item="Predator", origin={"ext"}),
|
||||
"Expanded Hull (Medivac)": ItemData(276 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 24, classification=ItemClassification.filler, parent_item="Medivac", origin={"ext"}),
|
||||
"Afterburners (Medivac)": ItemData(277 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 25, classification=ItemClassification.filler, parent_item="Medivac", origin={"ext"}),
|
||||
"Advanced Laser Technology (Wraith)": ItemData(278 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 26, classification=ItemClassification.progression, parent_item="Wraith", origin={"ext"}),
|
||||
"Smart Servos (Viking)": ItemData(279 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 27, parent_item="Viking", origin={"ext"}),
|
||||
"Magrail Munitions (Viking)": ItemData(280 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 28, parent_item="Viking", origin={"ext"}),
|
||||
|
||||
"Twin-Linked Flamethrower (Hellion)": ItemData(300 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 0, classification=ItemClassification.filler, parent_item="Hellion"),
|
||||
"Thermite Filaments (Hellion)": ItemData(301 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 1, parent_item="Hellion"),
|
||||
"Cerberus Mine (Vulture)": ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, classification=ItemClassification.filler, parent_item="Vulture"),
|
||||
"Cerberus Mine (Spider Mine)": ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, classification=ItemClassification.filler),
|
||||
"Replenishable Magazine (Vulture)": ItemData(303 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 3, classification=ItemClassification.filler, parent_item="Vulture"),
|
||||
"Multi-Lock Weapons System (Goliath)": ItemData(304 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 4, parent_item="Goliath"),
|
||||
"Ares-Class Targeting System (Goliath)": ItemData(305 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 5, parent_item="Goliath"),
|
||||
|
@ -86,7 +149,7 @@ item_table = {
|
|||
"Displacement Field (Wraith)": ItemData(313 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 13, classification=ItemClassification.filler, parent_item="Wraith"),
|
||||
"Ripwave Missiles (Viking)": ItemData(314 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 14, parent_item="Viking"),
|
||||
"Phobos-Class Weapons System (Viking)": ItemData(315 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 15, parent_item="Viking"),
|
||||
"Cross-Spectrum Dampeners (Banshee)": ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 16, classification=ItemClassification.filler, parent_item="Banshee"),
|
||||
"Progressive Cross-Spectrum Dampeners (Banshee)": ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 2, classification=ItemClassification.filler, parent_item="Banshee", quantity=2),
|
||||
"Shockwave Missile Battery (Banshee)": ItemData(317 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 17, parent_item="Banshee"),
|
||||
"Missile Pods (Battlecruiser)": ItemData(318 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 18, classification=ItemClassification.filler, parent_item="Battlecruiser"),
|
||||
"Defensive Matrix (Battlecruiser)": ItemData(319 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 19, classification=ItemClassification.filler, parent_item="Battlecruiser"),
|
||||
|
@ -96,6 +159,47 @@ item_table = {
|
|||
"Nyx-Class Cloaking Module (Spectre)": ItemData(323 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 23, parent_item="Spectre"),
|
||||
"330mm Barrage Cannon (Thor)": ItemData(324 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 24, classification=ItemClassification.filler, parent_item="Thor"),
|
||||
"Immortality Protocol (Thor)": ItemData(325 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 25, classification=ItemClassification.filler, parent_item="Thor"),
|
||||
# Items from EE
|
||||
"Advanced Ballistics (Liberator)": ItemData(326 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 26, parent_item="Liberator", origin={"ext"}),
|
||||
"Raid Artillery (Liberator)": ItemData(327 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 27, classification=ItemClassification.progression, parent_item="Liberator", origin={"nco"}),
|
||||
"Drilling Claws (Widow Mine)": ItemData(328 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 28, classification=ItemClassification.filler, parent_item="Widow Mine", origin={"ext"}),
|
||||
"Concealment (Widow Mine)": ItemData(329 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 29, classification=ItemClassification.progression, parent_item="Widow Mine", origin={"ext"}),
|
||||
|
||||
#Items from new mod
|
||||
"Hyperflight Rotors (Banshee)": ItemData(350 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 0, classification=ItemClassification.filler, parent_item="Banshee", origin={"ext"}),
|
||||
"Laser Targeting System (Banshee)": ItemData(351 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 1, classification=ItemClassification.filler, parent_item="Banshee", origin={"nco"}),
|
||||
"Internal Tech Module (Banshee)": ItemData(352 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 2, classification=ItemClassification.filler, parent_item="Banshee", origin={"nco"}),
|
||||
"Tactical Jump (Battlecruiser)": ItemData(353 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 3, parent_item="Battlecruiser", origin={"nco", "ext"}),
|
||||
"Cloak (Battlecruiser)": ItemData(354 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 4, parent_item="Battlecruiser", origin={"nco"}),
|
||||
"ATX Laser Battery (Battlecruiser)": ItemData(355 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 5, classification=ItemClassification.progression, parent_item="Battlecruiser", origin={"nco"}),
|
||||
"Optimized Logistics (Battlecruiser)": ItemData(356 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 6, classification=ItemClassification.filler, parent_item="Battlecruiser", origin={"ext"}),
|
||||
"Internal Tech Module (Battlecruiser)": ItemData(357 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 7, classification=ItemClassification.filler, parent_item="Battlecruiser", origin={"nco"}),
|
||||
"EMP Rounds (Ghost)": ItemData(358 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 8, parent_item="Ghost", origin={"ext"}),
|
||||
"Lockdown (Ghost)": ItemData(359 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 9, parent_item="Ghost", origin={"bw"}),
|
||||
"Impaler Rounds (Spectre)": ItemData(360 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 10, parent_item="Spectre", origin={"ext"}),
|
||||
"Progressive High Impact Payload (Thor)": ItemData(361 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 14, parent_item="Thor", quantity=2, origin={"ext"}), # L2 is Smart Servos
|
||||
"Bio Mechanical Repair Drone (Raven)": ItemData(363 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 13, parent_item="Raven", origin={"nco"}),
|
||||
"Spider Mines (Raven)": ItemData(364 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 14, parent_item="Raven", origin={"nco"}),
|
||||
"Railgun Turret (Raven)": ItemData(365 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 15, parent_item="Raven", origin={"nco"}),
|
||||
"Hunter-Seeker Weapon (Raven)": ItemData(366 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 16, parent_item="Raven", origin={"nco"}),
|
||||
"Interference Matrix (Raven)": ItemData(367 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 17, parent_item="Raven", origin={"ext"}),
|
||||
"Anti-Armor Missile (Raven)": ItemData(368 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 18, classification=ItemClassification.filler, parent_item="Raven", origin={"ext"}),
|
||||
"Internal Tech Module (Raven)": ItemData(369 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 19, classification=ItemClassification.filler, parent_item="Raven", origin={"nco"}),
|
||||
"EMP Shockwave (Science Vessel)": ItemData(370 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 20, parent_item="Science Vessel", origin={"bw"}),
|
||||
"Defensive Matrix (Science Vessel)": ItemData(371 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 21, parent_item="Science Vessel", origin={"bw"}),
|
||||
"Targeting Optics (Cyclone)": ItemData(372 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 22, parent_item="Cyclone", origin={"ext"}),
|
||||
"Rapid Fire Launchers (Cyclone)": ItemData(373 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 23, parent_item="Cyclone", origin={"ext"}),
|
||||
"Cloak (Liberator)": ItemData(374 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 24, classification=ItemClassification.filler, parent_item="Liberator", origin={"nco"}),
|
||||
"Laser Targeting System (Liberator)": ItemData(375 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 25, classification=ItemClassification.filler, parent_item="Liberator", origin={"ext"}),
|
||||
"Optimized Logistics (Liberator)": ItemData(376 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 26, classification=ItemClassification.filler, parent_item="Liberator", origin={"nco"}),
|
||||
"Black Market Launchers (Widow Mine)": ItemData(377 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 27, classification=ItemClassification.filler, parent_item="Widow Mine", origin={"ext"}),
|
||||
"Executioner Missiles (Widow Mine)": ItemData(378 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 28, parent_item="Widow Mine", origin={"ext"}),
|
||||
|
||||
# Just lazy to create a new group for one unit
|
||||
"Enhanced Cluster Launchers (Valkyrie)": ItemData(379 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 17, parent_item="Valkyrie", origin={"ext"}),
|
||||
"Shaped Hull (Valkyrie)": ItemData(380 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 20, classification=ItemClassification.filler, parent_item="Valkyrie", origin={"ext"}),
|
||||
"Burst Lasers (Valkyrie)": ItemData(381 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 21, parent_item="Valkyrie", origin={"ext"}),
|
||||
"Afterburners (Valkyrie)": ItemData(382 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 22, classification=ItemClassification.filler, parent_item="Valkyrie", origin={"ext"}),
|
||||
|
||||
"Bunker": ItemData(400 + SC2WOL_ITEM_ID_OFFSET, "Building", 0, classification=ItemClassification.progression),
|
||||
"Missile Turret": ItemData(401 + SC2WOL_ITEM_ID_OFFSET, "Building", 1, classification=ItemClassification.progression),
|
||||
|
@ -120,14 +224,14 @@ item_table = {
|
|||
"Science Vessel": ItemData(607 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 7, classification=ItemClassification.progression),
|
||||
"Tech Reactor": ItemData(608 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 8),
|
||||
"Orbital Strike": ItemData(609 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 9),
|
||||
"Shrike Turret": ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, parent_item="Bunker"),
|
||||
"Fortified Bunker": ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, parent_item="Bunker"),
|
||||
"Shrike Turret (Bunker)": ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, parent_item="Bunker"),
|
||||
"Fortified Bunker (Bunker)": ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, parent_item="Bunker"),
|
||||
"Planetary Fortress": ItemData(612 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 12, classification=ItemClassification.progression),
|
||||
"Perdition Turret": ItemData(613 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 13, classification=ItemClassification.progression),
|
||||
"Predator": ItemData(614 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 14, classification=ItemClassification.filler),
|
||||
"Hercules": ItemData(615 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 15, classification=ItemClassification.progression),
|
||||
"Cellular Reactor": ItemData(616 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 16),
|
||||
"Regenerative Bio-Steel": ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 17),
|
||||
"Progressive Regenerative Bio-Steel": ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 4, quantity=2),
|
||||
"Hive Mind Emulator": ItemData(618 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 18, ItemClassification.progression),
|
||||
"Psi Disrupter": ItemData(619 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 19, classification=ItemClassification.progression),
|
||||
|
||||
|
@ -136,18 +240,24 @@ item_table = {
|
|||
"High Templar": ItemData(702 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 2, classification=ItemClassification.progression),
|
||||
"Dark Templar": ItemData(703 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 3, classification=ItemClassification.progression),
|
||||
"Immortal": ItemData(704 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 4, classification=ItemClassification.progression),
|
||||
"Colossus": ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 5, classification=ItemClassification.progression),
|
||||
"Phoenix": ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 6, classification=ItemClassification.progression),
|
||||
"Colossus": ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 5),
|
||||
"Phoenix": ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 6, classification=ItemClassification.filler),
|
||||
"Void Ray": ItemData(707 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 7, classification=ItemClassification.progression),
|
||||
"Carrier": ItemData(708 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 8, classification=ItemClassification.progression),
|
||||
|
||||
# Filler items to fill remaining spots
|
||||
"+15 Starting Minerals": ItemData(800 + SC2WOL_ITEM_ID_OFFSET, "Minerals", 15, quantity=0, classification=ItemClassification.filler),
|
||||
"+15 Starting Vespene": ItemData(801 + SC2WOL_ITEM_ID_OFFSET, "Vespene", 15, quantity=0, classification=ItemClassification.filler),
|
||||
# This Filler item isn't placed by the generator yet unless plando'd
|
||||
"+2 Starting Supply": ItemData(802 + SC2WOL_ITEM_ID_OFFSET, "Supply", 2, quantity=0, classification=ItemClassification.filler),
|
||||
# This item is used to "remove" location from the game. Never placed unless plando'd
|
||||
"Nothing": ItemData(803 + SC2WOL_ITEM_ID_OFFSET, "Nothing Group", 2, quantity=0, classification=ItemClassification.trap),
|
||||
|
||||
# "Keystone Piece": ItemData(850 + SC2WOL_ITEM_ID_OFFSET, "Goal", 0, quantity=0, classification=ItemClassification.progression_skip_balancing)
|
||||
}
|
||||
|
||||
def get_item_table(multiworld: MultiWorld, player: int):
|
||||
return item_table
|
||||
|
||||
basic_units = {
|
||||
'Marine',
|
||||
|
@ -172,10 +282,49 @@ def get_basic_units(multiworld: MultiWorld, player: int) -> typing.Set[str]:
|
|||
|
||||
|
||||
item_name_groups = {}
|
||||
for item, data in item_table.items():
|
||||
for item, data in get_full_item_list().items():
|
||||
item_name_groups.setdefault(data.type, []).append(item)
|
||||
if data.type in ("Armory 1", "Armory 2") and '(' in item:
|
||||
short_name = item[:item.find(' (')]
|
||||
item_name_groups[short_name] = [item]
|
||||
item_name_groups["Missions"] = ["Beat " + mission_name for mission_name in vanilla_mission_req_table]
|
||||
|
||||
|
||||
# Items that can be placed before resources if not already in
|
||||
# General upgrades and Mercs
|
||||
second_pass_placeable_items: typing.Tuple[str, ...] = (
|
||||
# Buildings without upgrades
|
||||
"Sensor Tower",
|
||||
"Hive Mind Emulator",
|
||||
"Psi Disrupter",
|
||||
"Perdition Turret",
|
||||
# General upgrades without any dependencies
|
||||
"Advanced Construction (SCV)",
|
||||
"Dual-Fusion Welders (SCV)",
|
||||
"Fire-Suppression System (Building)",
|
||||
"Orbital Command (Building)",
|
||||
"Ultra-Capacitors",
|
||||
"Vanadium Plating",
|
||||
"Orbital Depots",
|
||||
"Micro-Filtering",
|
||||
"Automated Refinery",
|
||||
"Command Center Reactor",
|
||||
"Tech Reactor",
|
||||
"Planetary Fortress",
|
||||
"Cellular Reactor",
|
||||
"Progressive Regenerative Bio-Steel", # Place only L1
|
||||
# Mercenaries
|
||||
"War Pigs",
|
||||
"Devil Dogs",
|
||||
"Hammer Securities",
|
||||
"Spartan Company",
|
||||
"Siege Breakers",
|
||||
"Hel's Angel",
|
||||
"Dusk Wings",
|
||||
"Jackson's Revenge"
|
||||
)
|
||||
|
||||
|
||||
filler_items: typing.Tuple[str, ...] = (
|
||||
'+15 Starting Minerals',
|
||||
'+15 Starting Vespene'
|
||||
|
@ -190,7 +339,10 @@ defense_ratings = {
|
|||
# Bunker w/ Marine/Marauder: 3,
|
||||
"Perdition Turret": 2,
|
||||
"Missile Turret": 2,
|
||||
"Vulture": 2
|
||||
"Vulture": 2,
|
||||
"Liberator": 2,
|
||||
"Widow Mine": 2
|
||||
# "Concealment (Widow Mine)": 1
|
||||
}
|
||||
zerg_defense_ratings = {
|
||||
"Perdition Turret": 2,
|
||||
|
@ -199,14 +351,61 @@ zerg_defense_ratings = {
|
|||
"Psi Disruptor": 3
|
||||
}
|
||||
|
||||
spider_mine_sources = {
|
||||
"Vulture",
|
||||
"Spider Mines (Reaper)",
|
||||
"Spider Mines (Siege Tank)",
|
||||
"Spider Mines (Raven)"
|
||||
}
|
||||
|
||||
progressive_if_nco = {
|
||||
"Progressive Stimpack (Marine)",
|
||||
"Progressive Stimpack (Firebat)",
|
||||
"Progressive Cross-Spectrum Dampeners (Banshee)",
|
||||
"Progressive Regenerative Bio-Steel"
|
||||
}
|
||||
|
||||
# 'number' values of upgrades for upgrade bundle items
|
||||
upgrade_numbers = [
|
||||
{0, 4, 8}, # Weapon
|
||||
{2, 6, 10}, # Armor
|
||||
{0, 2}, # Infantry
|
||||
{4, 6}, # Vehicle
|
||||
{8, 10}, # Starship
|
||||
{0, 2, 4, 6, 8, 10} # All
|
||||
]
|
||||
# Names of upgrades to be included for different options
|
||||
upgrade_included_names = [
|
||||
{ # Individual Items
|
||||
"Progressive Infantry Weapon",
|
||||
"Progressive Infantry Armor",
|
||||
"Progressive Vehicle Weapon",
|
||||
"Progressive Vehicle Armor",
|
||||
"Progressive Ship Weapon",
|
||||
"Progressive Ship Armor"
|
||||
},
|
||||
{ # Bundle Weapon And Armor
|
||||
"Progressive Weapon Upgrade",
|
||||
"Progressive Armor Upgrade"
|
||||
},
|
||||
{ # Bundle Unit Class
|
||||
"Progressive Infantry Upgrade",
|
||||
"Progressive Vehicle Upgrade",
|
||||
"Progressive Starship Upgrade"
|
||||
},
|
||||
{ # Bundle All
|
||||
"Progressive Weapon/Armor Upgrade"
|
||||
}
|
||||
]
|
||||
|
||||
lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if
|
||||
data.code}
|
||||
# Map type to expected int
|
||||
type_flaggroups: typing.Dict[str, int] = {
|
||||
"Unit": 0,
|
||||
"Upgrade": 1,
|
||||
"Armory 1": 2,
|
||||
"Armory 2": 3,
|
||||
"Upgrade": 1, # Weapon / Armor upgrades
|
||||
"Armory 1": 2, # Unit upgrades
|
||||
"Armory 2": 3, # Unit upgrades
|
||||
"Building": 4,
|
||||
"Mercenary": 5,
|
||||
"Laboratory": 6,
|
||||
|
@ -214,5 +413,9 @@ type_flaggroups: typing.Dict[str, int] = {
|
|||
"Minerals": 8,
|
||||
"Vespene": 9,
|
||||
"Supply": 10,
|
||||
"Goal": 11
|
||||
"Goal": 11,
|
||||
"Armory 3": 12, # Unit upgrades
|
||||
"Armory 4": 13, # Unit upgrades
|
||||
"Progressive Upgrade": 14, # Unit upgrades that exist multiple times (Stimpack / Super Stimpack)
|
||||
"Nothing Group": 15
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from enum import IntEnum
|
||||
from typing import List, Tuple, Optional, Callable, NamedTuple
|
||||
from BaseClasses import MultiWorld
|
||||
from .Options import get_option_value
|
||||
|
@ -11,10 +12,18 @@ class SC2WoLLocation(Location):
|
|||
game: str = "Starcraft2WoL"
|
||||
|
||||
|
||||
class LocationType(IntEnum):
|
||||
VICTORY = 0 # Winning a mission
|
||||
MISSION_PROGRESS = 1 # All tasks done for progressing the mission normally towards victory. All cleaning of expansion bases falls here
|
||||
BONUS = 2 # Bonus objective, getting a campaign or mission bonus in vanilla (credits, research, bonus units or resources)
|
||||
CHALLENGE = 3 # Challenging objectives, often harder than just completing a mission
|
||||
OPTIONAL_BOSS = 4 # Any boss that's not required to win the mission. All Brutalisks, Loki, etc.
|
||||
|
||||
class LocationData(NamedTuple):
|
||||
region: str
|
||||
name: str
|
||||
code: Optional[int]
|
||||
type: LocationType
|
||||
rule: Callable = lambda state: True
|
||||
|
||||
|
||||
|
@ -22,256 +31,473 @@ def get_locations(multiworld: Optional[MultiWorld], player: Optional[int]) -> Tu
|
|||
# Note: rules which are ended with or True are rules identified as needed later when restricted units is an option
|
||||
logic_level = get_option_value(multiworld, player, 'required_tactics')
|
||||
location_table: List[LocationData] = [
|
||||
LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100),
|
||||
LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101),
|
||||
LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102),
|
||||
LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103),
|
||||
LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104),
|
||||
LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105),
|
||||
LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106),
|
||||
LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200,
|
||||
LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100, LocationType.VICTORY),
|
||||
LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101, LocationType.BONUS),
|
||||
LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102, LocationType.BONUS),
|
||||
LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103, LocationType.BONUS),
|
||||
LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104, LocationType.BONUS),
|
||||
LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105, LocationType.BONUS),
|
||||
LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106, LocationType.BONUS),
|
||||
LocationData("Liberation Day", "Liberation Day: Special Delivery", SC2WOL_LOC_ID_OFFSET + 107, LocationType.MISSION_PROGRESS),
|
||||
LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201,
|
||||
LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300,
|
||||
LocationData("The Outlaws", "The Outlaws: North Resource Pickups", SC2WOL_LOC_ID_OFFSET + 202, LocationType.BONUS),
|
||||
LocationData("The Outlaws", "The Outlaws: Bunker", SC2WOL_LOC_ID_OFFSET + 203, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) >= 2 and
|
||||
(logic_level > 0 or state._sc2wol_has_anti_air(multiworld, player))),
|
||||
LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301),
|
||||
LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302,
|
||||
LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301, LocationType.BONUS),
|
||||
LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303,
|
||||
LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) >= 2),
|
||||
LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400,
|
||||
LocationData("Zero Hour", "Zero Hour: First Hatchery", SC2WOL_LOC_ID_OFFSET + 304, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Zero Hour", "Zero Hour: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 305, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Zero Hour", "Zero Hour: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 306, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Zero Hour", "Zero Hour: Fourth Hatchery", SC2WOL_LOC_ID_OFFSET + 307, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
(logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
|
||||
or state._sc2wol_has_competent_anti_air(multiworld, player))),
|
||||
LocationData("Evacuation", "Evacuation: First Chysalis", SC2WOL_LOC_ID_OFFSET + 401),
|
||||
LocationData("Evacuation", "Evacuation: Second Chysalis", SC2WOL_LOC_ID_OFFSET + 402,
|
||||
LocationData("Evacuation", "Evacuation: First Chrysalis", SC2WOL_LOC_ID_OFFSET + 401, LocationType.BONUS),
|
||||
LocationData("Evacuation", "Evacuation: Second Chrysalis", SC2WOL_LOC_ID_OFFSET + 402, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Evacuation", "Evacuation: Third Chysalis", SC2WOL_LOC_ID_OFFSET + 403,
|
||||
LocationData("Evacuation", "Evacuation: Third Chrysalis", SC2WOL_LOC_ID_OFFSET + 403, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500,
|
||||
LocationData("Evacuation", "Evacuation: Reach Hanson", SC2WOL_LOC_ID_OFFSET + 404, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Evacuation", "Evacuation: Secret Resource Stash", SC2WOL_LOC_ID_OFFSET + 405, LocationType.BONUS),
|
||||
LocationData("Evacuation", "Evacuation: Flawless", SC2WOL_LOC_ID_OFFSET + 406, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
|
||||
or state._sc2wol_has_competent_anti_air(multiworld, player))),
|
||||
LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 4 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501,
|
||||
LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502,
|
||||
LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600,
|
||||
LocationData("Outbreak", "Outbreak: North Infested Command Center", SC2WOL_LOC_ID_OFFSET + 503, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Outbreak", "Outbreak: South Infested Command Center", SC2WOL_LOC_ID_OFFSET + 504, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Outbreak", "Outbreak: Northwest Bar", SC2WOL_LOC_ID_OFFSET + 505, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Outbreak", "Outbreak: North Bar", SC2WOL_LOC_ID_OFFSET + 506, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Outbreak", "Outbreak: South Bar", SC2WOL_LOC_ID_OFFSET + 507, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and
|
||||
(state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601,
|
||||
LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602,
|
||||
LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603,
|
||||
LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700,
|
||||
LocationData("Safe Haven", "Safe Haven: First Terror Fleet", SC2WOL_LOC_ID_OFFSET + 604, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Safe Haven", "Safe Haven: Second Terror Fleet", SC2WOL_LOC_ID_OFFSET + 605, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Safe Haven", "Safe Haven: Third Terror Fleet", SC2WOL_LOC_ID_OFFSET + 606, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) >= 3),
|
||||
LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701,
|
||||
LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) >= 3),
|
||||
LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702,
|
||||
LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) >= 3),
|
||||
LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703,
|
||||
LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) >= 3),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800,
|
||||
LocationData("Haven's Fall", "Haven's Fall: Northeast Colony Base", SC2WOL_LOC_ID_OFFSET + 704, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_can_respond_to_colony_infestations),
|
||||
LocationData("Haven's Fall", "Haven's Fall: East Colony Base", SC2WOL_LOC_ID_OFFSET + 705, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_can_respond_to_colony_infestations),
|
||||
LocationData("Haven's Fall", "Haven's Fall: Middle Colony Base", SC2WOL_LOC_ID_OFFSET + 706, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_can_respond_to_colony_infestations),
|
||||
LocationData("Haven's Fall", "Haven's Fall: Southeast Colony Base", SC2WOL_LOC_ID_OFFSET + 707, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_can_respond_to_colony_infestations),
|
||||
LocationData("Haven's Fall", "Haven's Fall: Southwest Colony Base", SC2WOL_LOC_ID_OFFSET + 708, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_can_respond_to_colony_infestations),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
(logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
|
||||
or state._sc2wol_has_competent_anti_air(multiworld, player))),
|
||||
LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803,
|
||||
LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801, LocationType.BONUS),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802, LocationType.BONUS),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
(logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
|
||||
or state._sc2wol_has_competent_anti_air(multiworld, player))),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804,
|
||||
LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
(logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
|
||||
or state._sc2wol_has_competent_anti_air(multiworld, player))),
|
||||
LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900,
|
||||
LocationData("Smash and Grab", "Smash and Grab: First Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 805, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
(logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
|
||||
or state._sc2wol_has_competent_anti_air(multiworld, player))),
|
||||
LocationData("Smash and Grab", "Smash and Grab: Second Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 806, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
(logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player)
|
||||
or state._sc2wol_has_competent_anti_air(multiworld, player))),
|
||||
LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_anti_air(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, False) >= 7),
|
||||
LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901,
|
||||
LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5),
|
||||
LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902,
|
||||
LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5),
|
||||
LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903,
|
||||
LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000,
|
||||
LocationData("The Dig", "The Dig: Moebius Base", SC2WOL_LOC_ID_OFFSET + 904, LocationType.MISSION_PROGRESS),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_anti_air(multiworld, player) and
|
||||
(state._sc2wol_has_air(multiworld, player)
|
||||
or state.has_any({'Medivac', 'Hercules'}, player)
|
||||
and state._sc2wol_has_common_unit(multiworld, player))),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003,
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: 1st Data Core", SC2WOL_LOC_ID_OFFSET + 1001, LocationType.MISSION_PROGRESS),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: 2nd Data Core", SC2WOL_LOC_ID_OFFSET + 1002, LocationType.MISSION_PROGRESS,
|
||||
lambda state: (state._sc2wol_has_air(multiworld, player)
|
||||
or state.has_any({'Medivac', 'Hercules'}, player)
|
||||
and state._sc2wol_has_common_unit(multiworld, player))),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004,
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005,
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006,
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007,
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_able_to_rescue(multiworld, player)),
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008,
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008, LocationType.OPTIONAL_BOSS,
|
||||
lambda state: state._sc2wol_has_anti_air(multiworld, player) and
|
||||
(state._sc2wol_has_air(multiworld, player)
|
||||
or state.has_any({'Medivac', 'Hercules'}, player)
|
||||
and state._sc2wol_has_common_unit(multiworld, player))),
|
||||
LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100,
|
||||
LocationData("The Moebius Factor", "The Moebius Factor: 3rd Data Core", SC2WOL_LOC_ID_OFFSET + 1009, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_anti_air(multiworld, player) and
|
||||
(state._sc2wol_has_air(multiworld, player)
|
||||
or state.has_any({'Medivac', 'Hercules'}, player)
|
||||
and state._sc2wol_has_common_unit(multiworld, player))),
|
||||
LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101),
|
||||
LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102),
|
||||
LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103,
|
||||
LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101, LocationType.BONUS),
|
||||
LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102, LocationType.BONUS),
|
||||
LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104,
|
||||
LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200,
|
||||
LocationData("Supernova", "Supernova: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1105, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Supernova", "Supernova: Middle Base", SC2WOL_LOC_ID_OFFSET + 1106, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Supernova", "Supernova: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1107, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202,
|
||||
LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203,
|
||||
LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204,
|
||||
LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205,
|
||||
LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300,
|
||||
LocationData("Maw of the Void", "Maw of the Void: Mothership", SC2WOL_LOC_ID_OFFSET + 1206, LocationType.OPTIONAL_BOSS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Expansion Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1207, LocationType.MISSION_PROGRESS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Middle Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1208, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Southeast Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1209, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Stargate Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1210, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Northwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1211, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: West Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1212, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Maw of the Void", "Maw of the Void: Southwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1213, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_survives_rip_field(multiworld, player)),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300, LocationType.VICTORY,
|
||||
lambda state: logic_level > 0 or
|
||||
state._sc2wol_has_anti_air(multiworld, player) and (
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302,
|
||||
LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301, LocationType.BONUS),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302, LocationType.OPTIONAL_BOSS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
state._sc2wol_has_competent_anti_air(multiworld, player)),
|
||||
LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500),
|
||||
LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501),
|
||||
LocationData("Breakout", "Breakout: Siegetank Prison", SC2WOL_LOC_ID_OFFSET + 1502),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700,
|
||||
LocationData("Devil's Playground", "Devil's Playground: North Reapers", SC2WOL_LOC_ID_OFFSET + 1303, LocationType.BONUS),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Middle Reapers", SC2WOL_LOC_ID_OFFSET + 1304, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Southwest Reapers", SC2WOL_LOC_ID_OFFSET + 1305, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)),
|
||||
LocationData("Devil's Playground", "Devil's Playground: Southeast Reapers", SC2WOL_LOC_ID_OFFSET + 1306, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or
|
||||
state._sc2wol_has_anti_air(multiworld, player) and (
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Devil's Playground", "Devil's Playground: East Reapers", SC2WOL_LOC_ID_OFFSET + 1307, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_anti_air(multiworld, player) and
|
||||
(logic_level > 0 or
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401, LocationType.BONUS),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Middle Base", SC2WOL_LOC_ID_OFFSET + 1404, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Main Base", SC2WOL_LOC_ID_OFFSET + 1405, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
|
||||
and state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: No Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1406, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
|
||||
and state._sc2wol_has_competent_ground_to_air(multiworld, player)
|
||||
and state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 1 Terrazine Node Sealed", SC2WOL_LOC_ID_OFFSET + 1407, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
|
||||
and state._sc2wol_has_competent_ground_to_air(multiworld, player)
|
||||
and state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 2 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1408, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
|
||||
and state._sc2wol_beats_protoss_deathball(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 3 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1409, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)
|
||||
and state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 4 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1410, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
|
||||
LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 5 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1411, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)),
|
||||
LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500, LocationType.VICTORY),
|
||||
LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501, LocationType.BONUS),
|
||||
LocationData("Breakout", "Breakout: Siege Tank Prison", SC2WOL_LOC_ID_OFFSET + 1502, LocationType.BONUS),
|
||||
LocationData("Breakout", "Breakout: First Checkpoint", SC2WOL_LOC_ID_OFFSET + 1503, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Breakout", "Breakout: Second Checkpoint", SC2WOL_LOC_ID_OFFSET + 1504, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600, LocationType.VICTORY),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603, LocationType.BONUS),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604, LocationType.BONUS),
|
||||
LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_train_killers(multiworld, player) and
|
||||
state._sc2wol_has_anti_air(multiworld, player)),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703),
|
||||
LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800,
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Close Diamondback", SC2WOL_LOC_ID_OFFSET + 1704, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Northwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1705, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: North Diamondback", SC2WOL_LOC_ID_OFFSET + 1706, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Northeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1707, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Southwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1708, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Southeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1709, LocationType.BONUS),
|
||||
LocationData("The Great Train Robbery", "The Great Train Robbery: Kill Team", SC2WOL_LOC_ID_OFFSET + 1710, LocationType.CHALLENGE,
|
||||
lambda state: (logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player)) and
|
||||
state._sc2wol_has_train_killers(multiworld, player) and
|
||||
state._sc2wol_has_anti_air(multiworld, player)),
|
||||
LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player) and
|
||||
(logic_level > 0 or state._sc2wol_has_anti_air)),
|
||||
LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801,
|
||||
LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802,
|
||||
LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803),
|
||||
LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804,
|
||||
LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803, LocationType.BONUS),
|
||||
LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900,
|
||||
LocationData("Cutthroat", "Cutthroat: North Command Center", SC2WOL_LOC_ID_OFFSET + 1805, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Cutthroat", "Cutthroat: South Command Center", SC2WOL_LOC_ID_OFFSET + 1806, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Cutthroat", "Cutthroat: West Command Center", SC2WOL_LOC_ID_OFFSET + 1807, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_common_unit(multiworld, player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902,
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902, LocationType.OPTIONAL_BOSS,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904,
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903, LocationType.BONUS),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905,
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000,
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: West Base", SC2WOL_LOC_ID_OFFSET + 1906, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Northwest Base", SC2WOL_LOC_ID_OFFSET + 1907, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Northeast Base", SC2WOL_LOC_ID_OFFSET + 1908, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Engine of Destruction", "Engine of Destruction: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1909, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and
|
||||
state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)),
|
||||
LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001,
|
||||
LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002,
|
||||
LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003,
|
||||
LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100,
|
||||
LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004, LocationType.BONUS),
|
||||
LocationData("Media Blitz", "Media Blitz: All Barracks", SC2WOL_LOC_ID_OFFSET + 2005, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Media Blitz", "Media Blitz: All Factories", SC2WOL_LOC_ID_OFFSET + 2006, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Media Blitz", "Media Blitz: All Starports", SC2WOL_LOC_ID_OFFSET + 2007, LocationType.MISSION_PROGRESS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Media Blitz", "Media Blitz: Odin Not Trashed", SC2WOL_LOC_ID_OFFSET + 2008, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102,
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101, LocationType.BONUS),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103,
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103,LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104,
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105,
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105, LocationType.OPTIONAL_BOSS,
|
||||
lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300,
|
||||
LocationData("Piercing the Shroud", "Piercing the Shroud: Fusion Reactor", SC2WOL_LOC_ID_OFFSET + 2106, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200, LocationType.VICTORY),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201, LocationType.BONUS),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202, LocationType.BONUS),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203, LocationType.BONUS),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: First Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2204, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Second Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2205, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Whispers of Doom", "Whispers of Doom: Third Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2206, LocationType.MISSION_PROGRESS),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301,
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302,
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303,
|
||||
lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400,
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Northeast Base", SC2WOL_LOC_ID_OFFSET + 2304, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Southeast Base", SC2WOL_LOC_ID_OFFSET + 2305, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Maar", SC2WOL_LOC_ID_OFFSET + 2306, LocationType.MISSION_PROGRESS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501,
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Northwest Preserver", SC2WOL_LOC_ID_OFFSET + 2307, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502,
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: Southwest Preserver", SC2WOL_LOC_ID_OFFSET + 2308, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("A Sinister Turn", "A Sinister Turn: East Preserver", SC2WOL_LOC_ID_OFFSET + 2309, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400, LocationType.VICTORY,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401, LocationType.BONUS),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402, LocationType.BONUS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Base", SC2WOL_LOC_ID_OFFSET + 2403, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Southwest Tendril", SC2WOL_LOC_ID_OFFSET + 2404, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Southeast Tendril", SC2WOL_LOC_ID_OFFSET + 2405, LocationType.MISSION_PROGRESS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Northeast Tendril", SC2WOL_LOC_ID_OFFSET + 2406, LocationType.MISSION_PROGRESS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("Echoes of the Future", "Echoes of the Future: Northwest Tendril", SC2WOL_LOC_ID_OFFSET + 2407, LocationType.MISSION_PROGRESS,
|
||||
lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500, LocationType.VICTORY),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502, LocationType.CHALLENGE,
|
||||
lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600,
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Urun", SC2WOL_LOC_ID_OFFSET + 2503, LocationType.MISSION_PROGRESS),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Mohandar", SC2WOL_LOC_ID_OFFSET + 2504, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Selendis", SC2WOL_LOC_ID_OFFSET + 2505, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("In Utter Darkness", "In Utter Darkness: Artanis", SC2WOL_LOC_ID_OFFSET + 2506, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)),
|
||||
LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) > 6),
|
||||
LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601,
|
||||
LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) > 6),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800,
|
||||
LocationData("Gates of Hell", "Gates of Hell: 2 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2602, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) > 6),
|
||||
LocationData("Gates of Hell", "Gates of Hell: 4 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2603, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) > 6),
|
||||
LocationData("Gates of Hell", "Gates of Hell: 6 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2604, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) > 6),
|
||||
LocationData("Gates of Hell", "Gates of Hell: 8 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2605, LocationType.BONUS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player) and
|
||||
state._sc2wol_defense_rating(multiworld, player, True) > 6),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700, LocationType.VICTORY),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703, LocationType.MISSION_PROGRESS),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 2704, LocationType.BONUS),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 2705, LocationType.BONUS),
|
||||
LocationData("Belly of the Beast", "Belly of the Beast: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 2706, LocationType.BONUS),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801,
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802,
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803,
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804,
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805,
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, LocationType.OPTIONAL_BOSS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("All-In", "All-In: Victory", None,
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: East Hatchery", SC2WOL_LOC_ID_OFFSET + 2806, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: North Hatchery", SC2WOL_LOC_ID_OFFSET + 2807, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("Shatter the Sky", "Shatter the Sky: Mid Hatchery", SC2WOL_LOC_ID_OFFSET + 2808, LocationType.MISSION_PROGRESS,
|
||||
lambda state: state._sc2wol_has_competent_comp(multiworld, player)),
|
||||
LocationData("All-In", "All-In: Victory", None, LocationType.VICTORY,
|
||||
lambda state: state._sc2wol_final_mission_requirements(multiworld, player))
|
||||
]
|
||||
|
||||
|
|
|
@ -9,22 +9,38 @@ class SC2WoLLogic(LogicMixin):
|
|||
return self.has_any(get_basic_units(multiworld, player), player)
|
||||
|
||||
def _sc2wol_has_air(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self.has_any({'Viking', 'Wraith', 'Banshee'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0 \
|
||||
return self.has_any({'Viking', 'Wraith', 'Banshee', 'Battlecruiser'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0 \
|
||||
and self.has_any({'Hercules', 'Medivac'}, player) and self._sc2wol_has_common_unit(multiworld, player)
|
||||
|
||||
def _sc2wol_has_air_anti_air(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self.has('Viking', player) \
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Wraith', player)
|
||||
or self.has_all({'Wraith', 'Advanced Laser Technology (Wraith)'}, player) \
|
||||
or self.has_all({'Battlecruiser', 'ATX Laser Battery (Battlecruiser)'}, player) \
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Wraith', 'Valkyrie', 'Battlecruiser'}, player)
|
||||
|
||||
def _sc2wol_has_competent_anti_air(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
def _sc2wol_has_competent_ground_to_air(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self.has('Goliath', player) \
|
||||
or self.has('Marine', player) and self.has_any({'Medic', 'Medivac'}, player) \
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Cyclone', player)
|
||||
|
||||
def _sc2wol_has_competent_anti_air(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self._sc2wol_has_competent_ground_to_air(multiworld, player) \
|
||||
or self._sc2wol_has_air_anti_air(multiworld, player)
|
||||
|
||||
def _sc2wol_welcome_to_the_jungle_requirement(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return (
|
||||
self._sc2wol_has_common_unit(multiworld, player)
|
||||
and self._sc2wol_has_competent_ground_to_air(multiworld, player)
|
||||
) or (
|
||||
get_option_value(multiworld, player, 'required_tactics') > 0
|
||||
and self.has_any({'Marine', 'Vulture'}, player)
|
||||
and self._sc2wol_has_air_anti_air(multiworld, player)
|
||||
)
|
||||
|
||||
def _sc2wol_has_anti_air(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self.has_any({'Missile Turret', 'Thor', 'War Pigs', 'Spartan Company', "Hel's Angel", 'Battlecruiser', 'Marine', 'Wraith'}, player) \
|
||||
return self.has_any({'Missile Turret', 'Thor', 'War Pigs', 'Spartan Company', "Hel's Angel", 'Battlecruiser', 'Marine', 'Wraith', 'Valkyrie', 'Cyclone'}, player) \
|
||||
or self._sc2wol_has_competent_anti_air(multiworld, player) \
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre'}, player)
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre', 'Widow Mine', 'Liberator'}, player)
|
||||
|
||||
def _sc2wol_defense_rating(self, multiworld: MultiWorld, player: int, zerg_enemy: bool, air_enemy: bool = True) -> bool:
|
||||
defense_score = sum((defense_ratings[item] for item in defense_ratings if self.has(item, player)))
|
||||
|
@ -32,6 +48,10 @@ class SC2WoLLogic(LogicMixin):
|
|||
defense_score += 3
|
||||
if self.has_all({'Siege Tank', 'Maelstrom Rounds (Siege Tank)'}, player):
|
||||
defense_score += 2
|
||||
if self.has_all({'Siege Tank', 'Graduating Range (Siege Tank)'}, player):
|
||||
defense_score += 1
|
||||
if self.has_all({'Widow Mine', 'Concealment (Widow Mine)'}, player):
|
||||
defense_score += 1
|
||||
if zerg_enemy:
|
||||
defense_score += sum((zerg_defense_ratings[item] for item in zerg_defense_ratings if self.has(item, player)))
|
||||
if self.has('Firebat', player) and self.has('Bunker', player):
|
||||
|
@ -44,20 +64,27 @@ class SC2WoLLogic(LogicMixin):
|
|||
return defense_score
|
||||
|
||||
def _sc2wol_has_competent_comp(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return (self.has('Marine', player) or self.has('Marauder', player) and
|
||||
self._sc2wol_has_competent_anti_air(multiworld, player)) and self.has_any({'Medivac', 'Medic'}, player) or \
|
||||
self.has('Thor', player) or self.has("Banshee", player) and self._sc2wol_has_competent_anti_air(multiworld, player) or \
|
||||
self.has('Battlecruiser', player) and self._sc2wol_has_common_unit(multiworld, player) or \
|
||||
self.has('Siege Tank', player) and self._sc2wol_has_competent_anti_air(multiworld, player)
|
||||
return \
|
||||
(
|
||||
(
|
||||
self.has_any({'Marine', 'Marauder'}, player) and self.has_any({'Medivac', 'Medic'}, player)
|
||||
or self.has_any({'Thor', 'Banshee', 'Siege Tank'}, player)
|
||||
or self.has_all({'Liberator', 'Raid Artillery (Liberator)'}, player)
|
||||
) and self._sc2wol_has_competent_anti_air(multiworld, player)
|
||||
) \
|
||||
or \
|
||||
(
|
||||
self.has('Battlecruiser', player) and self._sc2wol_has_common_unit(multiworld, player)
|
||||
)
|
||||
|
||||
def _sc2wol_has_train_killers(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return (
|
||||
self.has_any({'Siege Tank', 'Diamondback', 'Marauder'}, player)
|
||||
self.has_any({'Siege Tank', 'Diamondback', 'Marauder', 'Cyclone'}, player)
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0
|
||||
and (
|
||||
self.has_all({'Reaper', "G-4 Clusterbomb"}, player)
|
||||
or self.has_all({'Spectre', 'Psionic Lash'}, player)
|
||||
or self.has('Vulture', player)
|
||||
or self.has_any({'Vulture', 'Liberator'}, player)
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -66,15 +93,17 @@ class SC2WoLLogic(LogicMixin):
|
|||
|
||||
def _sc2wol_has_protoss_common_units(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self.has_any({'Zealot', 'Immortal', 'Stalker', 'Dark Templar'}, player) \
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'High Templar', 'Dark Templar'}, player)
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('High Templar', player)
|
||||
|
||||
def _sc2wol_has_protoss_medium_units(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self._sc2wol_has_protoss_common_units(multiworld, player) and \
|
||||
self.has_any({'Stalker', 'Void Ray', 'Phoenix', 'Carrier'}, player) \
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'High Templar', 'Dark Templar'}, player)
|
||||
self.has_any({'Stalker', 'Void Ray', 'Carrier'}, player) \
|
||||
or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Dark Templar', player)
|
||||
|
||||
def _sc2wol_beats_protoss_deathball(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self.has_any({'Banshee', 'Battlecruiser'}, player) and self._sc2wol_has_competent_anti_air(multiworld, player) or \
|
||||
return (self.has_any({'Banshee', 'Battlecruiser'}, player) or
|
||||
self.has_all({'Liberator', 'Raid Artillery (Liberator)'}, player)) \
|
||||
and self._sc2wol_has_competent_anti_air(multiworld, player) or \
|
||||
self._sc2wol_has_competent_comp(multiworld, player) and self._sc2wol_has_air_anti_air(multiworld, player)
|
||||
|
||||
def _sc2wol_has_mm_upgrade(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
|
@ -89,6 +118,17 @@ class SC2WoLLogic(LogicMixin):
|
|||
def _sc2wol_has_nukes(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre'}, player)
|
||||
|
||||
def _sc2wol_can_respond_to_colony_infestations(self, multiworld: MultiWorld, player: int) -> bool:
|
||||
return self._sc2wol_has_common_unit(multiworld, player) \
|
||||
and self._sc2wol_has_competent_anti_air(multiworld, player) \
|
||||
and \
|
||||
(
|
||||
self._sc2wol_has_air_anti_air(multiworld, player) or
|
||||
self.has_any({'Battlecruiser', 'Valkyrie'}), player
|
||||
) \
|
||||
and \
|
||||
self._sc2wol_defense_rating(multiworld, player, True) >= 3
|
||||
|
||||
def _sc2wol_final_mission_requirements(self, multiworld: MultiWorld, player: int):
|
||||
beats_kerrigan = self.has_any({'Marine', 'Banshee', 'Ghost'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0
|
||||
if get_option_value(multiworld, player, 'all_in_map') == 0:
|
||||
|
@ -101,7 +141,7 @@ class SC2WoLLogic(LogicMixin):
|
|||
# Air
|
||||
defense_rating = self._sc2wol_defense_rating(multiworld, player, True, True)
|
||||
return defense_rating >= 8 and beats_kerrigan \
|
||||
and self.has_any({'Viking', 'Battlecruiser'}, player) \
|
||||
and self.has_any({'Viking', 'Battlecruiser', 'Valkyrie'}, player) \
|
||||
and self.has_any({'Hive Mind Emulator', 'Psi Disruptor', 'Missile Turret'}, player)
|
||||
|
||||
def _sc2wol_cleared_missions(self, multiworld: MultiWorld, player: int, mission_count: int) -> bool:
|
||||
|
|
|
@ -49,8 +49,8 @@ vanilla_shuffle_order = [
|
|||
FillMission(MissionPools.EASY, [2], "Artifact", completion_critical=True),
|
||||
FillMission(MissionPools.MEDIUM, [7], "Artifact", number=8, completion_critical=True),
|
||||
FillMission(MissionPools.HARD, [8], "Artifact", number=11, completion_critical=True),
|
||||
FillMission(MissionPools.HARD, [9], "Artifact", number=14, completion_critical=True),
|
||||
FillMission(MissionPools.HARD, [10], "Artifact", completion_critical=True),
|
||||
FillMission(MissionPools.HARD, [9], "Artifact", number=14, completion_critical=True, removal_priority=11),
|
||||
FillMission(MissionPools.HARD, [10], "Artifact", completion_critical=True, removal_priority=10),
|
||||
FillMission(MissionPools.MEDIUM, [2], "Covert", number=4),
|
||||
FillMission(MissionPools.MEDIUM, [12], "Covert"),
|
||||
FillMission(MissionPools.HARD, [13], "Covert", number=8, removal_priority=3),
|
||||
|
@ -58,7 +58,7 @@ vanilla_shuffle_order = [
|
|||
FillMission(MissionPools.MEDIUM, [2], "Rebellion", number=6),
|
||||
FillMission(MissionPools.HARD, [16], "Rebellion"),
|
||||
FillMission(MissionPools.HARD, [17], "Rebellion"),
|
||||
FillMission(MissionPools.HARD, [18], "Rebellion"),
|
||||
FillMission(MissionPools.HARD, [18], "Rebellion", removal_priority=12),
|
||||
FillMission(MissionPools.HARD, [19], "Rebellion", removal_priority=5),
|
||||
FillMission(MissionPools.MEDIUM, [8], "Prophecy", removal_priority=9),
|
||||
FillMission(MissionPools.HARD, [21], "Prophecy", removal_priority=8),
|
||||
|
@ -98,6 +98,13 @@ gauntlet_order = [
|
|||
FillMission(MissionPools.FINAL, [5], "Final", completion_critical=True)
|
||||
]
|
||||
|
||||
mini_gauntlet_order = [
|
||||
FillMission(MissionPools.STARTER, [-1], "I", completion_critical=True),
|
||||
FillMission(MissionPools.EASY, [0], "II", completion_critical=True),
|
||||
FillMission(MissionPools.MEDIUM, [1], "III", completion_critical=True),
|
||||
FillMission(MissionPools.FINAL, [2], "Final", completion_critical=True)
|
||||
]
|
||||
|
||||
grid_order = [
|
||||
FillMission(MissionPools.STARTER, [-1], "_1"),
|
||||
FillMission(MissionPools.EASY, [0], "_1"),
|
||||
|
@ -129,6 +136,13 @@ mini_grid_order = [
|
|||
FillMission(MissionPools.FINAL, [5, 7], "_3", or_requirements=True)
|
||||
]
|
||||
|
||||
tiny_grid_order = [
|
||||
FillMission(MissionPools.STARTER, [-1], "_1"),
|
||||
FillMission(MissionPools.MEDIUM, [0], "_1"),
|
||||
FillMission(MissionPools.EASY, [0], "_2"),
|
||||
FillMission(MissionPools.FINAL, [1, 2], "_2", or_requirements=True),
|
||||
]
|
||||
|
||||
blitz_order = [
|
||||
FillMission(MissionPools.STARTER, [-1], "I"),
|
||||
FillMission(MissionPools.EASY, [-1], "I"),
|
||||
|
@ -144,7 +158,17 @@ blitz_order = [
|
|||
FillMission(MissionPools.FINAL, [0, 1], "Final", number=5, or_requirements=True)
|
||||
]
|
||||
|
||||
mission_orders = [vanilla_shuffle_order, vanilla_shuffle_order, mini_campaign_order, grid_order, mini_grid_order, blitz_order, gauntlet_order]
|
||||
mission_orders = [
|
||||
vanilla_shuffle_order,
|
||||
vanilla_shuffle_order,
|
||||
mini_campaign_order,
|
||||
grid_order,
|
||||
mini_grid_order,
|
||||
blitz_order,
|
||||
gauntlet_order,
|
||||
mini_gauntlet_order,
|
||||
tiny_grid_order
|
||||
]
|
||||
|
||||
|
||||
vanilla_mission_req_table = {
|
||||
|
@ -190,7 +214,7 @@ starting_mission_locations = {
|
|||
"Whispers of Doom": "Whispers of Doom: Victory",
|
||||
"Belly of the Beast": "Belly of the Beast: Victory",
|
||||
"Zero Hour": "Zero Hour: First Group Rescued",
|
||||
"Evacuation": "Evacuation: First Chysalis",
|
||||
"Evacuation": "Evacuation: Reach Hanson",
|
||||
"Devil's Playground": "Devil's Playground: Tosh's Miners",
|
||||
"Smash and Grab": "Smash and Grab: First Relic",
|
||||
"The Great Train Robbery": "The Great Train Robbery: North Defiler"
|
||||
|
|
|
@ -3,31 +3,49 @@ from BaseClasses import MultiWorld
|
|||
from Options import Choice, Option, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range
|
||||
from .MissionTables import vanilla_mission_req_table
|
||||
|
||||
ORDER_VANILLA = 0
|
||||
ORDER_VANILLA_SHUFFLED = 1
|
||||
|
||||
class GameDifficulty(Choice):
|
||||
"""The difficulty of the campaign, affects enemy AI, starting units, and game speed."""
|
||||
"""
|
||||
The difficulty of the campaign, affects enemy AI, starting units, and game speed.
|
||||
|
||||
For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level
|
||||
lower than the vanilla game
|
||||
"""
|
||||
display_name = "Game Difficulty"
|
||||
option_casual = 0
|
||||
option_normal = 1
|
||||
option_hard = 2
|
||||
option_brutal = 3
|
||||
default = 1
|
||||
|
||||
class GameSpeed(Choice):
|
||||
"""Optional setting to override difficulty-based game speed."""
|
||||
display_name = "Game Speed"
|
||||
option_default = 0
|
||||
option_slower = 1
|
||||
option_slow = 2
|
||||
option_normal = 3
|
||||
option_fast = 4
|
||||
option_faster = 5
|
||||
default = option_default
|
||||
|
||||
class UpgradeBonus(Choice):
|
||||
"""Determines what lab upgrade to use, whether it is Ultra-Capacitors which boost attack speed with every weapon
|
||||
upgrade or Vanadium Plating which boosts life with every armor upgrade."""
|
||||
display_name = "Upgrade Bonus"
|
||||
option_ultra_capacitors = 0
|
||||
option_vanadium_plating = 1
|
||||
class FinalMap(Choice):
|
||||
"""
|
||||
Determines if the final map and goal of the campaign.
|
||||
All in: You need to beat All-in map
|
||||
Random Hard: A random hard mission is selected as a goal.
|
||||
Beat this mission in order to complete the game.
|
||||
All-in map won't be in the campaign
|
||||
|
||||
Vanilla mission order always ends with All in mission!
|
||||
|
||||
class BunkerUpgrade(Choice):
|
||||
"""Determines what bunker lab upgrade to use, whether it is Shrike Turret which outfits bunkers with an automated
|
||||
turret or Fortified Bunker which boosts the life of bunkers."""
|
||||
display_name = "Bunker Upgrade"
|
||||
option_shrike_turret = 0
|
||||
option_fortified_bunker = 1
|
||||
|
||||
This option is short-lived. It may be changed in the future
|
||||
"""
|
||||
display_name = "Final Map"
|
||||
option_all_in = 0
|
||||
option_random_hard = 1
|
||||
|
||||
class AllInMap(Choice):
|
||||
"""Determines what version of All-In (final map) that will be generated for the campaign."""
|
||||
|
@ -37,14 +55,18 @@ class AllInMap(Choice):
|
|||
|
||||
|
||||
class MissionOrder(Choice):
|
||||
"""Determines the order the missions are played in. The last three mission orders end in a random mission.
|
||||
"""
|
||||
Determines the order the missions are played in. The last three mission orders end in a random mission.
|
||||
Vanilla (29): Keeps the standard mission order and branching from the WoL Campaign.
|
||||
Vanilla Shuffled (29): Keeps same branching paths from the WoL Campaign but randomizes the order of missions within.
|
||||
Mini Campaign (15): Shorter version of the campaign with randomized missions and optional branches.
|
||||
Grid (16): A 4x4 grid of random missions. Start at the top-left and forge a path towards All-In.
|
||||
Grid (16): A 4x4 grid of random missions. Start at the top-left and forge a path towards bottom-right mission to win.
|
||||
Mini Grid (9): A 3x3 version of Grid. Complete the bottom-right mission to win.
|
||||
Blitz (12): 12 random missions that open up very quickly. Complete the bottom-right mission to win.
|
||||
Gauntlet (7): Linear series of 7 random missions to complete the campaign."""
|
||||
Gauntlet (7): Linear series of 7 random missions to complete the campaign.
|
||||
Mini Gauntlet (4): Linear series of 4 random missions to complete the campaign.
|
||||
Tiny Grid (4): A 2x2 version of Grid. Complete the bottom-right mission to win.
|
||||
"""
|
||||
display_name = "Mission Order"
|
||||
option_vanilla = 0
|
||||
option_vanilla_shuffled = 1
|
||||
|
@ -53,27 +75,53 @@ class MissionOrder(Choice):
|
|||
option_mini_grid = 4
|
||||
option_blitz = 5
|
||||
option_gauntlet = 6
|
||||
option_mini_gauntlet = 7
|
||||
option_tiny_grid = 8
|
||||
|
||||
|
||||
class PlayerColor(Choice):
|
||||
"""Determines in-game team color."""
|
||||
display_name = "Player Color"
|
||||
option_white = 0
|
||||
option_red = 1
|
||||
option_blue = 2
|
||||
option_teal = 3
|
||||
option_purple = 4
|
||||
option_yellow = 5
|
||||
option_orange = 6
|
||||
option_green = 7
|
||||
option_light_pink = 8
|
||||
option_violet = 9
|
||||
option_light_grey = 10
|
||||
option_dark_green = 11
|
||||
option_brown = 12
|
||||
option_light_green = 13
|
||||
option_dark_grey = 14
|
||||
option_pink = 15
|
||||
option_rainbow = 16
|
||||
option_default = 17
|
||||
default = option_default
|
||||
|
||||
|
||||
class ShuffleProtoss(DefaultOnToggle):
|
||||
"""Determines if the 3 protoss missions are included in the shuffle if Vanilla mission order is not enabled.
|
||||
If turned off with Vanilla Shuffled, the 3 protoss missions will be in their normal position on the Prophecy chain
|
||||
if not shuffled.
|
||||
If turned off with reduced mission settings, the 3 protoss missions will not appear and Protoss units are removed
|
||||
from the pool."""
|
||||
If turned off, the 3 protoss missions will not appear and Protoss units are removed from the pool."""
|
||||
display_name = "Shuffle Protoss Missions"
|
||||
|
||||
|
||||
class ShuffleNoBuild(DefaultOnToggle):
|
||||
"""Determines if the 5 no-build missions are included in the shuffle if Vanilla mission order is not enabled.
|
||||
If turned off with Vanilla Shuffled, one no-build mission will be placed as the first mission and the rest will be
|
||||
placed at the end of optional routes.
|
||||
If turned off with reduced mission settings, the 5 no-build missions will not appear."""
|
||||
If turned off, the 5 no-build missions will not appear."""
|
||||
display_name = "Shuffle No-Build Missions"
|
||||
|
||||
|
||||
class EarlyUnit(DefaultOnToggle):
|
||||
"""Guarantees that the first mission will contain a unit."""
|
||||
"""
|
||||
Guarantees that the first mission will contain a unit.
|
||||
|
||||
Each mission available to be the first mission has a pre-defined location where the unit should spawn.
|
||||
This location gets overriden over any exclusion. It's guaranteed to be reachable with an empty inventory.
|
||||
"""
|
||||
display_name = "Early Unit"
|
||||
|
||||
|
||||
|
@ -91,11 +139,97 @@ class RequiredTactics(Choice):
|
|||
|
||||
|
||||
class UnitsAlwaysHaveUpgrades(DefaultOnToggle):
|
||||
"""If turned on, both upgrades will be present for each unit and structure in the seed.
|
||||
This usually results in fewer units."""
|
||||
"""
|
||||
If turned on, all upgrades will be present for each unit and structure in the seed.
|
||||
This usually results in fewer units.
|
||||
|
||||
See also: Max Number of Upgrades
|
||||
"""
|
||||
display_name = "Units Always Have Upgrades"
|
||||
|
||||
|
||||
class GenericUpgradeMissions(Range):
|
||||
"""Determines the percentage of missions in the mission order that must be completed before
|
||||
level 1 of all weapon and armor upgrades is unlocked. Level 2 upgrades require double the amount of missions,
|
||||
and level 3 requires triple the amount. The required amounts are always rounded down.
|
||||
If set to 0, upgrades are instead added to the item pool and must be found to be used."""
|
||||
display_name = "Generic Upgrade Missions"
|
||||
range_start = 0
|
||||
range_end = 100
|
||||
default = 0
|
||||
|
||||
|
||||
class GenericUpgradeResearch(Choice):
|
||||
"""Determines how weapon and armor upgrades affect missions once unlocked.
|
||||
|
||||
Vanilla: Upgrades must be researched as normal.
|
||||
Auto In No-Build: In No-Build missions, upgrades are automatically researched.
|
||||
In all other missions, upgrades must be researched as normal.
|
||||
Auto In Build: In No-Build missions, upgrades are unavailable as normal.
|
||||
In all other missions, upgrades are automatically researched.
|
||||
Always Auto: Upgrades are automatically researched in all missions."""
|
||||
display_name = "Generic Upgrade Research"
|
||||
option_vanilla = 0
|
||||
option_auto_in_no_build = 1
|
||||
option_auto_in_build = 2
|
||||
option_always_auto = 3
|
||||
|
||||
|
||||
class GenericUpgradeItems(Choice):
|
||||
"""Determines how weapon and armor upgrades are split into items. All options produce 3 levels of each item.
|
||||
Does nothing if upgrades are unlocked by completed mission counts.
|
||||
|
||||
Individual Items: All weapon and armor upgrades are each an item,
|
||||
resulting in 18 total upgrade items.
|
||||
Bundle Weapon And Armor: All types of weapon upgrades are one item,
|
||||
and all types of armor upgrades are one item,
|
||||
resulting in 6 total items.
|
||||
Bundle Unit Class: Weapon and armor upgrades are merged,
|
||||
but Infantry, Vehicle, and Starship upgrades are bundled separately,
|
||||
resulting in 9 total items.
|
||||
Bundle All: All weapon and armor upgrades are one item,
|
||||
resulting in 3 total items."""
|
||||
display_name = "Generic Upgrade Items"
|
||||
option_individual_items = 0
|
||||
option_bundle_weapon_and_armor = 1
|
||||
option_bundle_unit_class = 2
|
||||
option_bundle_all = 3
|
||||
|
||||
|
||||
class NovaCovertOpsItems(Toggle):
|
||||
"""If turned on, the equipment upgrades from Nova Covert Ops may be present in the world."""
|
||||
display_name = "Nova Covert Ops Items"
|
||||
default = Toggle.option_true
|
||||
|
||||
|
||||
class BroodWarItems(Toggle):
|
||||
"""If turned on, returning items from StarCraft: Brood War may appear in the world."""
|
||||
display_name = "Brood War Items"
|
||||
default = Toggle.option_true
|
||||
|
||||
|
||||
class ExtendedItems(Toggle):
|
||||
"""If turned on, original items that did not appear in Campaign mode may appear in the world."""
|
||||
display_name = "Extended Items"
|
||||
default = Toggle.option_true
|
||||
|
||||
|
||||
class MaxNumberOfUpgrades(Range):
|
||||
"""
|
||||
Set a maximum to the number of upgrades a unit/structure can have. -1 is used to define unlimited.
|
||||
Note that most unit have 4 or 6 upgrades.
|
||||
|
||||
If used with Units Always Have Upgrades, each unit has this given amount of upgrades (if there enough upgrades exist)
|
||||
|
||||
See also: Units Always Have Upgrades
|
||||
"""
|
||||
display_name = "Maximum number of upgrades per unit/structure"
|
||||
range_start = -1
|
||||
# Do not know the maximum, but it is less than 123!
|
||||
range_end = 123
|
||||
default = -1
|
||||
|
||||
|
||||
class LockedItems(ItemSet):
|
||||
"""Guarantees that these items will be unlockable"""
|
||||
display_name = "Locked Items"
|
||||
|
@ -108,27 +242,114 @@ class ExcludedItems(ItemSet):
|
|||
|
||||
class ExcludedMissions(OptionSet):
|
||||
"""Guarantees that these missions will not appear in the campaign
|
||||
Only applies on shortened mission orders.
|
||||
Doesn't apply to vanilla mission order.
|
||||
It may be impossible to build a valid campaign if too many missions are excluded."""
|
||||
display_name = "Excluded Missions"
|
||||
valid_keys = {mission_name for mission_name in vanilla_mission_req_table.keys() if mission_name != 'All-In'}
|
||||
|
||||
|
||||
class LocationInclusion(Choice):
|
||||
option_enabled = 0
|
||||
option_trash = 1
|
||||
option_nothing = 2
|
||||
|
||||
|
||||
class MissionProgressLocations(LocationInclusion):
|
||||
"""
|
||||
Enables or disables item rewards for progressing (not finishing) a mission.
|
||||
Progressing a mission is usually a task of completing or progressing into a main objective.
|
||||
Clearing an expansion base also counts here.
|
||||
|
||||
Enabled: All locations fitting into this do their normal rewards
|
||||
Trash: Forces a trash item in
|
||||
Nothing: No rewards for this type of tasks, effectively disabling such locations
|
||||
|
||||
Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
|
||||
Warning: The generation may fail if too many locations are excluded by this way.
|
||||
See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
|
||||
"""
|
||||
display_name = "Mission Progress Locations"
|
||||
|
||||
|
||||
class BonusLocations(LocationInclusion):
|
||||
"""
|
||||
Enables or disables item rewards for completing bonus tasks.
|
||||
Bonus tasks are those giving you a campaign-wide or mission-wide bonus in vanilla game:
|
||||
Research, credits, bonus units or resources, etc.
|
||||
|
||||
Enabled: All locations fitting into this do their normal rewards
|
||||
Trash: Forces a trash item in
|
||||
Nothing: No rewards for this type of tasks, effectively disabling such locations
|
||||
|
||||
Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
|
||||
Warning: The generation may fail if too many locations are excluded by this way.
|
||||
See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
|
||||
"""
|
||||
display_name = "Bonus Locations"
|
||||
|
||||
|
||||
class ChallengeLocations(LocationInclusion):
|
||||
"""
|
||||
Enables or disables item rewards for completing challenge tasks.
|
||||
Challenges are tasks that have usually higher requirements to be completed
|
||||
than to complete the mission they're in successfully.
|
||||
You might be required to visit the same mission later when getting stronger in order to finish these tasks.
|
||||
|
||||
Enabled: All locations fitting into this do their normal rewards
|
||||
Trash: Forces a trash item in
|
||||
Nothing: No rewards for this type of tasks, effectively disabling such locations
|
||||
|
||||
Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
|
||||
Warning: The generation may fail if too many locations are excluded by this way.
|
||||
See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
|
||||
"""
|
||||
display_name = "Challenge Locations"
|
||||
|
||||
|
||||
class OptionalBossLocations(LocationInclusion):
|
||||
"""
|
||||
Enables or disables item rewards for defeating optional bosses.
|
||||
An optional boss is any boss that's not required to kill in order to finish the mission successfully.
|
||||
All Brutalisks, Loki, etc. belongs here.
|
||||
|
||||
Enabled: All locations fitting into this do their normal rewards
|
||||
Trash: Forces a trash item in
|
||||
Nothing: No rewards for this type of tasks, effectively disabling such locations
|
||||
|
||||
Note: Individual locations subject to plando are always enabled, so the plando can be placed properly.
|
||||
Warning: The generation may fail if too many locations are excluded by this way.
|
||||
See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando)
|
||||
"""
|
||||
display_name = "Challenge Locations"
|
||||
|
||||
|
||||
# noinspection PyTypeChecker
|
||||
sc2wol_options: Dict[str, Option] = {
|
||||
"game_difficulty": GameDifficulty,
|
||||
"upgrade_bonus": UpgradeBonus,
|
||||
"bunker_upgrade": BunkerUpgrade,
|
||||
"game_speed": GameSpeed,
|
||||
"all_in_map": AllInMap,
|
||||
"final_map": FinalMap,
|
||||
"mission_order": MissionOrder,
|
||||
"player_color": PlayerColor,
|
||||
"shuffle_protoss": ShuffleProtoss,
|
||||
"shuffle_no_build": ShuffleNoBuild,
|
||||
"early_unit": EarlyUnit,
|
||||
"required_tactics": RequiredTactics,
|
||||
"units_always_have_upgrades": UnitsAlwaysHaveUpgrades,
|
||||
"max_number_of_upgrades": MaxNumberOfUpgrades,
|
||||
"generic_upgrade_missions": GenericUpgradeMissions,
|
||||
"generic_upgrade_research": GenericUpgradeResearch,
|
||||
"generic_upgrade_items": GenericUpgradeItems,
|
||||
"locked_items": LockedItems,
|
||||
"excluded_items": ExcludedItems,
|
||||
"excluded_missions": ExcludedMissions
|
||||
"excluded_missions": ExcludedMissions,
|
||||
"nco_items": NovaCovertOpsItems,
|
||||
"bw_items": BroodWarItems,
|
||||
"ext_items": ExtendedItems,
|
||||
"mission_progress_locations": MissionProgressLocations,
|
||||
"bonus_locations": BonusLocations,
|
||||
"challenge_locations": ChallengeLocations,
|
||||
"optional_boss_locations": OptionalBossLocations
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
from typing import Callable, Dict, List, Set
|
||||
from BaseClasses import MultiWorld, ItemClassification, Item, Location
|
||||
from .Items import item_table
|
||||
from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, filler_items
|
||||
from .MissionTables import no_build_regions_list, easy_regions_list, medium_regions_list, hard_regions_list,\
|
||||
mission_orders, MissionInfo, alt_final_mission_locations, MissionPools
|
||||
from .Options import get_option_value
|
||||
from .Options import get_option_value, MissionOrder, FinalMap, MissionProgressLocations, LocationInclusion
|
||||
from .LogicMixin import SC2WoLLogic
|
||||
|
||||
# Items with associated upgrades
|
||||
UPGRADABLE_ITEMS = [
|
||||
"Marine", "Medic", "Firebat", "Marauder", "Reaper", "Ghost", "Spectre",
|
||||
"Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor",
|
||||
"Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser",
|
||||
"Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator", "Widow Mine", "Cyclone",
|
||||
"Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Raven", "Science Vessel", "Liberator", "Valkyrie",
|
||||
"Bunker", "Missile Turret"
|
||||
]
|
||||
|
||||
BARRACKS_UNITS = {"Marine", "Medic", "Firebat", "Marauder", "Reaper", "Ghost", "Spectre"}
|
||||
FACTORY_UNITS = {"Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator"}
|
||||
STARPORT_UNITS = {"Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Hercules", "Science Vessel", "Raven"}
|
||||
FACTORY_UNITS = {"Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator", "Widow Mine"}
|
||||
STARPORT_UNITS = {"Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Hercules", "Science Vessel", "Raven", "Liberator", "Valkyrie"}
|
||||
|
||||
PROTOSS_REGIONS = {"A Sinister Turn", "Echoes of the Future", "In Utter Darkness"}
|
||||
|
||||
|
@ -30,7 +30,7 @@ def filter_missions(multiworld: MultiWorld, player: int) -> Dict[int, List[str]]
|
|||
shuffle_no_build = get_option_value(multiworld, player, "shuffle_no_build")
|
||||
shuffle_protoss = get_option_value(multiworld, player, "shuffle_protoss")
|
||||
excluded_missions = get_option_value(multiworld, player, "excluded_missions")
|
||||
mission_count = len(mission_orders[mission_order_type]) - 1
|
||||
final_map = get_option_value(multiworld, player, "final_map")
|
||||
mission_pools = {
|
||||
MissionPools.STARTER: no_build_regions_list[:],
|
||||
MissionPools.EASY: easy_regions_list[:],
|
||||
|
@ -38,21 +38,18 @@ def filter_missions(multiworld: MultiWorld, player: int) -> Dict[int, List[str]]
|
|||
MissionPools.HARD: hard_regions_list[:],
|
||||
MissionPools.FINAL: []
|
||||
}
|
||||
if mission_order_type == 0:
|
||||
if mission_order_type == MissionOrder.option_vanilla:
|
||||
# Vanilla uses the entire mission pool
|
||||
mission_pools[MissionPools.FINAL] = ['All-In']
|
||||
return mission_pools
|
||||
elif mission_order_type == 1:
|
||||
# Vanilla Shuffled ignores the player-provided excluded missions
|
||||
excluded_missions = set()
|
||||
# Omitting No-Build missions if not shuffling no-build
|
||||
if not shuffle_no_build:
|
||||
excluded_missions = excluded_missions.union(no_build_regions_list)
|
||||
# Omitting Protoss missions if not shuffling protoss
|
||||
if not shuffle_protoss:
|
||||
excluded_missions = excluded_missions.union(PROTOSS_REGIONS)
|
||||
# Replacing All-In on low mission counts
|
||||
if mission_count < 14:
|
||||
# Replacing All-In with alternate ending depending on option
|
||||
if final_map == FinalMap.option_random_hard:
|
||||
final_mission = multiworld.random.choice([mission for mission in alt_final_mission_locations.keys() if mission not in excluded_missions])
|
||||
excluded_missions.add(final_mission)
|
||||
else:
|
||||
|
@ -92,10 +89,18 @@ def get_item_upgrades(inventory: List[Item], parent_item: Item or str):
|
|||
item_name = parent_item.name if isinstance(parent_item, Item) else parent_item
|
||||
return [
|
||||
inv_item for inv_item in inventory
|
||||
if item_table[inv_item.name].parent_item == item_name
|
||||
if get_full_item_list()[inv_item.name].parent_item == item_name
|
||||
]
|
||||
|
||||
|
||||
def get_item_quantity(item):
|
||||
return get_full_item_list()[item.name].quantity
|
||||
|
||||
|
||||
def copy_item(item: Item):
|
||||
return Item(item.name, item.classification, item.code, item.player)
|
||||
|
||||
|
||||
class ValidInventory:
|
||||
|
||||
def has(self, item: str, player: int):
|
||||
|
@ -124,22 +129,6 @@ class ValidInventory:
|
|||
cascade_keys = self.cascade_removal_map.keys()
|
||||
units_always_have_upgrades = get_option_value(self.multiworld, self.player, "units_always_have_upgrades")
|
||||
|
||||
# Locking associated items for items that have already been placed when units_always_have_upgrades is on
|
||||
if units_always_have_upgrades:
|
||||
existing_items = self.existing_items[:]
|
||||
while existing_items:
|
||||
existing_item = existing_items.pop()
|
||||
items_to_lock = self.cascade_removal_map.get(existing_item, [existing_item])
|
||||
for item in items_to_lock:
|
||||
if item in inventory:
|
||||
inventory.remove(item)
|
||||
locked_items.append(item)
|
||||
if item in existing_items:
|
||||
existing_items.remove(item)
|
||||
|
||||
if self.min_units_per_structure > 0 and self.has_units_per_structure():
|
||||
requirements.append(lambda state: state.has_units_per_structure())
|
||||
|
||||
def attempt_removal(item: Item) -> bool:
|
||||
# If item can be removed and has associated items, remove them as well
|
||||
inventory.remove(item)
|
||||
|
@ -149,10 +138,78 @@ class ValidInventory:
|
|||
if not all(requirement(self) for requirement in requirements):
|
||||
# If item cannot be removed, lock or revert
|
||||
self.logical_inventory.add(item.name)
|
||||
locked_items.append(item)
|
||||
for _ in range(get_item_quantity(item)):
|
||||
locked_items.append(copy_item(item))
|
||||
return False
|
||||
return True
|
||||
|
||||
# Limit the maximum number of upgrades
|
||||
maxUpgrad = get_option_value(self.multiworld, self.player,
|
||||
"max_number_of_upgrades")
|
||||
if maxUpgrad != -1:
|
||||
unit_avail_upgrades = {}
|
||||
# Needed to take into account locked/existing items
|
||||
unit_nb_upgrades = {}
|
||||
for item in inventory:
|
||||
cItem = get_full_item_list()[item.name]
|
||||
if cItem.type in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades:
|
||||
unit_avail_upgrades[item.name] = []
|
||||
unit_nb_upgrades[item.name] = 0
|
||||
elif cItem.parent_item is not None:
|
||||
if cItem.parent_item not in unit_avail_upgrades:
|
||||
unit_avail_upgrades[cItem.parent_item] = [item]
|
||||
unit_nb_upgrades[cItem.parent_item] = 1
|
||||
else:
|
||||
unit_avail_upgrades[cItem.parent_item].append(item)
|
||||
unit_nb_upgrades[cItem.parent_item] += 1
|
||||
# For those two categories, we count them but dont include them in removal
|
||||
for item in locked_items + self.existing_items:
|
||||
cItem = get_full_item_list()[item.name]
|
||||
if cItem.type in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades:
|
||||
unit_avail_upgrades[item.name] = []
|
||||
unit_nb_upgrades[item.name] = 0
|
||||
elif cItem.parent_item is not None:
|
||||
if cItem.parent_item not in unit_avail_upgrades:
|
||||
unit_nb_upgrades[cItem.parent_item] = 1
|
||||
else:
|
||||
unit_nb_upgrades[cItem.parent_item] += 1
|
||||
# Making sure that the upgrades being removed is random
|
||||
# Currently, only for combat shield vs Stabilizer Medpacks...
|
||||
shuffled_unit_upgrade_list = list(unit_avail_upgrades.keys())
|
||||
self.multiworld.random.shuffle(shuffled_unit_upgrade_list)
|
||||
for unit in shuffled_unit_upgrade_list:
|
||||
while (unit_nb_upgrades[unit] > maxUpgrad) \
|
||||
and (len(unit_avail_upgrades[unit]) > 0):
|
||||
itemCandidate = self.multiworld.random.choice(unit_avail_upgrades[unit])
|
||||
_ = attempt_removal(itemCandidate)
|
||||
# Whatever it succeed to remove the iventory or it fails and thus
|
||||
# lock it, the upgrade is no longer available for removal
|
||||
unit_avail_upgrades[unit].remove(itemCandidate)
|
||||
unit_nb_upgrades[unit] -= 1
|
||||
|
||||
# Locking associated items for items that have already been placed when units_always_have_upgrades is on
|
||||
if units_always_have_upgrades:
|
||||
existing_items = set(self.existing_items[:] + locked_items)
|
||||
while existing_items:
|
||||
existing_item = existing_items.pop()
|
||||
items_to_lock = self.cascade_removal_map.get(existing_item, [existing_item])
|
||||
if get_full_item_list()[existing_item.name].type != "Upgrade":
|
||||
# Don't process general upgrades, they may have been pre-locked per-level
|
||||
for item in items_to_lock:
|
||||
if item in inventory:
|
||||
# Unit upgrades, lock all levels
|
||||
for _ in range(inventory.count(item)):
|
||||
inventory.remove(item)
|
||||
if item not in locked_items:
|
||||
# Lock all the associated items if not already locked
|
||||
for _ in range(get_item_quantity(item)):
|
||||
locked_items.append(copy_item(item))
|
||||
if item in existing_items:
|
||||
existing_items.remove(item)
|
||||
|
||||
if self.min_units_per_structure > 0 and self.has_units_per_structure():
|
||||
requirements.append(lambda state: state.has_units_per_structure())
|
||||
|
||||
# Determining if the full-size inventory can complete campaign
|
||||
if not all(requirement(self) for requirement in requirements):
|
||||
raise Exception("Too many items excluded - campaign is impossible to complete.")
|
||||
|
@ -185,21 +242,47 @@ class ValidInventory:
|
|||
if cascade_failure:
|
||||
for transient_item in transient_items:
|
||||
if transient_item in inventory:
|
||||
for _ in range(inventory.count(transient_item)):
|
||||
inventory.remove(transient_item)
|
||||
if transient_item not in locked_items:
|
||||
locked_items.append(transient_item)
|
||||
for _ in range(get_item_quantity(transient_item)):
|
||||
locked_items.append(copy_item(transient_item))
|
||||
if transient_item.classification in (ItemClassification.progression, ItemClassification.progression_skip_balancing):
|
||||
self.logical_inventory.add(transient_item.name)
|
||||
else:
|
||||
attempt_removal(item)
|
||||
|
||||
return inventory + locked_items
|
||||
if not spider_mine_sources & self.logical_inventory:
|
||||
inventory = [item for item in inventory if not item.name.endswith("(Spider Mine)")]
|
||||
if not BARRACKS_UNITS & self.logical_inventory:
|
||||
inventory = [item for item in inventory if
|
||||
not (item.name.startswith("Progressive Infantry") or item.name == "Orbital Strike")]
|
||||
if not FACTORY_UNITS & self.logical_inventory:
|
||||
inventory = [item for item in inventory if not item.name.startswith("Progressive Vehicle")]
|
||||
if not STARPORT_UNITS & self.logical_inventory:
|
||||
inventory = [item for item in inventory if not item.name.startswith("Progressive Ship")]
|
||||
|
||||
# Cull finished, adding locked items back into inventory
|
||||
inventory += locked_items
|
||||
|
||||
# Replacing empty space with generically useful items
|
||||
replacement_items = [item for item in self.item_pool
|
||||
if (item not in inventory
|
||||
and item not in self.locked_items
|
||||
and item.name in second_pass_placeable_items)]
|
||||
self.multiworld.random.shuffle(replacement_items)
|
||||
while len(inventory) < inventory_size and len(replacement_items) > 0:
|
||||
item = replacement_items.pop()
|
||||
inventory.append(item)
|
||||
|
||||
return inventory
|
||||
|
||||
def _read_logic(self):
|
||||
self._sc2wol_has_common_unit = lambda world, player: SC2WoLLogic._sc2wol_has_common_unit(self, world, player)
|
||||
self._sc2wol_has_air = lambda world, player: SC2WoLLogic._sc2wol_has_air(self, world, player)
|
||||
self._sc2wol_has_air_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_air_anti_air(self, world, player)
|
||||
self._sc2wol_has_competent_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_competent_anti_air(self, world, player)
|
||||
self._sc2wol_has_competent_ground_to_air = lambda world, player: SC2WoLLogic._sc2wol_has_competent_ground_to_air(self, world, player)
|
||||
self._sc2wol_has_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_anti_air(self, world, player)
|
||||
self._sc2wol_defense_rating = lambda world, player, zerg_enemy, air_enemy=False: SC2WoLLogic._sc2wol_defense_rating(self, world, player, zerg_enemy, air_enemy)
|
||||
self._sc2wol_has_competent_comp = lambda world, player: SC2WoLLogic._sc2wol_has_competent_comp(self, world, player)
|
||||
|
@ -210,6 +293,8 @@ class ValidInventory:
|
|||
self._sc2wol_has_protoss_common_units = lambda world, player: SC2WoLLogic._sc2wol_has_protoss_common_units(self, world, player)
|
||||
self._sc2wol_has_protoss_medium_units = lambda world, player: SC2WoLLogic._sc2wol_has_protoss_medium_units(self, world, player)
|
||||
self._sc2wol_has_mm_upgrade = lambda world, player: SC2WoLLogic._sc2wol_has_mm_upgrade(self, world, player)
|
||||
self._sc2wol_welcome_to_the_jungle_requirement = lambda world, player: SC2WoLLogic._sc2wol_welcome_to_the_jungle_requirement(self, world, player)
|
||||
self._sc2wol_can_respond_to_colony_infestations = lambda world, player: SC2WoLLogic._sc2wol_can_respond_to_colony_infestations(self, world, player)
|
||||
self._sc2wol_final_mission_requirements = lambda world, player: SC2WoLLogic._sc2wol_final_mission_requirements(self, world, player)
|
||||
|
||||
def __init__(self, multiworld: MultiWorld, player: int,
|
||||
|
@ -230,7 +315,7 @@ class ValidInventory:
|
|||
self.min_units_per_structure = int(mission_count / 7)
|
||||
min_upgrades = 1 if mission_count < 10 else 2
|
||||
for item in item_pool:
|
||||
item_info = item_table[item.name]
|
||||
item_info = get_full_item_list()[item.name]
|
||||
if item_info.type == "Upgrade":
|
||||
# Locking upgrades based on mission duration
|
||||
if item.name not in item_quantities:
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
from typing import List, Set, Dict, Tuple, Optional, Callable
|
||||
from BaseClasses import MultiWorld, Region, Entrance, Location
|
||||
from .Locations import LocationData
|
||||
from .Options import get_option_value
|
||||
from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, alt_final_mission_locations, MissionPools
|
||||
from .Options import get_option_value, MissionOrder
|
||||
from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, alt_final_mission_locations, \
|
||||
MissionPools, vanilla_shuffle_order
|
||||
from .PoolFilter import filter_missions
|
||||
|
||||
PROPHECY_CHAIN_MISSION_COUNT = 4
|
||||
|
||||
VANILLA_SHUFFLED_FIRST_PROPHECY_MISSION = 21
|
||||
|
||||
def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[LocationData, ...], location_cache: List[Location])\
|
||||
-> Tuple[Dict[str, MissionInfo], int, str]:
|
||||
|
@ -19,7 +23,7 @@ def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[Locatio
|
|||
|
||||
names: Dict[str, int] = {}
|
||||
|
||||
if mission_order_type == 0:
|
||||
if mission_order_type == MissionOrder.option_vanilla:
|
||||
|
||||
# Generating all regions and locations
|
||||
for region_name in vanilla_mission_req_table.keys():
|
||||
|
@ -108,12 +112,17 @@ def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[Locatio
|
|||
removals = len(mission_order) - mission_pool_size
|
||||
# Removing entire Prophecy chain on vanilla shuffled when not shuffling protoss
|
||||
if remove_prophecy:
|
||||
removals -= 4
|
||||
removals -= PROPHECY_CHAIN_MISSION_COUNT
|
||||
|
||||
# Initial fill out of mission list and marking all-in mission
|
||||
for mission in mission_order:
|
||||
# Removing extra missions if mission pool is too small
|
||||
if 0 < mission.removal_priority <= removals or mission.category == 'Prophecy' and remove_prophecy:
|
||||
# Also handle lower removal priority than Prophecy
|
||||
if 0 < mission.removal_priority <= removals or mission.category == 'Prophecy' and remove_prophecy \
|
||||
or (remove_prophecy and mission_order_type == MissionOrder.option_vanilla_shuffled
|
||||
and mission.removal_priority > vanilla_shuffle_order[
|
||||
VANILLA_SHUFFLED_FIRST_PROPHECY_MISSION].removal_priority
|
||||
and 0 < mission.removal_priority <= removals + PROPHECY_CHAIN_MISSION_COUNT):
|
||||
missions.append(None)
|
||||
elif mission.type == MissionPools.FINAL:
|
||||
missions.append(final_mission)
|
||||
|
@ -191,22 +200,38 @@ def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[Locatio
|
|||
# TODO: Handle 'and' connections
|
||||
mission_req_table = {}
|
||||
|
||||
def build_connection_rule(mission_names: List[str], missions_req: int) -> Callable:
|
||||
if len(mission_names) > 1:
|
||||
return lambda state: state.has_all({f"Beat {name}" for name in mission_names}, player) and \
|
||||
state._sc2wol_cleared_missions(multiworld, player, missions_req)
|
||||
else:
|
||||
return lambda state: state.has(f"Beat {mission_names[0]}", player) and \
|
||||
state._sc2wol_cleared_missions(multiworld, player, missions_req)
|
||||
|
||||
for i, mission in enumerate(missions):
|
||||
if mission is None:
|
||||
continue
|
||||
connections = []
|
||||
all_connections = []
|
||||
for connection in mission_order[i].connect_to:
|
||||
if connection == -1:
|
||||
continue
|
||||
while missions[connection] is None:
|
||||
connection -= 1
|
||||
all_connections.append(missions[connection])
|
||||
for connection in mission_order[i].connect_to:
|
||||
required_mission = missions[connection]
|
||||
if connection == -1:
|
||||
connect(multiworld, player, names, "Menu", mission)
|
||||
elif required_mission is None:
|
||||
continue
|
||||
else:
|
||||
if required_mission is None and not mission_order[i].completion_critical: # Drop non-critical null slots
|
||||
continue
|
||||
while required_mission is None: # Substituting null slot with prior slot
|
||||
connection -= 1
|
||||
required_mission = missions[connection]
|
||||
required_missions = [required_mission] if mission_order[i].or_requirements else all_connections
|
||||
connect(multiworld, player, names, required_mission, mission,
|
||||
(lambda name, missions_req: (lambda state: state.has(f"Beat {name}", player) and
|
||||
state._sc2wol_cleared_missions(multiworld, player,
|
||||
missions_req)))
|
||||
(missions[connection], mission_order[i].number))
|
||||
build_connection_rule(required_missions, mission_order[i].number))
|
||||
connections.append(slot_map[connection])
|
||||
|
||||
mission_req_table.update({mission: MissionInfo(
|
||||
|
|
|
@ -3,11 +3,11 @@ import typing
|
|||
from typing import List, Set, Tuple, Dict
|
||||
from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification
|
||||
from worlds.AutoWorld import WebWorld, World
|
||||
from .Items import StarcraftWoLItem, item_table, filler_items, item_name_groups, get_full_item_list, \
|
||||
get_basic_units
|
||||
from .Locations import get_locations
|
||||
from .Items import StarcraftWoLItem, filler_items, item_name_groups, get_item_table, get_full_item_list, \
|
||||
get_basic_units, ItemData, upgrade_included_names, progressive_if_nco
|
||||
from .Locations import get_locations, LocationType
|
||||
from .Regions import create_regions
|
||||
from .Options import sc2wol_options, get_option_value
|
||||
from .Options import sc2wol_options, get_option_value, LocationInclusion
|
||||
from .LogicMixin import SC2WoLLogic
|
||||
from .PoolFilter import filter_missions, filter_items, get_item_upgrades
|
||||
from .MissionTables import starting_mission_locations, MissionInfo
|
||||
|
@ -36,7 +36,7 @@ class SC2WoLWorld(World):
|
|||
web = Starcraft2WoLWebWorld()
|
||||
data_version = 4
|
||||
|
||||
item_name_to_id = {name: data.code for name, data in item_table.items()}
|
||||
item_name_to_id = {name: data.code for name, data in get_full_item_list().items()}
|
||||
location_name_to_id = {location.name: location.code for location in get_locations(None, None)}
|
||||
option_definitions = sc2wol_options
|
||||
|
||||
|
@ -69,6 +69,8 @@ class SC2WoLWorld(World):
|
|||
|
||||
starter_items = assign_starter_items(self.multiworld, self.player, excluded_items, self.locked_locations)
|
||||
|
||||
filter_locations(self.multiworld, self.player, self.locked_locations, self.location_cache)
|
||||
|
||||
pool = get_item_pool(self.multiworld, self.player, self.mission_req_table, starter_items, excluded_items, self.location_cache)
|
||||
|
||||
fill_item_pool_with_dummy_items(self, self.multiworld, self.player, self.locked_locations, self.location_cache, pool)
|
||||
|
@ -109,16 +111,6 @@ def setup_events(player: int, locked_locations: typing.List[str], location_cache
|
|||
def get_excluded_items(multiworld: MultiWorld, player: int) -> Set[str]:
|
||||
excluded_items: Set[str] = set()
|
||||
|
||||
if get_option_value(multiworld, player, "upgrade_bonus") == 1:
|
||||
excluded_items.add("Ultra-Capacitors")
|
||||
else:
|
||||
excluded_items.add("Vanadium Plating")
|
||||
|
||||
if get_option_value(multiworld, player, "bunker_upgrade") == 1:
|
||||
excluded_items.add("Shrike Turret")
|
||||
else:
|
||||
excluded_items.add("Fortified Bunker")
|
||||
|
||||
for item in multiworld.precollected_items[player]:
|
||||
excluded_items.add(item.name)
|
||||
|
||||
|
@ -167,7 +159,7 @@ def assign_starter_item(multiworld: MultiWorld, player: int, excluded_items: Set
|
|||
|
||||
|
||||
def get_item_pool(multiworld: MultiWorld, player: int, mission_req_table: Dict[str, MissionInfo],
|
||||
starter_items: List[str], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]:
|
||||
starter_items: List[Item], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]:
|
||||
pool: List[Item] = []
|
||||
|
||||
# For the future: goal items like Artifact Shards go here
|
||||
|
@ -176,9 +168,31 @@ def get_item_pool(multiworld: MultiWorld, player: int, mission_req_table: Dict[s
|
|||
# YAML items
|
||||
yaml_locked_items = get_option_value(multiworld, player, 'locked_items')
|
||||
|
||||
for name, data in item_table.items():
|
||||
if name not in excluded_items:
|
||||
for _ in range(data.quantity):
|
||||
# Adjust generic upgrade availability based on options
|
||||
include_upgrades = get_option_value(multiworld, player, 'generic_upgrade_missions') == 0
|
||||
upgrade_items = get_option_value(multiworld, player, 'generic_upgrade_items')
|
||||
|
||||
# Include items from outside Wings of Liberty
|
||||
item_sets = {'wol'}
|
||||
if get_option_value(multiworld, player, 'nco_items'):
|
||||
item_sets.add('nco')
|
||||
if get_option_value(multiworld, player, 'bw_items'):
|
||||
item_sets.add('bw')
|
||||
if get_option_value(multiworld, player, 'ext_items'):
|
||||
item_sets.add('ext')
|
||||
|
||||
def allowed_quantity(name: str, data: ItemData) -> int:
|
||||
if name in excluded_items \
|
||||
or data.type == "Upgrade" and (not include_upgrades or name not in upgrade_included_names[upgrade_items]) \
|
||||
or not data.origin.intersection(item_sets):
|
||||
return 0
|
||||
elif name in progressive_if_nco and 'nco' not in item_sets:
|
||||
return 1
|
||||
else:
|
||||
return data.quantity
|
||||
|
||||
for name, data in get_item_table(multiworld, player).items():
|
||||
for i in range(allowed_quantity(name, data)):
|
||||
item = create_item_with_correct_settings(player, name)
|
||||
if name in yaml_locked_items:
|
||||
locked_items.append(item)
|
||||
|
@ -187,6 +201,10 @@ def get_item_pool(multiworld: MultiWorld, player: int, mission_req_table: Dict[s
|
|||
|
||||
existing_items = starter_items + [item for item in multiworld.precollected_items[player]]
|
||||
existing_names = [item.name for item in existing_items]
|
||||
|
||||
# Check the parent item integrity, exclude items
|
||||
pool[:] = [item for item in pool if pool_contains_parent(item, pool + locked_items + existing_items)]
|
||||
|
||||
# Removing upgrades for excluded items
|
||||
for item_name in excluded_items:
|
||||
if item_name in existing_names:
|
||||
|
@ -207,8 +225,100 @@ def fill_item_pool_with_dummy_items(self: SC2WoLWorld, multiworld: MultiWorld, p
|
|||
|
||||
|
||||
def create_item_with_correct_settings(player: int, name: str) -> Item:
|
||||
data = item_table[name]
|
||||
data = get_full_item_list()[name]
|
||||
|
||||
item = Item(name, data.classification, data.code, player)
|
||||
|
||||
return item
|
||||
|
||||
|
||||
def pool_contains_parent(item: Item, pool: [Item]):
|
||||
item_data = get_full_item_list().get(item.name)
|
||||
if item_data.parent_item is None:
|
||||
# The item has not associated parent, the item is valid
|
||||
return True
|
||||
parent_item = item_data.parent_item
|
||||
# Check if the pool contains the parent item
|
||||
return parent_item in [pool_item.name for pool_item in pool]
|
||||
|
||||
|
||||
def filter_locations(multiworld: MultiWorld, player, locked_locations: List[str], location_cache: List[Location]):
|
||||
"""
|
||||
Filters the locations in the world using a trash or Nothing item
|
||||
:param multiworld:
|
||||
:param player:
|
||||
:param locked_locations:
|
||||
:param location_cache:
|
||||
:return:
|
||||
"""
|
||||
open_locations = [location for location in location_cache if location.item is None]
|
||||
plando_locations = get_plando_locations(multiworld, player)
|
||||
mission_progress_locations = get_option_value(multiworld, player, "mission_progress_locations")
|
||||
bonus_locations = get_option_value(multiworld, player, "bonus_locations")
|
||||
challenge_locations = get_option_value(multiworld, player, "challenge_locations")
|
||||
optional_boss_locations = get_option_value(multiworld, player, "optional_boss_locations")
|
||||
location_data = get_locations(multiworld, player)
|
||||
for location in open_locations:
|
||||
# Go through the locations that aren't locked yet (early unit, etc)
|
||||
if location.name not in plando_locations:
|
||||
# The location is not plando'd
|
||||
sc2_location = [sc2_location for sc2_location in location_data if sc2_location.name == location.name][0]
|
||||
location_type = sc2_location.type
|
||||
|
||||
if location_type == LocationType.MISSION_PROGRESS \
|
||||
and mission_progress_locations != LocationInclusion.option_enabled:
|
||||
item_name = get_exclusion_item(multiworld, mission_progress_locations)
|
||||
place_exclusion_item(item_name, location, locked_locations, player)
|
||||
|
||||
if location_type == LocationType.BONUS \
|
||||
and bonus_locations != LocationInclusion.option_enabled:
|
||||
item_name = get_exclusion_item(multiworld, bonus_locations)
|
||||
place_exclusion_item(item_name, location, locked_locations, player)
|
||||
|
||||
if location_type == LocationType.CHALLENGE \
|
||||
and challenge_locations != LocationInclusion.option_enabled:
|
||||
item_name = get_exclusion_item(multiworld, challenge_locations)
|
||||
place_exclusion_item(item_name, location, locked_locations, player)
|
||||
|
||||
if location_type == LocationType.OPTIONAL_BOSS \
|
||||
and optional_boss_locations != LocationInclusion.option_enabled:
|
||||
item_name = get_exclusion_item(multiworld, optional_boss_locations)
|
||||
place_exclusion_item(item_name, location, locked_locations, player)
|
||||
|
||||
|
||||
def place_exclusion_item(item_name, location, locked_locations, player):
|
||||
item = create_item_with_correct_settings(player, item_name)
|
||||
location.place_locked_item(item)
|
||||
locked_locations.append(location.name)
|
||||
|
||||
|
||||
def get_exclusion_item(multiworld: MultiWorld, option) -> str:
|
||||
"""
|
||||
Gets the exclusion item according to settings (trash/nothing)
|
||||
:param multiworld:
|
||||
:param option:
|
||||
:return: Item used for location exclusion
|
||||
"""
|
||||
if option == LocationInclusion.option_nothing:
|
||||
return "Nothing"
|
||||
elif option == LocationInclusion.option_trash:
|
||||
index = multiworld.random.randint(0, len(filler_items) - 1)
|
||||
return filler_items[index]
|
||||
raise Exception(f"Unsupported option type: {option}")
|
||||
|
||||
|
||||
def get_plando_locations(multiworld: MultiWorld, player) -> List[str]:
|
||||
"""
|
||||
|
||||
:param multiworld:
|
||||
:param player:
|
||||
:return: A list of locations affected by a plando in a world
|
||||
"""
|
||||
plando_locations = []
|
||||
for plando_setting in multiworld.plando_items[player]:
|
||||
plando_locations += plando_setting.get("locations", [])
|
||||
plando_setting_location = plando_setting.get("location", None)
|
||||
if plando_setting_location is not None:
|
||||
plando_locations.append(plando_setting_location)
|
||||
|
||||
return plando_locations
|
||||
|
|