Skip to content

Commit adaeccf

Browse files
committed
Merge branch 'OverworldShuffleDev' into OverworldShuffle
2 parents bd40ddf + a2a291b commit adaeccf

9 files changed

Lines changed: 53 additions & 27 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# Changelog
22

3+
# 0.6.1.11
4+
- Fixed bonk drops duplicate counting and potentially overwriting arbitrary values
5+
- Fixed boss icons on dungeon map check
6+
- Fixed dungeon counters to autotrack correctly
7+
- Key and chest counts in menu now display consistently (must have dungeon item or have visited dungeon to see the HUD)
8+
- Money balancing will fail in less scenarios
9+
- Fixed issue with Sanc pots not collecting
10+
- Enemizer now allows more enemies on water
11+
- Fix infinite pit fall issue with Old Man follower location
12+
- Fix bad overworld tilemap drawing on HC and Pyramid screens in OW Layout Shuffle
13+
314
## 0.6.1.10
415
- Emergency fix for bonk functionality
516

Fill.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,10 @@ def balance_money_progression(world):
10241024
'Rupees (100)': 100, 'Rupees (300)': 300}
10251025
rupee_rooms = {'Eastern Rupees': 90, 'Mire Key Rupees': 45, 'Mire Shooter Rupees': 90,
10261026
'TR Rupees': 270, 'PoD Dark Basement': 270}
1027-
acceptable_balancers = ['Bombs (3)', 'Arrows (10)', 'Bombs (10)']
1027+
acceptable_balancers = ['Single Bomb', 'Bombs (3)', 'Bombs (10)',
1028+
'Single Arrow', 'Arrows (5)', 'Arrows (10)',
1029+
'Small Magic', 'Big Magic', 'Small Heart',
1030+
'Fairy', 'Chicken', 'Nothing']
10281031

10291032
base_value = sum(rupee_rooms.values())
10301033
available_money = {player: base_value for player in range(1, world.players+1)}
@@ -1125,10 +1128,11 @@ def kiki_required(state, location):
11251128
unchecked_locations.remove(location)
11261129
if location.item:
11271130
if location.item.name.startswith('Rupee'):
1128-
wallet[location.item.player] += rupee_chart[location.item.name]
1129-
if location.item.name != 'Rupees (300)':
1130-
balance_locations[location.item.player].add(location)
1131-
if interesting_item(location, location.item, world, location.item.player):
1131+
if not (location.item.name == 'Rupee (1)' and world.algorithm != 'district'):
1132+
wallet[location.item.player] += rupee_chart[location.item.name]
1133+
if location.item.name != 'Rupees (300)':
1134+
balance_locations[location.item.player].add(location)
1135+
elif interesting_item(location, location.item, world, location.item.player):
11321136
checked_locations.append(location)
11331137
elif location.item.name in acceptable_balancers:
11341138
balance_locations[location.item.player].add(location)
@@ -1172,7 +1176,11 @@ def kiki_required(state, location):
11721176
if len(increase_targets) == 0:
11731177
increase_targets = [x for x in balance_locations[target_player] if (rupee_chart[x.item.name] if x.item.name in rupee_chart else 0) < best_value]
11741178
if len(increase_targets) == 0:
1175-
raise Exception('No early sphere swaps for rupees - money grind would be required - bailing for now')
1179+
if state.can_farm_rupees(target_player):
1180+
logger.warning(f'No more swap targets available. Short by {difference} rupees, but continuing (player can farm)')
1181+
break
1182+
else:
1183+
raise Exception(f'No early sphere swaps for rupees - money grind would be required - bailing for now')
11761184
best_target = min(increase_targets, key=lambda t: rupee_chart[t.item.name] if t.item.name in rupee_chart else 0)
11771185
make_item_free = wallet[target_player] < 20
11781186
old_value = 0 if make_item_free else (rupee_chart[best_target.item.name] if best_target.item.name in rupee_chart else 0)

Main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
from source.enemizer.Enemizer import randomize_enemies
4141
from source.rom.DataTables import init_data_tables
4242

43-
version_number = '1.5.0'
43+
version_number = '1.5.2'
4444
version_branch = '-u'
4545
__version__ = f'{version_number}{version_branch}'
4646

OverworldShuffle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from OverworldGlitchRules import create_owg_connections
99
from Utils import bidict
1010

11-
version_number = '0.6.1.10'
11+
version_number = '0.6.1.11'
1212
# branch indicator is intentionally different across branches
1313
version_branch = ''
1414

Rom.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444

4545
JAP10HASH = '03a63945398191337e896e5771f77173'
46-
RANDOMIZERBASEHASH = 'f2eebfbec9c8ad638e922ed1047d1c10'
46+
RANDOMIZERBASEHASH = '34c9d7b09fad982dea9e7c9e3ae885ee'
4747

