An initial commit.

ASAR asm patch included with test tables.
Eastern and Hyrule Castle regions created from a while ago.
Currently broken because boss prizes are unreachable.
This commit is contained in:
randall.rupper
2019-08-22 12:03:55 -06:00
parent c0acfdd81e
commit ad3770e534
13 changed files with 2014 additions and 38 deletions

View File

@@ -80,6 +80,7 @@ class World(object):
self.dynamic_locations = []
self.spoiler = Spoiler(self)
self.lamps_needed_for_dark_rooms = 1
self.doors = []
def intialize_regions(self):
for region in self.regions:
@@ -132,6 +133,24 @@ class World(object):
return dungeon
raise RuntimeError('No such dungeon %s for player %d' % (dungeonname, player))
def get_door(self, doorname, player):
if isinstance(doorname, Door):
return doorname
for door in self.doors:
if door.name == doorname and door.player == player:
return door
raise RuntimeError('No such door %s' % doorname)
def check_for_door(self, doorname, player):
if isinstance(doorname, Door):
return doorname
for door in self.doors:
if door.name == doorname and door.player == player:
return door
return None
def get_all_state(self, keys=False):
ret = CollectionState(self)
@@ -318,7 +337,7 @@ class CollectionState(object):
new_regions = True
reachable_regions_count = len(rrp)
while new_regions:
possible = [region for region in player_regions if region not in rrp]
possible = [region for region in player_regions if region not in rrp]
for candidate in possible:
if candidate.can_reach_private(self):
rrp.add(candidate)
@@ -346,7 +365,7 @@ class CollectionState(object):
else:
# default to Region
spot = self.world.get_region(spot, player)
return spot.can_reach(self)
def sweep_for_events(self, key_only=False, locations=None):
@@ -482,14 +501,14 @@ class CollectionState(object):
def can_melt_things(self, player):
return self.has('Fire Rod', player) or (self.has('Bombos', player) and self.has_sword(player))
def can_avoid_lasers(self, player):
return self.has('Mirror Shield', player) or self.has('Cane of Byrna', player) or self.has('Cape', player)
def is_not_bunny(self, region, player):
if self.has_Pearl(player):
return True
return True
return region.is_light_world if self.world.mode != 'inverted' else region.is_dark_world
def has_misery_mire_medallion(self, player):
@@ -555,7 +574,7 @@ class CollectionState(object):
elif event or item.advancement:
self.prog_items.add((item.name, item.player))
changed = True
self.stale[item.player] = True
if changed:
@@ -731,6 +750,14 @@ class Dungeon(object):
self.bosses = dict()
self.player = player
self.world = None
self.paths = None
self.path_completion = dict()
self.key_number = len(small_keys)
self.big_key_required = True if self.big_key else False
self.chunks = list()
self.unlinked_doors = set([])
self.chests = 0
@property
def boss(self):
@@ -751,6 +778,16 @@ class Dungeon(object):
def is_dungeon_item(self, item):
return item.player == self.player and item.name in [dungeon_item.name for dungeon_item in self.all_items]
def count_dungeon_item(self):
return len(self.dungeon_items) + 1 if self.big_key_required else 0 + self.key_number
def incomplete_paths(self):
ret = 0
for path in self.paths:
if not self.path_completion[path]:
ret += 1
return ret
def __str__(self):
return str(self.__unicode__())
@@ -760,6 +797,56 @@ class Dungeon(object):
else:
return '%s (Player %d)' % (self.name, self.player)
@unique
class DoorType(Enum):
Normal = 1
SpiralStairs = 2
StraightStairs = 3
Ladder = 4
Open = 5
Hole = 6
Warp = 7
@unique
class Direction(Enum):
North = 1
West = 2
South = 3
East = 4
class Door(object):
def __init__(self, player, name, type, direction):
self.player = player
self.name = name
self.type = type
self.direction = direction
self.connected = False
self.parentChunk = None
# probably need exact location of the 12 base types (6 intraroom doors)
# need the z-index
# need the room index it is located in most likely
def __str__(self):
return str(self.__unicode__())
def __unicode__(self):
return '%s' % self.name
class RegionChunk(object):
def __init__(self):
self.regions = []
self.outflow = 0
self.paths_needed = []
self.chests = 0
self.entrance = False
self.unlinked_doors = set([])
class Boss(object):
def __init__(self, name, enemizer_name, defeat_rule, player):
self.name = name