remove fairy and big magic from bonk prizes in hard/expert
remove arrow prizes in retro when "g" is not toggled rename "difficulty_adjustments" to "item_functionality"
This commit is contained in:
parent
6bc1ed5584
commit
0af77421fc
|
@ -25,7 +25,7 @@ class World(object):
|
||||||
plando_items: List[PlandoItem]
|
plando_items: List[PlandoItem]
|
||||||
plando_connections: List[PlandoConnection]
|
plando_connections: List[PlandoConnection]
|
||||||
|
|
||||||
def __init__(self, players: int, shuffle, logic, mode, swords, difficulty, difficulty_adjustments, timer,
|
def __init__(self, players: int, shuffle, logic, mode, swords, difficulty, item_functionality, timer,
|
||||||
progressive,
|
progressive,
|
||||||
goal, algorithm, accessibility, shuffle_ganon, retro, custom, customitemarray, hints):
|
goal, algorithm, accessibility, shuffle_ganon, retro, custom, customitemarray, hints):
|
||||||
if self.debug_types:
|
if self.debug_types:
|
||||||
|
@ -46,7 +46,7 @@ class World(object):
|
||||||
self.mode = mode.copy()
|
self.mode = mode.copy()
|
||||||
self.swords = swords.copy()
|
self.swords = swords.copy()
|
||||||
self.difficulty = difficulty.copy()
|
self.difficulty = difficulty.copy()
|
||||||
self.difficulty_adjustments = difficulty_adjustments.copy()
|
self.item_functionality = item_functionality.copy()
|
||||||
self.timer = timer.copy()
|
self.timer = timer.copy()
|
||||||
self.progressive = progressive
|
self.progressive = progressive
|
||||||
self.goal = goal.copy()
|
self.goal = goal.copy()
|
||||||
|
@ -691,9 +691,9 @@ class CollectionState(object):
|
||||||
elif self.has('Magic Upgrade (1/2)', player):
|
elif self.has('Magic Upgrade (1/2)', player):
|
||||||
basemagic = 16
|
basemagic = 16
|
||||||
if self.can_buy_unlimited('Green Potion', player) or self.can_buy_unlimited('Blue Potion', player):
|
if self.can_buy_unlimited('Green Potion', player) or self.can_buy_unlimited('Blue Potion', player):
|
||||||
if self.world.difficulty_adjustments[player] == 'hard' and not fullrefill:
|
if self.world.item_functionality[player] == 'hard' and not fullrefill:
|
||||||
basemagic = basemagic + int(basemagic * 0.5 * self.bottle_count(player))
|
basemagic = basemagic + int(basemagic * 0.5 * self.bottle_count(player))
|
||||||
elif self.world.difficulty_adjustments[player] == 'expert' and not fullrefill:
|
elif self.world.item_functionality[player] == 'expert' and not fullrefill:
|
||||||
basemagic = basemagic + int(basemagic * 0.25 * self.bottle_count(player))
|
basemagic = basemagic + int(basemagic * 0.25 * self.bottle_count(player))
|
||||||
else:
|
else:
|
||||||
basemagic = basemagic + basemagic * self.bottle_count(player)
|
basemagic = basemagic + basemagic * self.bottle_count(player)
|
||||||
|
@ -1301,7 +1301,7 @@ class Spoiler(object):
|
||||||
'goal': self.world.goal,
|
'goal': self.world.goal,
|
||||||
'shuffle': self.world.shuffle,
|
'shuffle': self.world.shuffle,
|
||||||
'item_pool': self.world.difficulty,
|
'item_pool': self.world.difficulty,
|
||||||
'item_functionality': self.world.difficulty_adjustments,
|
'item_functionality': self.world.item_functionality,
|
||||||
'gt_crystals': self.world.crystals_needed_for_gt,
|
'gt_crystals': self.world.crystals_needed_for_gt,
|
||||||
'ganon_crystals': self.world.crystals_needed_for_ganon,
|
'ganon_crystals': self.world.crystals_needed_for_ganon,
|
||||||
'open_pyramid': self.world.open_pyramid,
|
'open_pyramid': self.world.open_pyramid,
|
||||||
|
|
6
Main.py
6
Main.py
|
@ -285,7 +285,7 @@ def main(args, seed=None):
|
||||||
outfilestuffs = {
|
outfilestuffs = {
|
||||||
"logic": world.logic[player], # 0
|
"logic": world.logic[player], # 0
|
||||||
"difficulty": world.difficulty[player], # 1
|
"difficulty": world.difficulty[player], # 1
|
||||||
"difficulty_adjustments": world.difficulty_adjustments[player], # 2
|
"item_functionality": world.item_functionality[player], # 2
|
||||||
"mode": world.mode[player], # 3
|
"mode": world.mode[player], # 3
|
||||||
"goal": world.goal[player], # 4
|
"goal": world.goal[player], # 4
|
||||||
"timer": str(world.timer[player]), # 5
|
"timer": str(world.timer[player]), # 5
|
||||||
|
@ -306,7 +306,7 @@ def main(args, seed=None):
|
||||||
outfilestuffs["logic"], # 0
|
outfilestuffs["logic"], # 0
|
||||||
|
|
||||||
outfilestuffs["difficulty"], # 1
|
outfilestuffs["difficulty"], # 1
|
||||||
outfilestuffs["difficulty_adjustments"], # 2
|
outfilestuffs["item_functionality"], # 2
|
||||||
outfilestuffs["mode"], # 3
|
outfilestuffs["mode"], # 3
|
||||||
outfilestuffs["goal"], # 4
|
outfilestuffs["goal"], # 4
|
||||||
"" if outfilestuffs["timer"] in ['False', 'none', 'display'] else "-" + outfilestuffs["timer"], # 5
|
"" if outfilestuffs["timer"] in ['False', 'none', 'display'] else "-" + outfilestuffs["timer"], # 5
|
||||||
|
@ -463,7 +463,7 @@ def main(args, seed=None):
|
||||||
|
|
||||||
def copy_world(world):
|
def copy_world(world):
|
||||||
# ToDo: Not good yet
|
# ToDo: Not good yet
|
||||||
ret = World(world.players, world.shuffle, world.logic, world.mode, world.swords, world.difficulty, world.difficulty_adjustments, world.timer, world.progressive, world.goal, world.algorithm, world.accessibility, world.shuffle_ganon, world.retro, world.custom, world.customitemarray, world.hints)
|
ret = World(world.players, world.shuffle, world.logic, world.mode, world.swords, world.difficulty, world.item_functionality, world.timer, world.progressive, world.goal, world.algorithm, world.accessibility, world.shuffle_ganon, world.retro, world.custom, world.customitemarray, world.hints)
|
||||||
ret.teams = world.teams
|
ret.teams = world.teams
|
||||||
ret.player_names = copy.deepcopy(world.player_names)
|
ret.player_names = copy.deepcopy(world.player_names)
|
||||||
ret.remote_items = world.remote_items.copy()
|
ret.remote_items = world.remote_items.copy()
|
||||||
|
|
67
Rom.py
67
Rom.py
|
@ -674,6 +674,14 @@ class Sprite(object):
|
||||||
rom.write_bytes(0x307000, self.palette)
|
rom.write_bytes(0x307000, self.palette)
|
||||||
rom.write_bytes(0x307078, self.glove_palette)
|
rom.write_bytes(0x307078, self.glove_palette)
|
||||||
|
|
||||||
|
bonk_addresses = [0x4CF6C, 0x4CFBA, 0x4CFE0, 0x4CFFB, 0x4D018, 0x4D01B, 0x4D028, 0x4D03C, 0x4D059, 0x4D07A,
|
||||||
|
0x4D09E, 0x4D0A8, 0x4D0AB, 0x4D0AE, 0x4D0BE, 0x4D0DD,
|
||||||
|
0x4D16A, 0x4D1E5, 0x4D1EE, 0x4D20B, 0x4CBBF, 0x4CBBF, 0x4CC17, 0x4CC1A, 0x4CC4A, 0x4CC4D,
|
||||||
|
0x4CC53, 0x4CC69, 0x4CC6F, 0x4CC7C, 0x4CCEF, 0x4CD51,
|
||||||
|
0x4CDC0, 0x4CDC3, 0x4CDC6, 0x4CE37, 0x4D2DE, 0x4D32F, 0x4D355, 0x4D367, 0x4D384, 0x4D387,
|
||||||
|
0x4D397, 0x4D39E, 0x4D3AB, 0x4D3AE, 0x4D3D1, 0x4D3D7,
|
||||||
|
0x4D3F8, 0x4D416, 0x4D420, 0x4D423, 0x4D42D, 0x4D449, 0x4D48C, 0x4D4D9, 0x4D4DC, 0x4D4E3,
|
||||||
|
0x4D504, 0x4D507, 0x4D55E, 0x4D56A]
|
||||||
|
|
||||||
def patch_rom(world, rom, player, team, enemized):
|
def patch_rom(world, rom, player, team, enemized):
|
||||||
local_random = world.rom_seeds[player]
|
local_random = world.rom_seeds[player]
|
||||||
|
@ -868,8 +876,8 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
|
|
||||||
rom.write_byte(0x18004F, 0x01) # Byrna Invulnerability: on
|
rom.write_byte(0x18004F, 0x01) # Byrna Invulnerability: on
|
||||||
|
|
||||||
# handle difficulty_adjustments
|
# handle item_functionality
|
||||||
if world.difficulty_adjustments[player] == 'hard':
|
if world.item_functionality[player] == 'hard':
|
||||||
rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon
|
rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon
|
||||||
rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup
|
rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup
|
||||||
# Powdered Fairies Prize
|
# Powdered Fairies Prize
|
||||||
|
@ -889,7 +897,7 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
rom.write_int16(0x180036, world.rupoor_cost)
|
rom.write_int16(0x180036, world.rupoor_cost)
|
||||||
# Set stun items
|
# Set stun items
|
||||||
rom.write_byte(0x180180, 0x02) # Hookshot only
|
rom.write_byte(0x180180, 0x02) # Hookshot only
|
||||||
elif world.difficulty_adjustments[player] == 'expert':
|
elif world.item_functionality[player] == 'expert':
|
||||||
rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon
|
rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon
|
||||||
rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup
|
rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup
|
||||||
# Powdered Fairies Prize
|
# Powdered Fairies Prize
|
||||||
|
@ -958,6 +966,15 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
|
|
||||||
# set up game internal RNG seed
|
# set up game internal RNG seed
|
||||||
rom.write_bytes(0x178000, local_random.getrandbits(8 * 1024).to_bytes(1024, 'big'))
|
rom.write_bytes(0x178000, local_random.getrandbits(8 * 1024).to_bytes(1024, 'big'))
|
||||||
|
prize_replacements = {}
|
||||||
|
if world.item_functionality[player] in ['hard', 'expert']:
|
||||||
|
prize_replacements[0xE0] = 0xDF # Fairy -> heart
|
||||||
|
prize_replacements[0xE3] = 0xD8 # Big magic -> small magic
|
||||||
|
|
||||||
|
if world.retro[player]:
|
||||||
|
prize_replacements[0xE1] = 0xDA # 5 Arrows -> Blue Rupee
|
||||||
|
prize_replacements[0xE2] = 0xDB # 10 Arrows -> Red Rupee
|
||||||
|
|
||||||
if "g" in world.shuffle_prizes[player]:
|
if "g" in world.shuffle_prizes[player]:
|
||||||
# shuffle prize packs
|
# shuffle prize packs
|
||||||
prizes = [0xD8, 0xD8, 0xD8, 0xD8, 0xD9, 0xD8, 0xD8, 0xD9, 0xDA, 0xD9, 0xDA, 0xDB, 0xDA, 0xD9, 0xDA, 0xDA, 0xE0,
|
prizes = [0xD8, 0xD8, 0xD8, 0xD8, 0xD9, 0xD8, 0xD8, 0xD9, 0xDA, 0xD9, 0xDA, 0xDB, 0xDA, 0xD9, 0xDA, 0xDA, 0xE0,
|
||||||
|
@ -983,18 +1000,10 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
packs = chunk(prizes[:56], 8)
|
packs = chunk(prizes[:56], 8)
|
||||||
local_random.shuffle(packs)
|
local_random.shuffle(packs)
|
||||||
prizes[:56] = [drop for pack in packs for drop in pack]
|
prizes[:56] = [drop for pack in packs for drop in pack]
|
||||||
|
if prize_replacements:
|
||||||
if world.difficulty_adjustments[player] in ['hard', 'expert']:
|
|
||||||
prize_replacements = {0xE0: 0xDF, # Fairy -> heart
|
|
||||||
0xE3: 0xD8} # Big magic -> small magic
|
|
||||||
prizes = [prize_replacements.get(prize, prize) for prize in prizes]
|
prizes = [prize_replacements.get(prize, prize) for prize in prizes]
|
||||||
dig_prizes = [prize_replacements.get(prize, prize) for prize in dig_prizes]
|
dig_prizes = [prize_replacements.get(prize, prize) for prize in dig_prizes]
|
||||||
|
|
||||||
if world.retro[player]:
|
|
||||||
prize_replacements = {0xE1: 0xDA, # 5 Arrows -> Blue Rupee
|
|
||||||
0xE2: 0xDB} # 10 Arrows -> Red Rupee
|
|
||||||
prizes = [prize_replacements.get(prize, prize) for prize in prizes]
|
|
||||||
dig_prizes = [prize_replacements.get(prize, prize) for prize in dig_prizes]
|
|
||||||
rom.write_bytes(0x180100, dig_prizes)
|
rom.write_bytes(0x180100, dig_prizes)
|
||||||
|
|
||||||
# write tree pull prizes
|
# write tree pull prizes
|
||||||
|
@ -1015,6 +1024,19 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
# fill enemy prize packs
|
# fill enemy prize packs
|
||||||
rom.write_bytes(0x37A78, prizes)
|
rom.write_bytes(0x37A78, prizes)
|
||||||
|
|
||||||
|
elif prize_replacements:
|
||||||
|
dig_prizes = list(rom.read_bytes(0x180100, 64))
|
||||||
|
dig_prizes = [prize_replacements.get(byte, byte) for byte in dig_prizes]
|
||||||
|
rom.write_bytes(0x180100, dig_prizes)
|
||||||
|
|
||||||
|
prizes = list(rom.read_bytes(0x37A78, 56))
|
||||||
|
prizes = [prize_replacements.get(byte, byte) for byte in prizes]
|
||||||
|
rom.write_bytes(0x37A78, prizes)
|
||||||
|
|
||||||
|
for address in (0xEFBD4, 0xEFBD5, 0xEFBD6, 0x329C8, 0x329C4, 0x37993, 0xE82CC):
|
||||||
|
byte = int(rom.read_byte(address))
|
||||||
|
rom.write_byte(address, prize_replacements.get(byte, byte))
|
||||||
|
|
||||||
if "b" in world.shuffle_prizes[player]:
|
if "b" in world.shuffle_prizes[player]:
|
||||||
# set bonk prizes
|
# set bonk prizes
|
||||||
bonk_prizes = [0x79, 0xE3, 0x79, 0xAC, 0xAC, 0xE0, 0xDC, 0xAC, 0xE3, 0xE3, 0xDA, 0xE3, 0xDA, 0xD8, 0xAC,
|
bonk_prizes = [0x79, 0xE3, 0x79, 0xAC, 0xAC, 0xE0, 0xDC, 0xAC, 0xE3, 0xE3, 0xDA, 0xE3, 0xDA, 0xD8, 0xAC,
|
||||||
|
@ -1022,18 +1044,21 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
0xE3, 0xE3,
|
0xE3, 0xE3,
|
||||||
0xDA, 0x79, 0xAC, 0xAC, 0x79, 0xE3, 0x79, 0xAC, 0xAC, 0xE0, 0xDC, 0xE3, 0x79, 0xDE, 0xE3,
|
0xDA, 0x79, 0xAC, 0xAC, 0x79, 0xE3, 0x79, 0xAC, 0xAC, 0xE0, 0xDC, 0xE3, 0x79, 0xDE, 0xE3,
|
||||||
0xAC, 0xDB, 0x79, 0xE3, 0xD8, 0xAC, 0x79, 0xE3, 0xDB, 0xDB, 0xE3, 0xE3, 0x79, 0xD8, 0xDD]
|
0xAC, 0xDB, 0x79, 0xE3, 0xD8, 0xAC, 0x79, 0xE3, 0xDB, 0xDB, 0xE3, 0xE3, 0x79, 0xD8, 0xDD]
|
||||||
bonk_addresses = [0x4CF6C, 0x4CFBA, 0x4CFE0, 0x4CFFB, 0x4D018, 0x4D01B, 0x4D028, 0x4D03C, 0x4D059, 0x4D07A,
|
|
||||||
0x4D09E, 0x4D0A8, 0x4D0AB, 0x4D0AE, 0x4D0BE, 0x4D0DD,
|
|
||||||
0x4D16A, 0x4D1E5, 0x4D1EE, 0x4D20B, 0x4CBBF, 0x4CBBF, 0x4CC17, 0x4CC1A, 0x4CC4A, 0x4CC4D,
|
|
||||||
0x4CC53, 0x4CC69, 0x4CC6F, 0x4CC7C, 0x4CCEF, 0x4CD51,
|
|
||||||
0x4CDC0, 0x4CDC3, 0x4CDC6, 0x4CE37, 0x4D2DE, 0x4D32F, 0x4D355, 0x4D367, 0x4D384, 0x4D387,
|
|
||||||
0x4D397, 0x4D39E, 0x4D3AB, 0x4D3AE, 0x4D3D1, 0x4D3D7,
|
|
||||||
0x4D3F8, 0x4D416, 0x4D420, 0x4D423, 0x4D42D, 0x4D449, 0x4D48C, 0x4D4D9, 0x4D4DC, 0x4D4E3,
|
|
||||||
0x4D504, 0x4D507, 0x4D55E, 0x4D56A]
|
|
||||||
local_random.shuffle(bonk_prizes)
|
local_random.shuffle(bonk_prizes)
|
||||||
|
|
||||||
|
if prize_replacements:
|
||||||
|
bonk_prizes = [prize_replacements.get(prize, prize) for prize in bonk_prizes]
|
||||||
|
|
||||||
for prize, address in zip(bonk_prizes, bonk_addresses):
|
for prize, address in zip(bonk_prizes, bonk_addresses):
|
||||||
rom.write_byte(address, prize)
|
rom.write_byte(address, prize)
|
||||||
|
|
||||||
|
elif prize_replacements:
|
||||||
|
for address in bonk_addresses:
|
||||||
|
byte = int(rom.read_byte(address))
|
||||||
|
rom.write_byte(address, prize_replacements.get(byte, byte))
|
||||||
|
|
||||||
|
|
||||||
# Fill in item substitutions table
|
# Fill in item substitutions table
|
||||||
rom.write_bytes(0x184000, [
|
rom.write_bytes(0x184000, [
|
||||||
# original_item, limit, replacement_item, filler
|
# original_item, limit, replacement_item, filler
|
||||||
|
@ -1092,7 +1117,7 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
rom.write_byte(0x180043, 0xFF if world.swords[player] == 'swordless' else 0x00) # starting sword for link
|
rom.write_byte(0x180043, 0xFF if world.swords[player] == 'swordless' else 0x00) # starting sword for link
|
||||||
rom.write_byte(0x180044, 0x01 if world.swords[player] == 'swordless' else 0x00) # hammer activates tablets
|
rom.write_byte(0x180044, 0x01 if world.swords[player] == 'swordless' else 0x00) # hammer activates tablets
|
||||||
|
|
||||||
if world.difficulty_adjustments[player] == 'easy':
|
if world.item_functionality[player] == 'easy':
|
||||||
rom.write_byte(0x18003F, 0x01) # hammer can harm ganon
|
rom.write_byte(0x18003F, 0x01) # hammer can harm ganon
|
||||||
rom.write_byte(0x180041, 0x02) # Allow swordless medallion use EVERYWHERE.
|
rom.write_byte(0x180041, 0x02) # Allow swordless medallion use EVERYWHERE.
|
||||||
rom.write_byte(0x180044, 0x01) # hammer activates tablets
|
rom.write_byte(0x180044, 0x01) # hammer activates tablets
|
||||||
|
|
Loading…
Reference in New Issue