4848

4949
class JsonRom(object):
@@ -1382,9 +1382,15 @@ def get_goal_bytes(type):
13821382
| (0x04 if world.mapshuffle[player] != 'none' else 0x00)
13831383
| (0x08 if world.bigkeyshuffle[player] != 'none' else 0x00))) # free roaming item text boxes
13841384
rom.write_byte(0x18003B, 0x01 if world.mapshuffle[player] not in ['none', 'nearby'] else 0x00) # maps showing crystals on overworld
1385-
if world.keyshuffle[player] != 'universal' and (world.mapshuffle[player] not in ['none', 'nearby'] or world.doorShuffle[player] != 'vanilla'
1386-
or world.dropshuffle[player] != 'none' or world.pottery[player] not in ['none', 'cave']):
1387-
rom.write_byte(0x18003A, 0x01) # show key counts on map pickup
1385+
map_hud_mode = 0x00
1386+
if world.dungeon_counters[player] == 'on':
1387+
map_hud_mode = 0x02 # always on
1388+
elif world.dungeon_counters[player] == 'off':
1389+
pass
1390+
elif world.keyshuffle[player] != 'universal' and (world.mapshuffle[player] not in ['none', 'nearby'] or world.doorShuffle[player] != 'vanilla'
1391+
or world.dropshuffle[player] != 'none' or world.pottery[player] not in ['none', 'cave'] or world.dungeon_counters[player] == 'pickup'):
1392+
map_hud_mode = 0x01 # show on pickup
1393+
rom.write_byte(0x18003A, map_hud_mode)
13881394

13891395
# compasses showing dungeon count
13901396
compass_mode = 0x80 if world.compassshuffle[player] not in ['none', 'nearby'] else 0x00

data/base2current.bps

386 Bytes
Binary file not shown.

source/enemizer/SpriteSheets.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,9 @@ def init_sprite_requirements():
177177
SpriteRequirement(EnemySprite.Vulture).no_drop().sub_group(2, 0x12).exclude(NoFlyingRooms),
178178
SpriteRequirement(EnemySprite.CorrectPullSwitch).affix().sub_group(3, [0x52, 0x53]),
179179
SpriteRequirement(EnemySprite.WrongPullSwitch).affix().sub_group(3, [0x52, 0x53]),
180-
SpriteRequirement(EnemySprite.Octorok).aquaphobia().sub_group(2, [0xc, 0x18]),
180+
SpriteRequirement(EnemySprite.Octorok).sub_group(2, [0xc, 0x18]),
181181
SpriteRequirement(EnemySprite.Moldorm).exalt().sub_group(2, 0x30),
182-
SpriteRequirement(EnemySprite.Octorok4Way).aquaphobia().sub_group(2, 0xc),
182+
SpriteRequirement(EnemySprite.Octorok4Way).sub_group(2, 0xc),
183183
SpriteRequirement(EnemySprite.Cucco).immune().sub_group(3, [0x15, 0x50]).exclude(NoFlyingRooms),
184184
SpriteRequirement(EnemySprite.Buzzblob).sub_group(3, 0x11),
185185
SpriteRequirement(EnemySprite.Snapdragon).sub_group(0, 0x16).sub_group(2, 0x17),
@@ -191,7 +191,7 @@ def init_sprite_requirements():
191191
.exclude(NoFlyingRooms).exclude({0x40}), # no anti-fairies in aga tower bridge room
192192
SpriteRequirement(EnemySprite.Wiseman).affix().sub_group(2, 0x4c),
193193
SpriteRequirement(EnemySprite.Hoarder).sub_group(3, 0x11).exclude({0x10c}),
194-
SpriteRequirement(EnemySprite.MiniMoldorm).aquaphobia().sub_group(1, 0x1e),
194+
SpriteRequirement(EnemySprite.MiniMoldorm).sub_group(1, 0x1e),
195195
SpriteRequirement(EnemySprite.Poe).no_drop().sub_group(3, 0x15).exclude(NoFlyingRooms),
196196
SpriteRequirement(EnemySprite.Smithy).affix().sub_group(1, 0x1d).sub_group(3, 0x15),
197197
SpriteRequirement(EnemySprite.Statue).stasis().immune().sub_group(3, [0x52, 0x53]),
@@ -225,12 +225,12 @@ def init_sprite_requirements():
225225
SpriteRequirement(EnemySprite.Hoarder2).sub_group(3, 0x11).exclude({0x10c}),
226226
SpriteRequirement(EnemySprite.TutorialGuard).affix(),
227227
SpriteRequirement(EnemySprite.LightningGate).affix().sub_group(3, 0x3f),
228-
SpriteRequirement(EnemySprite.BlueGuard).aquaphobia().sub_group(1, [0xd, 0x49]).exclude(PitRooms),
229-
SpriteRequirement(EnemySprite.BlueGuard).aquaphobia().sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]),
230-
SpriteRequirement(EnemySprite.GreenGuard).aquaphobia().sub_group(1, 0x49).exclude(PitRooms),
231-
SpriteRequirement(EnemySprite.GreenGuard).aquaphobia().sub_group(1, 0x49).sub_group(2, 0x13),
232-
SpriteRequirement(EnemySprite.RedSpearGuard).aquaphobia().sub_group(1, [0xd, 0x49]).exclude(PitRooms),
233-
SpriteRequirement(EnemySprite.RedSpearGuard).aquaphobia().sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]),
228+
SpriteRequirement(EnemySprite.BlueGuard).sub_group(1, [0xd, 0x49]).exclude(PitRooms),
229+
SpriteRequirement(EnemySprite.BlueGuard).sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]),
230+
SpriteRequirement(EnemySprite.GreenGuard).sub_group(1, 0x49).exclude(PitRooms),
231+
SpriteRequirement(EnemySprite.GreenGuard).sub_group(1, 0x49).sub_group(2, 0x13),
232+
SpriteRequirement(EnemySprite.RedSpearGuard).sub_group(1, [0xd, 0x49]).exclude(PitRooms),
233+
SpriteRequirement(EnemySprite.RedSpearGuard).sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]),
234234
SpriteRequirement(EnemySprite.BluesainBolt).aquaphobia().sub_group(0, 0x46).sub_group(1, [0xd, 0x49]),
235235
SpriteRequirement(EnemySprite.UsainBolt).aquaphobia().sub_group(1, [0xd, 0x49]),
236236
SpriteRequirement(EnemySprite.BlueArcher).sub_group(0, 0x48).sub_group(1, 0x49),

