Files
dockipelago/worlds/oni/Rules.py
Jonathan Tinney 7971961166
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
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

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