Torch keys counted like chest
Moved the total key counter to a count down on the left. Added the BK indicator Attempt to fix dungeon counters and fish error in Mystery.py Removed double rom patch AT map added. 5 chests min for all dungeons
This commit is contained in:
@@ -706,12 +706,10 @@ def cross_dungeon(world, player):
|
|||||||
check_required_paths(paths, world, player)
|
check_required_paths(paths, world, player)
|
||||||
|
|
||||||
hc = world.get_dungeon('Hyrule Castle', player)
|
hc = world.get_dungeon('Hyrule Castle', player)
|
||||||
del hc.dungeon_items[0] # removes map
|
|
||||||
hc.dungeon_items.append(ItemFactory('Compass (Escape)', player))
|
hc.dungeon_items.append(ItemFactory('Compass (Escape)', player))
|
||||||
at = world.get_dungeon('Agahnims Tower', player)
|
at = world.get_dungeon('Agahnims Tower', player)
|
||||||
at.dungeon_items.append(ItemFactory('Compass (Agahnims Tower)', player))
|
at.dungeon_items.append(ItemFactory('Compass (Agahnims Tower)', player))
|
||||||
gt = world.get_dungeon('Ganons Tower', player)
|
at.dungeon_items.append(ItemFactory('Map (Agahnims Tower)', player))
|
||||||
del gt.dungeon_items[0] # removes map
|
|
||||||
|
|
||||||
assign_cross_keys(dungeon_builders, world, player)
|
assign_cross_keys(dungeon_builders, world, player)
|
||||||
all_dungeon_items = [y for x in world.dungeons if x.player == player for y in x.all_items]
|
all_dungeon_items = [y for x in world.dungeons if x.player == player for y in x.all_items]
|
||||||
|
|||||||
@@ -1237,7 +1237,7 @@ def assign_location_sectors(dungeon_map, free_location_sectors, global_pole):
|
|||||||
totals[choice] += sector.chest_locations
|
totals[choice] += sector.chest_locations
|
||||||
valid = True
|
valid = True
|
||||||
for d_name, idx in d_idx.items():
|
for d_name, idx in d_idx.items():
|
||||||
if totals[idx] < minimal_locations(d_name):
|
if totals[idx] < 5: # min locations for dungeons is 5 (bk exception)
|
||||||
valid = False
|
valid = False
|
||||||
break
|
break
|
||||||
for i, choice in enumerate(choices):
|
for i, choice in enumerate(choices):
|
||||||
@@ -1268,18 +1268,6 @@ def weighted_random_locations(dungeon_map, free_location_sectors):
|
|||||||
return choices, d_idx, totals
|
return choices, d_idx, totals
|
||||||
|
|
||||||
|
|
||||||
def minimal_locations(dungeon_name):
|
|
||||||
# bump to 5 if maps do something useful for all these dungeons
|
|
||||||
if dungeon_name == 'Hyrule Castle':
|
|
||||||
return 4 # bk + compass + 2 others
|
|
||||||
if dungeon_name == 'Agahnims Tower':
|
|
||||||
return 4
|
|
||||||
if dungeon_name == 'Ganons Tower':
|
|
||||||
return 4
|
|
||||||
# reduce gt to 4 once compasses work
|
|
||||||
return 5
|
|
||||||
|
|
||||||
|
|
||||||
def assign_crystal_switch_sectors(dungeon_map, crystal_switches, global_pole, assign_one=False):
|
def assign_crystal_switch_sectors(dungeon_map, crystal_switches, global_pole, assign_one=False):
|
||||||
population = []
|
population = []
|
||||||
some_c_switches_present = False
|
some_c_switches_present = False
|
||||||
|
|||||||
1
Items.py
1
Items.py
@@ -130,6 +130,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 'You have\nchosen the\narcher cla
|
|||||||
'Small Key (Agahnims Tower)': (False, False, 'SmallKey', 0xA4, 'A small key to Agahnim', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Castle Tower'),
|
'Small Key (Agahnims Tower)': (False, False, 'SmallKey', 0xA4, 'A small key to Agahnim', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Castle Tower'),
|
||||||
'Big Key (Agahnims Tower)': (False, False, 'BigKey', 0x9B, 'A big key to Agahnim', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Castle Tower'),
|
'Big Key (Agahnims Tower)': (False, False, 'BigKey', 0x9B, 'A big key to Agahnim', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Castle Tower'),
|
||||||
'Compass (Agahnims Tower)': (False, True, 'Compass', 0x8B, 'Now you can find Aga1!', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds null again', 'a compass to Castle Tower'),
|
'Compass (Agahnims Tower)': (False, True, 'Compass', 0x8B, 'Now you can find Aga1!', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds null again', 'a compass to Castle Tower'),
|
||||||
|
'Map (Agahnims Tower)': (False, True, 'Map', 0x7B, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Castle Tower'),
|
||||||
'Small Key (Palace of Darkness)': (False, False, 'SmallKey', 0xA6, 'A small key to darkness', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Palace of Darkness'),
|
'Small Key (Palace of Darkness)': (False, False, 'SmallKey', 0xA6, 'A small key to darkness', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Palace of Darkness'),
|
||||||
'Big Key (Palace of Darkness)': (False, False, 'BigKey', 0x99, 'A big key to darkness', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Palace of Darkness'),
|
'Big Key (Palace of Darkness)': (False, False, 'BigKey', 0x99, 'A big key to darkness', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Palace of Darkness'),
|
||||||
'Compass (Palace of Darkness)': (False, True, 'Compass', 0x89, 'Now you can find Helmasaur King!', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds boss again', 'a compass to Palace of Darkness'),
|
'Compass (Palace of Darkness)': (False, True, 'Compass', 0x89, 'Now you can find Helmasaur King!', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds boss again', 'a compass to Palace of Darkness'),
|
||||||
|
|||||||
2
Main.py
2
Main.py
@@ -200,8 +200,6 @@ def main(args, seed=None, fish=None):
|
|||||||
|
|
||||||
rom = JsonRom() if args.jsonout or use_enemizer else LocalRom(args.rom)
|
rom = JsonRom() if args.jsonout or use_enemizer else LocalRom(args.rom)
|
||||||
|
|
||||||
patch_rom(world, rom, player, team, use_enemizer)
|
|
||||||
|
|
||||||
if use_enemizer and (args.enemizercli or not args.jsonout):
|
if use_enemizer and (args.enemizercli or not args.jsonout):
|
||||||
if args.rom and not(os.path.isfile(args.rom)):
|
if args.rom and not(os.path.isfile(args.rom)):
|
||||||
raise RuntimeError("Could not find valid base rom for enemizing at expected path %s." % args.rom)
|
raise RuntimeError("Could not find valid base rom for enemizing at expected path %s." % args.rom)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import re
|
|||||||
|
|
||||||
from DungeonRandomizer import parse_cli
|
from DungeonRandomizer import parse_cli
|
||||||
from Main import main as DRMain
|
from Main import main as DRMain
|
||||||
|
from source.classes.BabelFish import BabelFish
|
||||||
|
|
||||||
def parse_yaml(txt):
|
def parse_yaml(txt):
|
||||||
def strip(s):
|
def strip(s):
|
||||||
@@ -100,7 +101,7 @@ def main():
|
|||||||
loglevel = {'error': logging.ERROR, 'info': logging.INFO, 'warning': logging.WARNING, 'debug': logging.DEBUG}[erargs.loglevel]
|
loglevel = {'error': logging.ERROR, 'info': logging.INFO, 'warning': logging.WARNING, 'debug': logging.DEBUG}[erargs.loglevel]
|
||||||
logging.basicConfig(format='%(message)s', level=loglevel)
|
logging.basicConfig(format='%(message)s', level=loglevel)
|
||||||
|
|
||||||
DRMain(erargs, seed)
|
DRMain(erargs, seed, BabelFish())
|
||||||
|
|
||||||
def get_weights(path):
|
def get_weights(path):
|
||||||
try:
|
try:
|
||||||
@@ -150,6 +151,10 @@ def roll_settings(weights):
|
|||||||
ret.door_shuffle = door_shuffle if door_shuffle != 'none' else 'vanilla'
|
ret.door_shuffle = door_shuffle if door_shuffle != 'none' else 'vanilla'
|
||||||
ret.experimental = get_choice('experimental') == 'on'
|
ret.experimental = get_choice('experimental') == 'on'
|
||||||
|
|
||||||
|
ret.dungeon_counters = get_choice('dungeon_counters')
|
||||||
|
if ret.dungeon_counters == 'default':
|
||||||
|
ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle == 'on' else 'off'
|
||||||
|
|
||||||
goal = get_choice('goals')
|
goal = get_choice('goals')
|
||||||
ret.goal = {'ganon': 'ganon',
|
ret.goal = {'ganon': 'ganon',
|
||||||
'fast_ganon': 'crystals',
|
'fast_ganon': 'crystals',
|
||||||
|
|||||||
@@ -4,7 +4,12 @@ Mirror Scroll no longer erases blocks, the real mirror still will. (Sorry!)
|
|||||||
Standard+Crossed Dungeon now gives you a little magic, a few bombs, and a few arrows if you die or S&Q after meeting your uncle (also works with mirror/scroll)
|
Standard+Crossed Dungeon now gives you a little magic, a few bombs, and a few arrows if you die or S&Q after meeting your uncle (also works with mirror/scroll)
|
||||||
Dungeon reminder added to hud for Crossed dungeons
|
Dungeon reminder added to hud for Crossed dungeons
|
||||||
Blinking red square added to hud and it indicates a boss room is close by. Only appears if you have the compass. (Basic & Crossed)
|
Blinking red square added to hud and it indicates a boss room is close by. Only appears if you have the compass. (Basic & Crossed)
|
||||||
Key counters added to hud if you have found the map. (Crossed only)
|
|
||||||
|
## Map Features (Crossed only)
|
||||||
|
|
||||||
|
Key counters added to hud. Indicates number of keys in chests: found/total)
|
||||||
|
Big Key indicator added to hud. Indicates if BK is not in the dungeon, or if BnC guard has it
|
||||||
|
Total key indicator added to hud if you have found the map. Counts down from the total number of keys in dungeon to 0 as you collect them.
|
||||||
|
|
||||||
# Bug Fixes
|
# Bug Fixes
|
||||||
|
|
||||||
|
|||||||
5
Rom.py
5
Rom.py
@@ -22,7 +22,7 @@ from EntranceShuffle import door_addresses, exit_ids
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = 'a06d24c7d1473717e2610c3cf45809ff'
|
RANDOMIZERBASEHASH = '9106102ce69cf290fe2f4fce1e95a89b'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
@@ -600,11 +600,10 @@ def patch_rom(world, rom, player, team, enemized):
|
|||||||
offset = compass_data[name][4]//2
|
offset = compass_data[name][4]//2
|
||||||
rom.write_byte(0x13f01c+offset, layout.max_chests + layout.max_drops)
|
rom.write_byte(0x13f01c+offset, layout.max_chests + layout.max_drops)
|
||||||
rom.write_byte(0x13f02a+offset, layout.max_chests)
|
rom.write_byte(0x13f02a+offset, layout.max_chests)
|
||||||
rom.write_byte(0x13f038+offset, layout.max_drops)
|
|
||||||
builder = world.dungeon_layouts[player][name]
|
builder = world.dungeon_layouts[player][name]
|
||||||
bk_status = 1 if builder.bk_required else 0
|
bk_status = 1 if builder.bk_required else 0
|
||||||
bk_status = 2 if builder.bk_provided else bk_status
|
bk_status = 2 if builder.bk_provided else bk_status
|
||||||
rom.write_byte(0x13f046+offset, bk_status)
|
rom.write_byte(0x13f038+offset*2, bk_status)
|
||||||
rom.write_byte(0x151f1, 2)
|
rom.write_byte(0x151f1, 2)
|
||||||
rom.write_byte(0x15270, 2)
|
rom.write_byte(0x15270, 2)
|
||||||
rom.write_byte(0x1597b, 2)
|
rom.write_byte(0x1597b, 2)
|
||||||
|
|||||||
@@ -552,10 +552,8 @@ TotalKeys: ;27f01c
|
|||||||
db $04, $04, $02, $04, $04, $06, $06, $06, $05, $06, $01, $03, $06, $08
|
db $04, $04, $02, $04, $04, $06, $06, $06, $05, $06, $01, $03, $06, $08
|
||||||
ChestKeys: ;27f02a
|
ChestKeys: ;27f02a
|
||||||
db $01, $01, $00, $01, $02, $01, $06, $03, $03, $02, $01, $01, $04, $04
|
db $01, $01, $00, $01, $02, $01, $06, $03, $03, $02, $01, $01, $04, $04
|
||||||
OtherKeys: ;27f038
|
BigKeyStatus: ;27f038 (status 2 indicate BnC guard)
|
||||||
db $03, $03, $02, $03, $02, $05, $00, $03, $02, $04, $00, $02, $02, $04
|
dw $0002, $0002, $0001, $0001, $0000, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001
|
||||||
BigKeyStatus: ;27f046 (status 2 indicate BnC guard)
|
|
||||||
db $02, $02, $01, $01, $00, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
|
||||||
DungeonReminderTable: ;27f054
|
DungeonReminderTable: ;27f054
|
||||||
dw $2D50, $2D50, $2D51, $2D52, $2D54, $2D56, $2D55, $2D5A, $2D57, $2D59, $2D53, $2D58, $2D5B, $2D5C
|
dw $2D50, $2D50, $2D51, $2D52, $2D54, $2D56, $2D55, $2D5A, $2D57, $2D59, $2D53, $2D58, $2D5B, $2D5C
|
||||||
;27f070
|
;27f070
|
||||||
|
|||||||
@@ -96,6 +96,9 @@ org $098638 ; rando's hooks.asm line 2192
|
|||||||
jsl CountChestKeys
|
jsl CountChestKeys
|
||||||
org $06D192 ; rando's hooks.asm line 457
|
org $06D192 ; rando's hooks.asm line 457
|
||||||
jsl CountAbsorbedKeys
|
jsl CountAbsorbedKeys
|
||||||
|
; rando's hooks.asm line 1020
|
||||||
|
org $05FC7E ; <- 2FC7E - sprite_dash_item.asm : 118 (LDA $7EF36F : INC A : STA $7EF36F)
|
||||||
|
jsl CountBonkItem
|
||||||
|
|
||||||
; These two, if enabled together, have implications for vanilla BK doors in IP/Hera/Mire
|
; These two, if enabled together, have implications for vanilla BK doors in IP/Hera/Mire
|
||||||
; IPBJ is common enough to consider not doing this. Mire is not a concern for vanilla - maybe glitched modes
|
; IPBJ is common enough to consider not doing this. Mire is not a concern for vanilla - maybe glitched modes
|
||||||
|
|||||||
@@ -15,17 +15,29 @@ HudAdditions:
|
|||||||
lda $1a : and #$0010 : beq +
|
lda $1a : and #$0010 : beq +
|
||||||
lda #$345e : sta $7ec790 : bra .next
|
lda #$345e : sta $7ec790 : bra .next
|
||||||
+ lda #$207f : sta $7ec790
|
+ lda #$207f : sta $7ec790
|
||||||
.next lda DRMode : and #$0002 : beq .restore
|
.next lda DRMode : and #$0002 : bne + : plb : rts : +
|
||||||
lda DungeonReminderTable, x : sta $7ec702
|
lda DungeonReminderTable, x : sta $7ec702
|
||||||
lda $7ef368 : and.l $0098c0, x : beq .restore
|
lda $7ef368 : and.l $0098c0, x : beq .restore
|
||||||
txa : lsr : tax
|
lda #$2811 : sta $7ec740
|
||||||
lda $7ef4b0, x : jsr ConvertToDisplay : sta $7ec7a2
|
lda $7ef366 : and.l $0098c0, x : bne .check
|
||||||
lda #$2830 : sta $7ec7a4
|
lda BigKeyStatus, x : and #$00ff : bne + ;todo: "and" is redundant or change table to one byte
|
||||||
lda TotalKeys, x : jsr ConvertToDisplay : sta $7ec7a6
|
lda #$2574 : bra ++
|
||||||
|
+ cmp #$0002 : bne +
|
||||||
|
lda #$2420 : bra ++
|
||||||
|
+ lda #$207f : bra ++
|
||||||
|
.check lda #$2826
|
||||||
|
++ sta $7ec742
|
||||||
|
+ txa : lsr : tax
|
||||||
|
|
||||||
|
lda $7ef4e0, x : jsr ConvertToDisplay : sta $7ec7a2
|
||||||
|
lda #$2830 : sta $7ec7a4
|
||||||
|
lda ChestKeys, x : jsr ConvertToDisplay : sta $7ec7a6
|
||||||
|
|
||||||
|
lda #$2871 : sta $7ec780
|
||||||
|
lda TotalKeys, x
|
||||||
|
sep #$20 : !sub $7ef4b0, x : rep #$20
|
||||||
|
jsr ConvertToDisplay : sta $7ec782
|
||||||
|
|
||||||
lda $7ef4e0, x : jsr ConvertToDisplay : sta $7ec7e2
|
|
||||||
lda #$2830 : sta $7ec7e4
|
|
||||||
lda ChestKeys, x : jsr ConvertToDisplay : sta $7ec7e6
|
|
||||||
.restore
|
.restore
|
||||||
plb : rts
|
plb : rts
|
||||||
}
|
}
|
||||||
@@ -40,6 +52,10 @@ ConvertToDisplay:
|
|||||||
|
|
||||||
CountChestKeys:
|
CountChestKeys:
|
||||||
jsl ItemDowngradeFix
|
jsl ItemDowngradeFix
|
||||||
|
jsr CountChest
|
||||||
|
rtl
|
||||||
|
|
||||||
|
CountChest:
|
||||||
cpy #$24 : beq +
|
cpy #$24 : beq +
|
||||||
cpy #$a0 : !blt .end
|
cpy #$a0 : !blt .end
|
||||||
cpy #$ae : !bge .end
|
cpy #$ae : !bge .end
|
||||||
@@ -53,7 +69,7 @@ CountChestKeys:
|
|||||||
lda $7ef4b0, x : inc : sta $7ef4b0, x
|
lda $7ef4b0, x : inc : sta $7ef4b0, x
|
||||||
lda $7ef4e0, x : inc : sta $7ef4e0, x
|
lda $7ef4e0, x : inc : sta $7ef4e0, x
|
||||||
.restore plx : pla
|
.restore plx : pla
|
||||||
.end rtl
|
.end rts
|
||||||
|
|
||||||
CountAbsorbedKeys:
|
CountAbsorbedKeys:
|
||||||
jsl IncrementSmallKeysNoPrimary : phx
|
jsl IncrementSmallKeysNoPrimary : phx
|
||||||
@@ -61,3 +77,17 @@ CountAbsorbedKeys:
|
|||||||
lsr : tax
|
lsr : tax
|
||||||
lda $7ef4b0, x : inc : sta $7ef4b0, x
|
lda $7ef4b0, x : inc : sta $7ef4b0, x
|
||||||
+ plx : rtl
|
+ plx : rtl
|
||||||
|
|
||||||
|
CountBonkItem:
|
||||||
|
jsl GiveBonkItem
|
||||||
|
lda $a0 ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
|
||||||
|
cmp #115 : bne + ; Desert Bonk Key
|
||||||
|
lda.l BonkKey_Desert
|
||||||
|
bra ++
|
||||||
|
+ : cmp #140 : bne + ; GTower Bonk Key
|
||||||
|
lda.l BonkKey_GTower
|
||||||
|
bra ++
|
||||||
|
+ lda.b #$24 ; default to small key
|
||||||
|
++
|
||||||
|
phy : tay : jsr CountChest : ply
|
||||||
|
rtl
|
||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user