source/rom/DataTables.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,11 @@ def write_ow_sprite_data_to_rom(self, rom):
141141
bytes = sum(1+len(x)*3 for x in self.ow_enemy_table.values() if len(x) > 0)+1
142142
self.pointer_addresses['ow_sprites'][1] = bytes
143143
# ending_byte = 0x09CB3B + bytes
144-
max_per_state = {0: 0x40, 1: 0x90, 2: 0x90}
144+
max_per_state = {0: 0x40, 1: 0x90, 2: 0x81} # dropped max on state 2 to steal space for extra sprites (Murahdahla, extra tutorial guard)
145145

146146
pointer_address = snes_to_pc(self.pointer_addresses['ow_sprites'][2][0])
147-
data_pointer = snes_to_pc(self.pointer_addresses['ow_sprites'][0])
147+
self.pointer_addresses['ow_sprites'][0] = pointer_address + ((max_per_state[0] + max_per_state[1] + max_per_state[2]) * 2)
148+
data_pointer = self.pointer_addresses['ow_sprites'][0]
148149
empty_pointer = pc_to_snes(data_pointer) & 0xFFFF
149150
rom.write_byte(data_pointer, 0xff)
150151
cached_dark_world = {}
@@ -177,6 +178,10 @@ def write_ow_sprite_data_to_rom(self, rom):
177178
data_pointer += len(data)
178179
rom.write_byte(data_pointer, 0xff)
179180
data_pointer += 1
181+
# Check if OW sprite data has overwritten the UW sprite pointer table
182+
max_allowed_address = snes_to_pc(0x09D62E)
183+
if data_pointer > max_allowed_address:
184+
raise Exception(f'OW sprite data will cause the UW sprite pointer table to overwrite the pots pointer table. Data end: {hex(pc_to_snes(data_pointer))}, Max allowed: $09D62E')
180185

181186

182187
special_health_table = {

source/tools/MysteryUtils.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,7 @@ def get_choice_bool_default(option, root=weights, default=None):
147147
ret.door_self_loops = get_choice_bool('door_self_loops')
148148
ret.experimental = get_choice_bool('experimental')
149149
ret.collection_rate = get_choice_bool('collection_rate')
150-
151150
ret.dungeon_counters = get_choice_non_bool('dungeon_counters') if 'dungeon_counters' in weights else 'default'
152-
if ret.dungeon_counters == 'default':
153-
ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle != 'none' else 'off'
154-
155151
ret.pseudoboots = get_choice_bool('pseudoboots')
156152
ret.mirrorscroll = get_choice_bool('mirrorscroll')
157153
ret.shopsanity = get_choice_bool('shopsanity')

0 commit comments

Comments
 (0)