Added bug net mode
This commit is contained in:
@@ -435,6 +435,19 @@ class World(object):
|
|||||||
ret.prog_items['L2 Cane', item.player] += 1
|
ret.prog_items['L2 Cane', item.player] += 1
|
||||||
else:
|
else:
|
||||||
ret.prog_items['L1 Cane', item.player] += 1
|
ret.prog_items['L1 Cane', item.player] += 1
|
||||||
|
elif 'Net' in item.name:
|
||||||
|
if ret.has('L5 Net', item.player):
|
||||||
|
pass
|
||||||
|
elif ret.has('L4 Net', item.player):
|
||||||
|
ret.prog_items['L5 Net', item.player] += 1
|
||||||
|
elif ret.has('L3 Net', item.player):
|
||||||
|
ret.prog_items['L4 Net', item.player] += 1
|
||||||
|
elif ret.has('L2 Net', item.player):
|
||||||
|
ret.prog_items['L3 Net', item.player] += 1
|
||||||
|
elif ret.has('L1 Net', item.player):
|
||||||
|
ret.prog_items['L2 Net', item.player] += 1
|
||||||
|
else:
|
||||||
|
ret.prog_items['L1 Net', item.player] += 1
|
||||||
elif 'Glove' in item.name:
|
elif 'Glove' in item.name:
|
||||||
if ret.has('Titans Mitts', item.player):
|
if ret.has('Titans Mitts', item.player):
|
||||||
pass
|
pass
|
||||||
@@ -1048,6 +1061,7 @@ class CollectionState(object):
|
|||||||
'Blue Pendant', 'Red Pendant', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5',
|
'Blue Pendant', 'Red Pendant', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5',
|
||||||
'Crystal 6', 'Crystal 7', 'Blue Boomerang', 'Red Boomerang', 'Blue Shield', 'Red Shield',
|
'Crystal 6', 'Crystal 7', 'Blue Boomerang', 'Red Boomerang', 'Blue Shield', 'Red Shield',
|
||||||
'Mirror Shield', 'Progressive Shield', 'Bug Catching Net', 'Cane of Byrna', 'Ocarina (Activated)',
|
'Mirror Shield', 'Progressive Shield', 'Bug Catching Net', 'Cane of Byrna', 'Ocarina (Activated)',
|
||||||
|
'Progressive Bombs', 'Progressive Cane', 'Progressive Net',
|
||||||
'Boss Heart Container', 'Sanctuary Heart Container', 'Piece of Heart', 'Magic Upgrade (1/2)',
|
'Boss Heart Container', 'Sanctuary Heart Container', 'Piece of Heart', 'Magic Upgrade (1/2)',
|
||||||
'Magic Upgrade (1/4)']
|
'Magic Upgrade (1/4)']
|
||||||
or item_name.startswith(('Bottle', 'Small Key', 'Big Key'))
|
or item_name.startswith(('Bottle', 'Small Key', 'Big Key'))
|
||||||
@@ -1272,8 +1286,6 @@ class CollectionState(object):
|
|||||||
return (not self.world.bombbag[player] or self.has('Bomb Upgrade (+10)', player) or self.has('Bomb Upgrade (+5)', player, 2)) and (self.world.override_bomb_check or self.can_farm_bombs(player))
|
return (not self.world.bombbag[player] or self.has('Bomb Upgrade (+10)', player) or self.has('Bomb Upgrade (+5)', player, 2)) and (self.world.override_bomb_check or self.can_farm_bombs(player))
|
||||||
|
|
||||||
def can_kill_with_bombs(self, player):
|
def can_kill_with_bombs(self, player):
|
||||||
if self.world.swords[player] in ['cane', 'somaria', 'byrna']:
|
|
||||||
return False
|
|
||||||
return self.can_use_bombs(player)
|
return self.can_use_bombs(player)
|
||||||
|
|
||||||
def can_hit_crystal(self, player):
|
def can_hit_crystal(self, player):
|
||||||
@@ -1363,11 +1375,23 @@ class CollectionState(object):
|
|||||||
elif level == 1:
|
elif level == 1:
|
||||||
return self.has('L5 Cane', player) or self.has('L4 Cane', player) or self.has('L3 Cane', player) or self.has('L2 Cane', player) or self.has('L1 Cane', player)
|
return self.has('L5 Cane', player) or self.has('L4 Cane', player) or self.has('L3 Cane', player) or self.has('L2 Cane', player) or self.has('L1 Cane', player)
|
||||||
return True
|
return True
|
||||||
|
elif self.world.swords[player] in ['bugnet']:
|
||||||
|
if level == 5:
|
||||||
|
return self.has('L5 Net', player)
|
||||||
|
elif level == 4:
|
||||||
|
return self.has('L5 Net', player) or self.has('L4 Net', player)
|
||||||
|
elif level == 3:
|
||||||
|
return self.has('L5 Net', player) or self.has('L4 Net', player) or self.has('L3 Net', player)
|
||||||
|
elif level == 2:
|
||||||
|
return self.has('L5 Net', player) or self.has('L4 Net', player) or self.has('L3 Net', player) or self.has('L2 Net', player)
|
||||||
|
elif level == 1:
|
||||||
|
return self.has('L5 Net', player) or self.has('L4 Net', player) or self.has('L3 Net', player) or self.has('L2 Net', player) or self.has('L1 Net', player)
|
||||||
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def special_weapon_check(self, player, level):
|
def special_weapon_check(self, player, level):
|
||||||
if self.world.swords[player] in ['bombs', 'byrna', 'somaria', 'cane']:
|
if self.world.swords[player] in ['bombs']:
|
||||||
return self.has_special_weapon_level(player, level)
|
return self.has_special_weapon_level(player, level)
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
@@ -1413,7 +1437,7 @@ class CollectionState(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def can_use_medallions(self, player):
|
def can_use_medallions(self, player):
|
||||||
return self.has_sword(player) or self.world.swords[player] in ['bombs', 'byrna', 'somaria', 'cane']
|
return self.has_sword(player) or self.world.swords[player] in ['bombs', 'byrna', 'somaria', 'cane', 'bugnet']
|
||||||
|
|
||||||
def has_blunt_weapon(self, player):
|
def has_blunt_weapon(self, player):
|
||||||
return self.has_real_sword(player) or self.has('Hammer', player)
|
return self.has_real_sword(player) or self.has('Hammer', player)
|
||||||
@@ -1545,6 +1569,24 @@ class CollectionState(object):
|
|||||||
else:
|
else:
|
||||||
self.prog_items['L1 Cane', item.player] += 1
|
self.prog_items['L1 Cane', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
|
elif 'Net' in item.name:
|
||||||
|
if self.has('L5 Net', item.player):
|
||||||
|
pass
|
||||||
|
elif self.has('L4 Net', item.player):
|
||||||
|
self.prog_items['L5 Net', item.player] += 1
|
||||||
|
changed = True
|
||||||
|
elif self.has('L3 Net', item.player):
|
||||||
|
self.prog_items['L4 Net', item.player] += 1
|
||||||
|
changed = True
|
||||||
|
elif self.has('L2 Net', item.player):
|
||||||
|
self.prog_items['L3 Net', item.player] += 1
|
||||||
|
changed = True
|
||||||
|
elif self.has('L1 Net', item.player):
|
||||||
|
self.prog_items['L2 Net', item.player] += 1
|
||||||
|
changed = True
|
||||||
|
else:
|
||||||
|
self.prog_items['L1 Net', item.player] += 1
|
||||||
|
changed = True
|
||||||
elif 'Glove' in item.name:
|
elif 'Glove' in item.name:
|
||||||
if self.has('Titans Mitts', item.player):
|
if self.has('Titans Mitts', item.player):
|
||||||
pass
|
pass
|
||||||
@@ -1650,6 +1692,19 @@ class CollectionState(object):
|
|||||||
to_remove = 'L1 Cane'
|
to_remove = 'L1 Cane'
|
||||||
else:
|
else:
|
||||||
to_remove = None
|
to_remove = None
|
||||||
|
elif 'Net' in to_remove:
|
||||||
|
if self.has('L5 Net', item.player):
|
||||||
|
to_remove = 'L5 Net'
|
||||||
|
elif self.has('L4 Net', item.player):
|
||||||
|
to_remove = 'L4 Net'
|
||||||
|
elif self.has('L3 Net', item.player):
|
||||||
|
to_remove = 'L3 Net'
|
||||||
|
elif self.has('L2 Net', item.player):
|
||||||
|
to_remove = 'L2 Net'
|
||||||
|
elif self.has('L1 Net', item.player):
|
||||||
|
to_remove = 'L1 Net'
|
||||||
|
else:
|
||||||
|
to_remove = None
|
||||||
elif 'Glove' in item.name:
|
elif 'Glove' in item.name:
|
||||||
if self.has('Titans Mitts', item.player):
|
if self.has('Titans Mitts', item.player):
|
||||||
to_remove = 'Titans Mitts'
|
to_remove = 'Titans Mitts'
|
||||||
@@ -3619,7 +3674,7 @@ er_mode = {"vanilla": 0, "simple": 1, "restricted": 2, "full": 3, "crossed": 4,
|
|||||||
# byte 1: LLLW WSSS (logic, mode, sword)
|
# byte 1: LLLW WSSS (logic, mode, sword)
|
||||||
logic_mode = {"noglitches": 0, "minorglitches": 1, "nologic": 2, "owglitches": 3, "majorglitches": 4}
|
logic_mode = {"noglitches": 0, "minorglitches": 1, "nologic": 2, "owglitches": 3, "majorglitches": 4}
|
||||||
world_mode = {"open": 0, "standard": 1, "inverted": 2}
|
world_mode = {"open": 0, "standard": 1, "inverted": 2}
|
||||||
sword_mode = {"random": 0, "assured": 1, "swordless": 2, "swordless_hammer": 2, "vanilla": 3, "bombs": 4, "pseudo": 5, "assured_pseudo": 5, "byrna": 6, "somaria": 6, "cane": 6, "bees": 7}
|
sword_mode = {"random": 0, "assured": 1, "swordless": 2, "swordless_b": 2, "vanilla": 3, "bombs": 4, "pseudo": 5, "assured_pseudo": 5, "byrna": 6, "somaria": 6, "cane": 6, "bees": 7, "bugnet": 7}
|
||||||
|
|
||||||
# byte 2: GGGD DFFH (goal, diff, item_func, hints)
|
# byte 2: GGGD DFFH (goal, diff, item_func, hints)
|
||||||
goal_mode = {'ganon': 0, 'pedestal': 1, 'dungeons': 2, 'triforcehunt': 3, 'crystals': 4, 'trinity': 5, 'z1': 6,
|
goal_mode = {'ganon': 0, 'pedestal': 1, 'dungeons': 2, 'triforcehunt': 3, 'crystals': 4, 'trinity': 5, 'z1': 6,
|
||||||
|
|||||||
@@ -95,21 +95,23 @@ class InitialSram:
|
|||||||
elif startingstate.has('Fighter Sword', player):
|
elif startingstate.has('Fighter Sword', player):
|
||||||
equip[0x359] = 1
|
equip[0x359] = 1
|
||||||
|
|
||||||
if startingstate.has('L5 Bombs', player) or startingstate.has('L5 Cane', player):
|
if startingstate.has('L5 Bombs', player) or startingstate.has('L5 Cane', player) or startingstate.has('L5 Net', player):
|
||||||
equip[0x38F] = 5
|
equip[0x38F] = 5
|
||||||
elif startingstate.has('L4 Bombs', player) or startingstate.has('L4 Cane', player):
|
elif startingstate.has('L4 Bombs', player) or startingstate.has('L4 Cane', player) or startingstate.has('L4 Net', player):
|
||||||
equip[0x38F] = 4
|
equip[0x38F] = 4
|
||||||
elif startingstate.has('L3 Bombs', player) or startingstate.has('L3 Cane', player):
|
elif startingstate.has('L3 Bombs', player) or startingstate.has('L3 Cane', player) or startingstate.has('L3 Net', player):
|
||||||
equip[0x38F] = 3
|
equip[0x38F] = 3
|
||||||
elif startingstate.has('L2 Bombs', player) or startingstate.has('L2 Cane', player):
|
elif startingstate.has('L2 Bombs', player) or startingstate.has('L2 Cane', player) or startingstate.has('L2 Net', player):
|
||||||
equip[0x38F] = 2
|
equip[0x38F] = 2
|
||||||
elif startingstate.has('L1 Bombs', player) or startingstate.has('L1 Cane', player) or world.swords[player] == 'cane':
|
elif startingstate.has('L1 Bombs', player) or startingstate.has('L1 Cane', player) or world.swords[player] == 'cane' or startingstate.has('L1 Net', player):
|
||||||
equip[0x38F] = 1
|
equip[0x38F] = 1
|
||||||
if startingstate.has('L1 Cane', player) or startingstate.has('L2 Cane', player) or startingstate.has('L3 Cane', player) or startingstate.has('L4 Cane', player) or startingstate.has('L5 Cane', player):
|
if startingstate.has('L1 Cane', player) or startingstate.has('L2 Cane', player) or startingstate.has('L3 Cane', player) or startingstate.has('L4 Cane', player) or startingstate.has('L5 Cane', player):
|
||||||
if world.swords[player] == 'byrna':
|
if world.swords[player] == 'byrna':
|
||||||
equip[0x351] = 1
|
equip[0x351] = 1
|
||||||
elif world.swords[player] == 'somaria':
|
elif world.swords[player] == 'somaria':
|
||||||
equip[0x350] = 1
|
equip[0x350] = 1
|
||||||
|
if startingstate.has('L1 Net', player) or startingstate.has('L2 Net', player) or startingstate.has('L3 Net', player) or startingstate.has('L4 Net', player) or startingstate.has('L5 Net', player):
|
||||||
|
equip[0x34D] = 1
|
||||||
|
|
||||||
if startingstate.has('Mirror Shield', player):
|
if startingstate.has('Mirror Shield', player):
|
||||||
equip[0x35A] = 3
|
equip[0x35A] = 3
|
||||||
@@ -139,6 +141,7 @@ class InitialSram:
|
|||||||
'Golden Sword', 'Tempered Sword', 'Master Sword', 'Fighter Sword', 'Progressive Sword',
|
'Golden Sword', 'Tempered Sword', 'Master Sword', 'Fighter Sword', 'Progressive Sword',
|
||||||
'L5 Bombs', 'L4 Bombs', 'L3 Bombs', 'L2 Bombs', 'L1 Bombs', 'Progressive Bombs',
|
'L5 Bombs', 'L4 Bombs', 'L3 Bombs', 'L2 Bombs', 'L1 Bombs', 'Progressive Bombs',
|
||||||
'L5 Cane', 'L4 Cane', 'L3 Cane', 'L2 Cane', 'L1 Cane', 'Progressive Cane',
|
'L5 Cane', 'L4 Cane', 'L3 Cane', 'L2 Cane', 'L1 Cane', 'Progressive Cane',
|
||||||
|
'L5 Net', 'L4 Net', 'L3 Net', 'L2 Net', 'L1 Net', 'Progressive Net',
|
||||||
'Mirror Shield', 'Red Shield', 'Blue Shield', 'Progressive Shield',
|
'Mirror Shield', 'Red Shield', 'Blue Shield', 'Progressive Shield',
|
||||||
'Red Mail', 'Blue Mail', 'Progressive Armor',
|
'Red Mail', 'Blue Mail', 'Progressive Armor',
|
||||||
'Magic Upgrade (1/4)', 'Magic Upgrade (1/2)']:
|
'Magic Upgrade (1/4)', 'Magic Upgrade (1/2)']:
|
||||||
|
|||||||
33
ItemList.py
33
ItemList.py
@@ -37,7 +37,7 @@ normalfinal25extra = ['Rupees (20)'] * 23 + ['Rupees (5)'] * 2
|
|||||||
|
|
||||||
Difficulty = namedtuple('Difficulty',
|
Difficulty = namedtuple('Difficulty',
|
||||||
['baseitems', 'bottles', 'bottle_count', 'same_bottle', 'progressiveshield',
|
['baseitems', 'bottles', 'bottle_count', 'same_bottle', 'progressiveshield',
|
||||||
'basicshield', 'progressivearmor', 'basicarmor', 'swordless', 'bombs_only', 'cane_only',
|
'basicshield', 'progressivearmor', 'basicarmor', 'swordless', 'bombs_only', 'cane_only', 'bugnet_mode',
|
||||||
'progressivesword', 'basicsword', 'basicbow', 'timedohko', 'timedother',
|
'progressivesword', 'basicsword', 'basicbow', 'timedohko', 'timedother',
|
||||||
'retro', 'bombbag',
|
'retro', 'bombbag',
|
||||||
'extras', 'progressive_sword_limit', 'progressive_shield_limit',
|
'extras', 'progressive_sword_limit', 'progressive_shield_limit',
|
||||||
@@ -60,6 +60,7 @@ difficulties = {
|
|||||||
swordless = ['Rupees (20)'] * 4,
|
swordless = ['Rupees (20)'] * 4,
|
||||||
bombs_only = ['Progressive Bombs'] * 4,
|
bombs_only = ['Progressive Bombs'] * 4,
|
||||||
cane_only = ['Progressive Cane'] * 3 + ['Rupees (20)'],
|
cane_only = ['Progressive Cane'] * 3 + ['Rupees (20)'],
|
||||||
|
bugnet_mode = ['Progressive Net'] * 4,
|
||||||
progressivesword = ['Progressive Sword'] * 4,
|
progressivesword = ['Progressive Sword'] * 4,
|
||||||
basicsword = ['Fighter Sword', 'Master Sword', 'Tempered Sword', 'Golden Sword'],
|
basicsword = ['Fighter Sword', 'Master Sword', 'Tempered Sword', 'Golden Sword'],
|
||||||
basicbow = ['Bow', 'Silver Arrows'],
|
basicbow = ['Bow', 'Silver Arrows'],
|
||||||
@@ -88,6 +89,7 @@ difficulties = {
|
|||||||
swordless = ['Rupees (20)'] * 4,
|
swordless = ['Rupees (20)'] * 4,
|
||||||
bombs_only = ['Progressive Bombs'] * 4,
|
bombs_only = ['Progressive Bombs'] * 4,
|
||||||
cane_only = ['Progressive Cane'] * 3 + ['Rupees (20)'],
|
cane_only = ['Progressive Cane'] * 3 + ['Rupees (20)'],
|
||||||
|
bugnet_mode = ['Progressive Net'] * 4,
|
||||||
progressivesword = ['Progressive Sword'] * 4,
|
progressivesword = ['Progressive Sword'] * 4,
|
||||||
basicsword = ['Fighter Sword', 'Master Sword', 'Master Sword', 'Tempered Sword'],
|
basicsword = ['Fighter Sword', 'Master Sword', 'Master Sword', 'Tempered Sword'],
|
||||||
basicbow = ['Bow'] * 2,
|
basicbow = ['Bow'] * 2,
|
||||||
@@ -116,6 +118,7 @@ difficulties = {
|
|||||||
swordless = ['Rupees (20)'] * 4,
|
swordless = ['Rupees (20)'] * 4,
|
||||||
bombs_only = ['Progressive Bombs'] * 4,
|
bombs_only = ['Progressive Bombs'] * 4,
|
||||||
cane_only = ['Progressive Cane'] * 3 + ['Rupees (20)'],
|
cane_only = ['Progressive Cane'] * 3 + ['Rupees (20)'],
|
||||||
|
bugnet_mode = ['Progressive Net'] * 4,
|
||||||
progressivesword = ['Progressive Sword'] * 4,
|
progressivesword = ['Progressive Sword'] * 4,
|
||||||
basicsword = ['Fighter Sword', 'Fighter Sword', 'Master Sword', 'Master Sword'],
|
basicsword = ['Fighter Sword', 'Fighter Sword', 'Master Sword', 'Master Sword'],
|
||||||
basicbow = ['Bow'] * 2,
|
basicbow = ['Bow'] * 2,
|
||||||
@@ -339,27 +342,11 @@ def generate_itempool(world, player):
|
|||||||
for item in precollected_items:
|
for item in precollected_items:
|
||||||
world.push_precollected(ItemFactory(item, player))
|
world.push_precollected(ItemFactory(item, player))
|
||||||
|
|
||||||
if world.mode[player] == 'standard' and not (world.state.has_special_weapon_level(player, 1) if world.swords[player] in ['bombs', 'byrna', 'somaria', 'cane'] else world.state.has_blunt_weapon(player)):
|
if world.mode[player] == 'standard' and not (world.state.has_special_weapon_level(player, 1) if world.swords[player] in ['bombs'] else world.state.has_blunt_weapon(player) or world.state.has_special_weapon_level(player, 1)):
|
||||||
if world.swords[player] == 'bombs' and "Link's Uncle" not in placed_items:
|
if world.swords[player] == 'bombs' and "Link's Uncle" not in placed_items:
|
||||||
possible_weapons = []
|
possible_weapons = []
|
||||||
for item in pool:
|
for item in pool:
|
||||||
if item in ['Progressive Bombs', 'L1 Bombs', 'L2 Bombs', 'L3 Bombs', 'L4 Bombs', 'L5 Bombs']:
|
if item in ['Progressive Bombs']:
|
||||||
possible_weapons.append(item)
|
|
||||||
starting_weapon = random.choice(possible_weapons)
|
|
||||||
placed_items["Link's Uncle"] = starting_weapon
|
|
||||||
pool.remove(starting_weapon)
|
|
||||||
elif world.swords[player] in ['byrna', 'somaria'] and "Link's Uncle" not in placed_items:
|
|
||||||
possible_weapons = []
|
|
||||||
for item in pool:
|
|
||||||
if item in ['Progressive Cane', 'L1 Cane', 'L2 Cane', 'L3 Cane', 'L4 Cane', 'L5 Cane']:
|
|
||||||
possible_weapons.append(item)
|
|
||||||
starting_weapon = random.choice(possible_weapons)
|
|
||||||
placed_items["Link's Uncle"] = starting_weapon
|
|
||||||
pool.remove(starting_weapon)
|
|
||||||
elif world.swords[player] in ['cane'] and "Link's Uncle" not in placed_items:
|
|
||||||
possible_weapons = []
|
|
||||||
for item in pool:
|
|
||||||
if item in ['Cane of Byrna', 'Cane of Somaria']:
|
|
||||||
possible_weapons.append(item)
|
possible_weapons.append(item)
|
||||||
starting_weapon = random.choice(possible_weapons)
|
starting_weapon = random.choice(possible_weapons)
|
||||||
placed_items["Link's Uncle"] = starting_weapon
|
placed_items["Link's Uncle"] = starting_weapon
|
||||||
@@ -373,6 +360,9 @@ def generate_itempool(world, player):
|
|||||||
if not found_sword and world.swords[player] != 'swordless':
|
if not found_sword and world.swords[player] != 'swordless':
|
||||||
found_sword = True
|
found_sword = True
|
||||||
possible_weapons.append(item)
|
possible_weapons.append(item)
|
||||||
|
if item in ['Progressive Cane', 'Progressive Net']:
|
||||||
|
if world.swords[player] != 'cane':
|
||||||
|
possible_weapons.append(item)
|
||||||
if (item in ['Progressive Bow', 'Bow'] and not found_bow
|
if (item in ['Progressive Bow', 'Bow'] and not found_bow
|
||||||
and not world.bow_mode[player].startswith('retro')):
|
and not world.bow_mode[player].startswith('retro')):
|
||||||
found_bow = True
|
found_bow = True
|
||||||
@@ -1167,7 +1157,7 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
|
|||||||
|
|
||||||
if 'silvers' not in world.bow_mode[player]:
|
if 'silvers' not in world.bow_mode[player]:
|
||||||
pool.extend(['Progressive Bow'] * 2)
|
pool.extend(['Progressive Bow'] * 2)
|
||||||
elif swords not in ['swordless', 'pseudo', 'assured_pseudo', 'swordless_hammer']:
|
elif swords not in ['swordless', 'pseudo', 'assured_pseudo', 'swordless_b']:
|
||||||
pool.extend(diff.basicbow)
|
pool.extend(diff.basicbow)
|
||||||
else:
|
else:
|
||||||
pool.extend(['Bow', 'Silver Arrows'])
|
pool.extend(['Bow', 'Silver Arrows'])
|
||||||
@@ -1184,6 +1174,9 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
|
|||||||
pool.extend(diff.cane_only)
|
pool.extend(diff.cane_only)
|
||||||
elif swords == 'cane':
|
elif swords == 'cane':
|
||||||
pool.extend(diff.cane_only)
|
pool.extend(diff.cane_only)
|
||||||
|
elif swords == 'bugnet':
|
||||||
|
pool = [item.replace('Bug Catching Net', 'Progressive Net') for item in pool]
|
||||||
|
pool.extend(diff.bugnet_mode)
|
||||||
elif swords == 'vanilla':
|
elif swords == 'vanilla':
|
||||||
swords_to_use = diff.progressivesword.copy() if want_progressives() else diff.basicsword.copy()
|
swords_to_use = diff.progressivesword.copy() if want_progressives() else diff.basicsword.copy()
|
||||||
random.shuffle(swords_to_use)
|
random.shuffle(swords_to_use)
|
||||||
|
|||||||
1
Items.py
1
Items.py
@@ -173,6 +173,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'You have\nchosen the\narche
|
|||||||
'Bee Trap': (False, False, None, 0xB0, 50, 'We will sting your face a whole lot!', 'and the sting buddies', 'the beekeeper kid', 'insects for sale', 'shroom pollenation', 'bottle boy has mad bees again', 'friendship'),
|
'Bee Trap': (False, False, None, 0xB0, 50, 'We will sting your face a whole lot!', 'and the sting buddies', 'the beekeeper kid', 'insects for sale', 'shroom pollenation', 'bottle boy has mad bees again', 'friendship'),
|
||||||
'Progressive Bombs': (True, False, 'SwordBomb', 0xC0, 200, 'throw more\npowerful\nexplosives', 'the unknown grenades', 'the bomb-holding kid', 'better booms for sale', 'blend fungus into bombs', '\'splosion boy explodes again', 'fancy bombs'),
|
'Progressive Bombs': (True, False, 'SwordBomb', 0xC0, 200, 'throw more\npowerful\nexplosives', 'the unknown grenades', 'the bomb-holding kid', 'better booms for sale', 'blend fungus into bombs', '\'splosion boy explodes again', 'fancy bombs'),
|
||||||
'Progressive Cane': (True, False, 'SwordCane', 0xC1, 200, 'a better\nstick\nrests here!', 'the unknown stick', 'the stick-holding kid', 'better stick for sale', 'fungus into stick', 'cane boy improves again', 'fancy cane'),
|
'Progressive Cane': (True, False, 'SwordCane', 0xC1, 200, 'a better\nstick\nrests here!', 'the unknown stick', 'the stick-holding kid', 'better stick for sale', 'fungus into stick', 'cane boy improves again', 'fancy cane'),
|
||||||
|
'Progressive Net': (True, False, 'SwordNet', 0xC2, 200, 'a better\nnet\nrests here!', 'the unknown net', 'the net-holding kid', 'better net for sale', 'fungus into net', 'net boy improves again', 'fancy net'),
|
||||||
'Red Potion': (False, False, None, 0x2E, 150, 'Hearty red goop!', 'and the red goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has red goo again', 'a red potion'),
|
'Red Potion': (False, False, None, 0x2E, 150, 'Hearty red goop!', 'and the red goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has red goo again', 'a red potion'),
|
||||||
'Green Potion': (False, False, None, 0x2F, 60, 'Refreshing green goop!', 'and the green goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has green goo again', 'a green potion'),
|
'Green Potion': (False, False, None, 0x2F, 60, 'Refreshing green goop!', 'and the green goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has green goo again', 'a green potion'),
|
||||||
'Blue Potion': (False, False, None, 0x30, 160, 'Delicious blue goop!', 'and the blue goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has blue goo again', 'a blue potion'),
|
'Blue Potion': (False, False, None, 0x30, 160, 'Delicious blue goop!', 'and the blue goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has blue goo again', 'a blue potion'),
|
||||||
|
|||||||
52
Rom.py
52
Rom.py
@@ -1240,7 +1240,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
|
|
||||||
#Set overflow items for progressive equipment
|
#Set overflow items for progressive equipment
|
||||||
rom.write_bytes(0x180090,
|
rom.write_bytes(0x180090,
|
||||||
[difficulty.progressive_sword_limit if world.swords[player] not in ['swordless', 'swordless_hammer', 'bees'] else 0, overflow_replacement,
|
[difficulty.progressive_sword_limit if world.swords[player] not in ['swordless', 'swordless_b', 'bees'] else 0, overflow_replacement,
|
||||||
difficulty.progressive_shield_limit, overflow_replacement,
|
difficulty.progressive_shield_limit, overflow_replacement,
|
||||||
difficulty.progressive_armor_limit, overflow_replacement,
|
difficulty.progressive_armor_limit, overflow_replacement,
|
||||||
difficulty.progressive_bottle_limit, overflow_replacement])
|
difficulty.progressive_bottle_limit, overflow_replacement])
|
||||||
@@ -1248,7 +1248,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
#Work around for json patch ordering issues - write bow limit separately so that it is replaced in the patch
|
#Work around for json patch ordering issues - write bow limit separately so that it is replaced in the patch
|
||||||
rom.write_bytes(0x180098, [difficulty.progressive_bow_limit, overflow_replacement])
|
rom.write_bytes(0x180098, [difficulty.progressive_bow_limit, overflow_replacement])
|
||||||
|
|
||||||
if difficulty.progressive_bow_limit < 2 and world.swords[player] in ['swordless', 'swordless_hammer', 'bees', 'pseudo', 'assured_pseudo']:
|
if difficulty.progressive_bow_limit < 2 and world.swords[player] in ['swordless', 'swordless_b', 'bees', 'pseudo', 'assured_pseudo']:
|
||||||
rom.write_bytes(0x180098, [2, overflow_replacement])
|
rom.write_bytes(0x180098, [2, overflow_replacement])
|
||||||
|
|
||||||
# set up game internal RNG seed
|
# set up game internal RNG seed
|
||||||
@@ -1318,14 +1318,14 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
rom.write_byte(0x180029, 0x01) # Smithy quick item give
|
rom.write_byte(0x180029, 0x01) # Smithy quick item give
|
||||||
|
|
||||||
# set swordless mode settings
|
# set swordless mode settings
|
||||||
if world.swords[player] in ['swordless', 'swordless_hammer']:
|
if world.swords[player] in ['swordless', 'swordless_b']:
|
||||||
rom.write_byte(0x18003F, 0x01) # hammer can harm ganon
|
rom.write_byte(0x18003F, 0x01) # hammer can harm ganon
|
||||||
rom.initial_sram.set_swordless_curtains() # open curtains
|
rom.initial_sram.set_swordless_curtains() # open curtains
|
||||||
rom.write_byte(0x180041, 0x01) # swordless medallions (on pads)
|
rom.write_byte(0x180041, 0x01) # swordless medallions (on pads)
|
||||||
rom.write_byte(0x180043, 0xFF) # starting sword for link
|
rom.write_byte(0x180043, 0xFF) # starting sword for link
|
||||||
rom.write_byte(0x180044, 0x01) # hammer activates tablets
|
rom.write_byte(0x180044, 0x01) # hammer activates tablets
|
||||||
if world.swords[player] == 'swordless_hammer':
|
if world.swords[player] == 'swordless_b':
|
||||||
rom.write_byte(0x18002F, 0x07) # hammer on B
|
rom.write_byte(0x18002C, 0xFF) # items on B
|
||||||
elif world.swords[player] in ['pseudo', 'assured_pseudo']:
|
elif world.swords[player] in ['pseudo', 'assured_pseudo']:
|
||||||
rom.write_byte(0x18002F, 0x02) # pseudo-swords
|
rom.write_byte(0x18002F, 0x02) # pseudo-swords
|
||||||
rom.write_byte(0x18003F, 0x01) # hammer can harm ganon
|
rom.write_byte(0x18003F, 0x01) # hammer can harm ganon
|
||||||
@@ -1396,6 +1396,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
elif world.swords[player] in ['byrna', 'somaria', 'cane']:
|
elif world.swords[player] in ['byrna', 'somaria', 'cane']:
|
||||||
rom.initial_sram.set_swordless_curtains() # open curtains
|
rom.initial_sram.set_swordless_curtains() # open curtains
|
||||||
rom.write_byte(0x180041, 0x02) # swordless medallions (always)
|
rom.write_byte(0x180041, 0x02) # swordless medallions (always)
|
||||||
|
rom.write_byte(0x18002C, 0xFF) # any item on B
|
||||||
|
|
||||||
# remove magic cost of cane(s)
|
# remove magic cost of cane(s)
|
||||||
if world.swords[player] in ['byrna', 'cane']:
|
if world.swords[player] in ['byrna', 'cane']:
|
||||||
@@ -1412,13 +1413,13 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
rom.write_byte(0x03B0AE, 0x81)
|
rom.write_byte(0x03B0AE, 0x81)
|
||||||
|
|
||||||
if world.swords[player] == 'byrna':
|
if world.swords[player] == 'byrna':
|
||||||
rom.write_byte(0x18002F, 0x83)
|
rom.write_byte(0x18002F, 0x03)
|
||||||
colr = 0x2C
|
colr = 0x2C
|
||||||
elif world.swords[player] == 'somaria':
|
elif world.swords[player] == 'somaria':
|
||||||
rom.write_byte(0x18002F, 0x84)
|
rom.write_byte(0x18002F, 0x04)
|
||||||
colr = 0x24
|
colr = 0x24
|
||||||
elif world.swords[player] == 'cane':
|
elif world.swords[player] == 'cane':
|
||||||
rom.write_byte(0x18002F, 0x85)
|
rom.write_byte(0x18002F, 0x05)
|
||||||
colr = 0x28
|
colr = 0x28
|
||||||
|
|
||||||
spritedata = [
|
spritedata = [
|
||||||
@@ -1450,6 +1451,41 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
rom.write_bytes(0x118188, credits_string_bot("TEMPERED CANE "))
|
rom.write_bytes(0x118188, credits_string_bot("TEMPERED CANE "))
|
||||||
rom.write_bytes(0x1181A6, credits_string_top("GOLD CANE "))
|
rom.write_bytes(0x1181A6, credits_string_top("GOLD CANE "))
|
||||||
rom.write_bytes(0x1181C4, credits_string_bot("GOLD CANE "))
|
rom.write_bytes(0x1181C4, credits_string_bot("GOLD CANE "))
|
||||||
|
elif world.swords[player] in ['bugnet']:
|
||||||
|
rom.initial_sram.set_swordless_curtains() # open curtains
|
||||||
|
rom.write_byte(0x180041, 0x02) # swordless medallions (always)
|
||||||
|
rom.write_byte(0x18002C, 0x0E) # bug net on B
|
||||||
|
rom.write_byte(0x18002F, 0x08) # bug net mode
|
||||||
|
|
||||||
|
spritedata = [
|
||||||
|
0xF5, 0x20, 0xF5, 0x20, 0xF5, 0x20, 0xF5, 0x20,
|
||||||
|
0x40, 0x3C, 0x41, 0x3C, 0x42, 0x3C, 0x17, 0x3C,
|
||||||
|
0x40, 0x2C, 0x41, 0x2C, 0x42, 0x2C, 0x18, 0x2C,
|
||||||
|
0x40, 0x24, 0x41, 0x24, 0x42, 0x24, 0x19, 0x24,
|
||||||
|
0x40, 0x28, 0x41, 0x28, 0x42, 0x28, 0x1A, 0x28,
|
||||||
|
0x40, 0x28, 0x41, 0x28, 0x42, 0x28, 0x1B, 0x28,
|
||||||
|
0xF5, 0x20, 0xF5, 0x20, 0xF5, 0x20, 0xF5, 0x20,
|
||||||
|
0x40, 0x3C, 0x41, 0x3C, 0x42, 0x3C, 0x43, 0x3C,
|
||||||
|
0x40, 0x2C, 0x41, 0x2C, 0x42, 0x2C, 0x43, 0x2C,
|
||||||
|
0x40, 0x24, 0x41, 0x24, 0x42, 0x24, 0x43, 0x24,
|
||||||
|
0x40, 0x28, 0x41, 0x28, 0x42, 0x28, 0x43, 0x28,
|
||||||
|
0x40, 0x28, 0x41, 0x28, 0x42, 0x28, 0x43, 0x28,
|
||||||
|
];
|
||||||
|
rom.write_bytes(0x06FC51, spritedata)
|
||||||
|
|
||||||
|
# update sword references in credits to cane
|
||||||
|
rom.write_bytes(0x11807A, credits_string_top("FIRST NET "))
|
||||||
|
rom.write_bytes(0x118098, credits_string_bot("FIRST NET "))
|
||||||
|
rom.write_bytes(0x1180B6, credits_string_top("NETLESS "))
|
||||||
|
rom.write_bytes(0x1180D4, credits_string_bot("NETLESS "))
|
||||||
|
rom.write_bytes(0x1180F2, credits_string_top("FIGHTER'S NET "))
|
||||||
|
rom.write_bytes(0x118110, credits_string_bot("FIGHTER'S NET "))
|
||||||
|
rom.write_bytes(0x11812E, credits_string_top("MASTER NET "))
|
||||||
|
rom.write_bytes(0x11814C, credits_string_bot("MASTER NET "))
|
||||||
|
rom.write_bytes(0x11816A, credits_string_top("TEMPERED NET "))
|
||||||
|
rom.write_bytes(0x118188, credits_string_bot("TEMPERED NET "))
|
||||||
|
rom.write_bytes(0x1181A6, credits_string_top("GOLD NET "))
|
||||||
|
rom.write_bytes(0x1181C4, credits_string_bot("GOLD NET "))
|
||||||
|
|
||||||
# set up clocks for timed modes
|
# set up clocks for timed modes
|
||||||
if world.shuffle[player] == 'vanilla':
|
if world.shuffle[player] == 'vanilla':
|
||||||
|
|||||||
9
Rules.py
9
Rules.py
@@ -23,12 +23,12 @@ def set_rules(world, player):
|
|||||||
global_rules(world, player)
|
global_rules(world, player)
|
||||||
ow_inverted_rules(world, player)
|
ow_inverted_rules(world, player)
|
||||||
|
|
||||||
if world.swords[player] in ['swordless', 'swordless_hammer', 'bees']:
|
if world.swords[player] in ['swordless', 'swordless_b', 'bees']:
|
||||||
swordless_rules(world, player)
|
swordless_rules(world, player)
|
||||||
if world.swords[player] == 'bombs':
|
if world.swords[player] == 'bombs':
|
||||||
bomb_mode_rules(world, player)
|
bomb_mode_rules(world, player)
|
||||||
if world.swords[player] in ['byrna', 'somaria', 'cane']:
|
if world.swords[player] in ['byrna', 'somaria', 'cane', 'bugnet']:
|
||||||
cane_mode_rules(world, player)
|
cane_or_net_mode_rules(world, player)
|
||||||
if world.swords[player] in ['pseudo', 'assured_pseudo']:
|
if world.swords[player] in ['pseudo', 'assured_pseudo']:
|
||||||
pseudo_sword_mode_rules(world, player)
|
pseudo_sword_mode_rules(world, player)
|
||||||
|
|
||||||
@@ -870,6 +870,7 @@ def global_rules(world, player):
|
|||||||
and state.has_fire_source(player)
|
and state.has_fire_source(player)
|
||||||
and (state.has_crystals(world.crystals_needed_for_ganon[player], player) or world.goal[player] == 'z1')
|
and (state.has_crystals(world.crystals_needed_for_ganon[player], player) or world.goal[player] == 'z1')
|
||||||
and (state.has_real_sword(player, 3) or
|
and (state.has_real_sword(player, 3) or
|
||||||
|
state.has_special_weapon_level(player, 3) or
|
||||||
state.can_hit_stunned_ganon(player) or
|
state.can_hit_stunned_ganon(player) or
|
||||||
state.has_real_sword(player, 2) and
|
state.has_real_sword(player, 2) and
|
||||||
(state.has('Lamp', player) or state.can_extend_magic(player, 12))))
|
(state.has('Lamp', player) or state.can_extend_magic(player, 12))))
|
||||||
@@ -1510,7 +1511,7 @@ def bomb_mode_rules(world, player):
|
|||||||
add_bunny_rule(world.get_entrance('Turtle Rock', player), player)
|
add_bunny_rule(world.get_entrance('Turtle Rock', player), player)
|
||||||
add_bunny_rule(world.get_entrance('Misery Mire', player), player)
|
add_bunny_rule(world.get_entrance('Misery Mire', player), player)
|
||||||
|
|
||||||
def cane_mode_rules(world, player):
|
def cane_or_net_mode_rules(world, player):
|
||||||
set_rule(world.get_entrance('Tower Altar NW', player), lambda state: True)
|
set_rule(world.get_entrance('Tower Altar NW', player), lambda state: True)
|
||||||
set_rule(world.get_entrance('Skull Vines NW', player), lambda state: True)
|
set_rule(world.get_entrance('Skull Vines NW', player), lambda state: True)
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,8 @@
|
|||||||
"cane",
|
"cane",
|
||||||
"vanilla",
|
"vanilla",
|
||||||
"bees",
|
"bees",
|
||||||
"swordless_hammer"
|
"swordless_b",
|
||||||
|
"bugnet"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"flute_mode": {
|
"flute_mode": {
|
||||||
|
|||||||
Reference in New Issue
Block a user