AutoWorld: basic Item handling

This commit is contained in:
Fabian Dill
2021-07-12 13:54:47 +02:00
parent babd809fa6
commit 31c550d410
11 changed files with 84 additions and 51 deletions

View File

@@ -6,17 +6,19 @@ def GetBeemizerItem(world, player, item):
if world.beemizer[player] and item_name in trap_replaceable:
if world.random.random() < world.beemizer[player] * 0.25:
if world.random.random() < (0.5 + world.beemizer[player] * 0.1):
return "Bee Trap" if isinstance(item, str) else ItemFactory("Bee Trap", player)
return "Bee Trap" if isinstance(item, str) else world.create_item("Bee Trap", player)
else:
return "Bee" if isinstance(item, str) else ItemFactory("Bee", player)
return "Bee" if isinstance(item, str) else world.create_item("Bee", player)
else:
return item
else:
return item
def ItemFactory(items, player):
from worlds.alttp import ALttPItem
# should be replaced with direct world.create_item(item) call in the future
def ItemFactory(items, player: int):
from worlds.alttp import ALTTPWorld
world = ALTTPWorld(None, player)
ret = []
singleton = False
if isinstance(items, str):
@@ -24,7 +26,7 @@ def ItemFactory(items, player):
singleton = True
for item in items:
if item in item_table:
ret.append(ALttPItem(item, *item_table[item], player))
ret.append(world.create_item(item))
else:
raise Exception(f"Unknown item {item}")
@@ -211,6 +213,8 @@ item_table = {'Bow': ItemData(True, None, 0x0B, 'You have\nchosen the\narcher cl
'Open Floodgate': ItemData(True, 'Event', None, None, None, None, None, None, None, None),
}
as_dict_item_table = {name: data._asdict() for name, data in item_table.items()}
progression_mapping = {
"Golden Sword": ("Progressive Sword", 4),
"Tempered Sword": ("Progressive Sword", 3),
@@ -268,8 +272,8 @@ for basename, substring in _simple_groups:
del (_simple_groups)
progression_items = {name for name, data in item_table.items() if type(data[2]) == int and data[0]}
item_name_groups['Everything'] = {name for name, data in item_table.items() if type(data[2]) == int}
progression_items = {name for name, data in item_table.items() if type(data.item_code) == int and data.advancement}
item_name_groups['Everything'] = {name for name, data in item_table.items() if type(data.item_code) == int}
item_name_groups['Progression Items'] = progression_items
item_name_groups['Non Progression Items'] = item_name_groups['Everything'] - progression_items

View File

@@ -3,11 +3,15 @@ from typing import Optional
from BaseClasses import Location, Item, CollectionState
from ..AutoWorld import World
from .Options import alttp_options
from .Items import as_dict_item_table, item_name_groups, item_table
class ALTTPWorld(World):
game: str = "A Link to the Past"
options = alttp_options
topology_present = True
item_name_groups = item_name_groups
item_names = frozenset(item_table)
def collect(self, state: CollectionState, item: Item) -> bool:
if item.name.startswith('Progressive '):
@@ -66,6 +70,9 @@ class ALTTPWorld(World):
def get_required_client_version(self) -> tuple:
return max((0, 1, 4), super(ALTTPWorld, self).get_required_client_version())
def create_item(self, name: str) -> Item:
return ALttPItem(name, self.player, **as_dict_item_table[name])
class ALttPLocation(Location):
game: str = "A Link to the Past"
@@ -80,16 +87,16 @@ class ALttPLocation(Location):
class ALttPItem(Item):
game: str = "A Link to the Past"
def __init__(self, name='', advancement=False, type=None, code=None, pedestal_hint=None, pedestal_credit=None, sickkid_credit=None, zora_credit=None, witch_credit=None, fluteboy_credit=None, hint_text=None, player=None):
super(ALttPItem, self).__init__(name, advancement, code, player)
def __init__(self, name, player, advancement=False, type=None, item_code=None, pedestal_hint=None, pedestal_credit=None,
sick_kid_credit=None, zora_credit=None, witch_credit=None, flute_boy_credit=None, hint_text=None):
super(ALttPItem, self).__init__(name, advancement, item_code, player)
self.type = type
self._pedestal_hint_text = pedestal_hint
self.pedestal_credit_text = pedestal_credit
self.sickkid_credit_text = sickkid_credit
self.sickkid_credit_text = sick_kid_credit
self.zora_credit_text = zora_credit
self.magicshop_credit_text = witch_credit
self.fluteboy_credit_text = fluteboy_credit
self.fluteboy_credit_text = flute_boy_credit
self._hint_text = hint_text