forked from mirror/Archipelago
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
129 lines
7.3 KiB
Python
129 lines
7.3 KiB
Python
from ast import Dict, List
|
|
from BaseClasses import CollectionState
|
|
from .Names import ItemNames
|
|
|
|
|
|
def can_advanced_research(player, item_list: Dict, state: CollectionState, player_options: Dict) -> bool:
|
|
# Need to be able to actually do the research, and handle liquids and gas
|
|
running_state = state.has(item_list["AdvancedResearchCenter"], player)
|
|
running_state = running_state and can_manage_liquid(player, item_list, state) and can_manage_gas(player, item_list, state)
|
|
# Player has basic survival buildings
|
|
running_state = running_state and can_survive_basic(player, item_list, state, player_options)
|
|
return running_state
|
|
|
|
|
|
def can_nuclear_research(player, item_list: Dict, state: CollectionState, player_options: Dict) -> bool:
|
|
# Need the material science terminal, and also be able to make refined metal
|
|
return state.has(item_list["NuclearResearchCenter"], player) and \
|
|
state.has_any([item_list["ManualHighEnergyParticleSpawner"], item_list["HighEnergyParticleSpawner"]],
|
|
player) and can_refine_metal(player, item_list, state)
|
|
|
|
|
|
def can_space_research(player, item_list: Dict, state: CollectionState, player_options: Dict) -> bool:
|
|
return state.has(item_list["DLC1CosmicResearchCenter"], player) and can_make_databanks(player, item_list, state, player_options)
|
|
|
|
def can_space_research_base(player, item_list: Dict, state: CollectionState, player_options: Dict) -> bool:
|
|
return state.has_all([item_list["CosmicResearchCenter"], item_list["ResearchModule"],
|
|
item_list["Telescope"]], player) and can_reach_space_base(player, item_list, state)
|
|
|
|
def can_survive_basic(player, item_list: Dict, state: CollectionState, player_options: Dict) -> bool:
|
|
running_state = state.has_any([item_list["PlanterBox"], item_list["FarmTile"]], player)
|
|
if on_frosty_planet(player_options):
|
|
running_state = running_state and state.has_all([item_list["IceKettle"], item_list["WoodTile"]], player)
|
|
if on_prehistoric_planet(player_options):
|
|
running_state = running_state and state.has(item_list["InsulationTile"], player)
|
|
if player_options["bionic"]:
|
|
running_state = running_state and state.has_all([item_list["Apothecary"], item_list["LubricationStick"]], player)
|
|
return running_state
|
|
|
|
def can_reach_space_base(player, item_list: Dict, state: CollectionState) -> bool:
|
|
# Command Capsule is non-negotiable
|
|
running_state = state.has_any([item_list["CommandModule"]], player)
|
|
# Has any engine and fuel tank
|
|
running_state = running_state and (state.has(item_list["SteamEngine"], player) or \
|
|
(state.has_any([item_list["KeroseneEngine"], item_list["HydrogenEngine"]], player) and \
|
|
state.has(item_list["LiquidFuelTank"], player) and \
|
|
state.has_any([item_list["OxidizerTank"], item_list["OxidizerTankLiquid"]], player)))
|
|
return running_state
|
|
|
|
def can_reach_space(player, item_list: Dict, state: CollectionState) -> bool:
|
|
# Launchpad is non-negotiable
|
|
running_state = state.has_any([item_list["LaunchPad"]], player)
|
|
# Has any engine and fuel tank
|
|
running_state = running_state and (state.has_any([item_list["CO2Engine"], item_list["HEPEngine"],
|
|
item_list["SteamEngineCluster"]], player) or \
|
|
(state.has_any([item_list["SugarEngine"], item_list["KeroseneEngineClusterSmall"]], player) and \
|
|
has_spacedout_oxidizer(player, item_list, state)) or \
|
|
(state.has_any([item_list["KeroseneEngineCluster"], item_list["HydrogenEngineCluster"]], player) and \
|
|
state.has(item_list["LiquidFuelTankCluster"], player) and has_spacedout_oxidizer(player, item_list, state)))
|
|
|
|
# Has any crew module
|
|
running_state = running_state and (state.has(item_list["HabitatModuleSmall"], player) or \
|
|
(state.has_any([item_list["NoseconeBasic"], item_list["NoseconeHarvest"]], player) and \
|
|
state.has(item_list["HabitatModuleMedium"], player)))
|
|
return running_state
|
|
|
|
def has_spacedout_oxidizer(player, item_list: Dict, state: CollectionState) -> bool:
|
|
return state.has_any([item_list["SmallOxidizerTank"], item_list["OxidizerTankLiquidCluster"], item_list["OxidizerTankCluster"]], player)
|
|
|
|
def can_ranch(player, item_list: Dict, state: CollectionState) -> bool:
|
|
return state.has_all([item_list["CritterDropOff"], item_list["CreatureFeeder"], item_list["RanchStation"]], player)
|
|
|
|
|
|
def can_make_plastic(player, item_list: Dict, state: CollectionState) -> bool:
|
|
# Oil -> Petroleum -> Plastic
|
|
running_state = state.has_all([item_list["OilWellCap"], item_list["OilRefinery"], item_list["Polymerizer"]], player)
|
|
# Drecko Ranching
|
|
running_state = running_state or (can_ranch(player, item_list, state) and state.has(item_list["ShearingStation"], player))
|
|
# Nectar from BonBon Trees
|
|
if on_frosty_planet:
|
|
running_state = running_state or state.has(item_list["Polymerizer"], player)
|
|
return running_state
|
|
|
|
def can_make_databanks(player, item_list: Dict, state: CollectionState, player_options: Dict) -> bool:
|
|
running_state = can_reach_space(player, item_list, state) and state.has(item_list["OrbitalResearchCenter"], player)
|
|
if player_options["bionic"]:
|
|
running_state = running_state or state.has(item_list["DataMiner"], player)
|
|
running_state = running_state and can_make_plastic(player, item_list, state)
|
|
return running_state
|
|
|
|
def can_refine_metal(player, item_list: Dict, state: CollectionState) -> bool:
|
|
# Crusher, Refinery, or Smooth Hatches
|
|
return state.has_any([item_list["RockCrusher"], item_list["MetalRefinery"]], player) or can_ranch(player, item_list, state)
|
|
|
|
|
|
def can_manage_liquid(player, item_list: Dict, state: CollectionState) -> bool:
|
|
# Some form of liquid pump
|
|
running_state = state.has(item_list["LiquidPump"], player) or \
|
|
(state.has(item_list["LiquidMiniPump"], player) and can_make_plastic(player, item_list, state))
|
|
# Some form of liquid pipe
|
|
running_state = running_state and (
|
|
state.has_any([item_list["LiquidConduit"], item_list["InsulatedLiquidConduit"]], player) or
|
|
state.has(item_list["LiquidConduitRadiant"], player) and can_refine_metal(player, item_list, state))
|
|
# Liquid Vent
|
|
running_state = running_state and state.has(item_list["LiquidVent"], player)
|
|
return running_state
|
|
|
|
|
|
def can_manage_gas(player, item_list: Dict, state: CollectionState) -> bool:
|
|
# Some form of gas pump
|
|
running_state = state.has(item_list["GasPump"], player) or \
|
|
(state.has(item_list["GasMiniPump"], player) and can_make_plastic(player, item_list, state))
|
|
# Some form of gas pipe
|
|
running_state = running_state and (state.has_any(
|
|
[item_list["GasConduit"], item_list["InsulatedGasConduit"], item_list["GasConduitRadiant"]], player))
|
|
# Some form of gas vent
|
|
running_state = running_state and (state.has(item_list["GasVent"], player) or \
|
|
(state.has(item_list["GasVentHighPressure"], player) and
|
|
can_make_plastic(player, item_list, state) and can_refine_metal(player, item_list, state)))
|
|
return running_state
|
|
|
|
def on_frosty_planet(options: Dict) -> bool:
|
|
if options["planet"].startswith("ceres"):
|
|
return True
|
|
return False
|
|
|
|
def on_prehistoric_planet(options: Dict) -> bool:
|
|
if options["planet"].startswith("relicargh"):
|
|
return True
|
|
return False |