Merged in DR v1.2.0.13
This commit is contained in:
@@ -1814,7 +1814,8 @@ def shuffle_door_types(door_type_pools, paths, world, player):
|
|||||||
for dungeon, doors in custom_dict.items():
|
for dungeon, doors in custom_dict.items():
|
||||||
all_custom[dungeon].extend(doors)
|
all_custom[dungeon].extend(doors)
|
||||||
|
|
||||||
world.paired_doors[player].clear()
|
for pd in world.paired_doors[player]:
|
||||||
|
pd.pair = False
|
||||||
used_doors = shuffle_trap_doors(door_type_pools, paths, start_regions_map, all_custom, world, player)
|
used_doors = shuffle_trap_doors(door_type_pools, paths, start_regions_map, all_custom, world, player)
|
||||||
# big keys
|
# big keys
|
||||||
used_doors = shuffle_big_key_doors(door_type_pools, used_doors, start_regions_map, all_custom, world, player)
|
used_doors = shuffle_big_key_doors(door_type_pools, used_doors, start_regions_map, all_custom, world, player)
|
||||||
|
|||||||
@@ -2740,7 +2740,7 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d),
|
|||||||
'Lost Woods Gamble': (0x240, 0x080),
|
'Lost Woods Gamble': (0x240, 0x080),
|
||||||
'Fortune Teller (Light)': (0x2c0, 0x4c0),
|
'Fortune Teller (Light)': (0x2c0, 0x4c0),
|
||||||
'Snitch Lady (East)': (0x310, 0x7a0),
|
'Snitch Lady (East)': (0x310, 0x7a0),
|
||||||
'Snitch Lady (West)': (0x800, 0x7a0),
|
'Snitch Lady (West)': (0x080, 0x7a0),
|
||||||
'Bush Covered House': (0x2e0, 0x880),
|
'Bush Covered House': (0x2e0, 0x880),
|
||||||
'Tavern (Front)': (0x270, 0x980),
|
'Tavern (Front)': (0x270, 0x980),
|
||||||
'Light World Bomb Hut': (0x070, 0x980),
|
'Light World Bomb Hut': (0x070, 0x980),
|
||||||
|
|||||||
3
Fill.py
3
Fill.py
@@ -670,7 +670,8 @@ def sell_potions(world, player):
|
|||||||
for potion in ['Green Potion', 'Blue Potion', 'Red Potion']:
|
for potion in ['Green Potion', 'Blue Potion', 'Red Potion']:
|
||||||
location = random.choice(filter_locations(ItemFactory(potion, player), locations, world, potion=True))
|
location = random.choice(filter_locations(ItemFactory(potion, player), locations, world, potion=True))
|
||||||
locations.remove(location)
|
locations.remove(location)
|
||||||
p_item = next(item for item in world.itempool if item.name == potion and item.player == player)
|
p_item = next((item for item in world.itempool if item.name == potion and item.player == player), None)
|
||||||
|
if p_item:
|
||||||
world.push_item(location, p_item, collect=False)
|
world.push_item(location, p_item, collect=False)
|
||||||
world.itempool.remove(p_item)
|
world.itempool.remove(p_item)
|
||||||
|
|
||||||
|
|||||||
7
Main.py
7
Main.py
@@ -36,7 +36,9 @@ from source.overworld.EntranceShuffle2 import link_entrances_new
|
|||||||
from source.tools.BPS import create_bps_from_data
|
from source.tools.BPS import create_bps_from_data
|
||||||
from source.classes.CustomSettings import CustomSettings
|
from source.classes.CustomSettings import CustomSettings
|
||||||
|
|
||||||
__version__ = '1.2.0.12u'
|
version_number = '1.2.0.13'
|
||||||
|
version_branch = '-u'
|
||||||
|
__version__ = f'{version_number}{version_branch}'
|
||||||
|
|
||||||
from source.classes.BabelFish import BabelFish
|
from source.classes.BabelFish import BabelFish
|
||||||
|
|
||||||
@@ -265,6 +267,7 @@ def main(args, seed=None, fish=None):
|
|||||||
set_rules(world, player)
|
set_rules(world, player)
|
||||||
|
|
||||||
district_item_pool_config(world)
|
district_item_pool_config(world)
|
||||||
|
fill_specific_items(world)
|
||||||
for player in range(1, world.players + 1):
|
for player in range(1, world.players + 1):
|
||||||
if world.shopsanity[player]:
|
if world.shopsanity[player]:
|
||||||
sell_potions(world, player)
|
sell_potions(world, player)
|
||||||
@@ -277,8 +280,6 @@ def main(args, seed=None, fish=None):
|
|||||||
if args.print_custom_yaml:
|
if args.print_custom_yaml:
|
||||||
world.settings.record_item_pool(world)
|
world.settings.record_item_pool(world)
|
||||||
dungeon_tracking(world)
|
dungeon_tracking(world)
|
||||||
fill_specific_items(world)
|
|
||||||
|
|
||||||
logger.info(world.fish.translate("cli", "cli", "placing.dungeon.prizes"))
|
logger.info(world.fish.translate("cli", "cli", "placing.dungeon.prizes"))
|
||||||
|
|
||||||
fill_prizes(world)
|
fill_prizes(world)
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ class Context:
|
|||||||
self.lookup_name_to_id = {}
|
self.lookup_name_to_id = {}
|
||||||
self.lookup_id_to_name = {}
|
self.lookup_id_to_name = {}
|
||||||
|
|
||||||
|
self.disable_client_forfeit = False
|
||||||
|
|
||||||
|
|
||||||
async def send_msgs(websocket, msgs):
|
async def send_msgs(websocket, msgs):
|
||||||
if not websocket or not websocket.open or websocket.closed:
|
if not websocket or not websocket.open or websocket.closed:
|
||||||
return
|
return
|
||||||
@@ -281,6 +284,9 @@ async def process_client_cmd(ctx : Context, client : Client, cmd, args):
|
|||||||
if args.startswith('!players'):
|
if args.startswith('!players'):
|
||||||
notify_all(ctx, get_connected_players_string(ctx))
|
notify_all(ctx, get_connected_players_string(ctx))
|
||||||
if args.startswith('!forfeit'):
|
if args.startswith('!forfeit'):
|
||||||
|
if ctx.disable_client_forfeit:
|
||||||
|
notify_client(client, 'Client-initiated forfeits are disabled. Please ask the host of this game to forfeit on your behalf.')
|
||||||
|
else:
|
||||||
forfeit_player(ctx, client.team, client.slot)
|
forfeit_player(ctx, client.team, client.slot)
|
||||||
if args.startswith('!countdown'):
|
if args.startswith('!countdown'):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -108,6 +108,14 @@ These are now independent of retro mode and have three options: None, Random, an
|
|||||||
* Bonk Fairy (Dark)
|
* Bonk Fairy (Dark)
|
||||||
|
|
||||||
# Bug Fixes and Notes
|
# Bug Fixes and Notes
|
||||||
|
|
||||||
|
* 1.2.0.13u
|
||||||
|
* Allow green/blue potion refills to be customized
|
||||||
|
* OW Map showing dungeon entrance at Snitch Lady (West) fixed (instead of @ HC Courtyard)
|
||||||
|
* Standing item data is cleared on transition to overworld (enemy drops won't bleed to overworld sprites)
|
||||||
|
* Escape assist won't give you a free quiver in retro bow mode
|
||||||
|
* Fixed an issue where a door would be opened magically (due to original pairing)
|
||||||
|
* MultiServer can now disable forfeits if desired
|
||||||
* 1.2.0.12u
|
* 1.2.0.12u
|
||||||
* Fix for mirror portal in inverted
|
* Fix for mirror portal in inverted
|
||||||
* Yet another fix for blocked door in Standard ER
|
* Yet another fix for blocked door in Standard ER
|
||||||
|
|||||||
4
Rom.py
4
Rom.py
@@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = 'c27bdd316ea8312214643e0a4ea32c10'
|
RANDOMIZERBASEHASH = 'baa1135c06e1e38d4005ba3c7acb977b'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
@@ -1716,6 +1716,8 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
rom.name.extend([0] * (21 - len(rom.name)))
|
rom.name.extend([0] * (21 - len(rom.name)))
|
||||||
rom.write_bytes(0x7FC0, rom.name)
|
rom.write_bytes(0x7FC0, rom.name)
|
||||||
|
|
||||||
|
rom.write_bytes(0x138010, bytearray(__version__, 'utf8'))
|
||||||
|
|
||||||
# set player names
|
# set player names
|
||||||
for p in range(1, min(world.players, 255) + 1):
|
for p in range(1, min(world.players, 255) + 1):
|
||||||
rom.write_bytes(0x195FFC + ((p - 1) * 32), hud_format_text(world.player_names[p][team]))
|
rom.write_bytes(0x195FFC + ((p - 1) * 32), hud_format_text(world.player_names[p][team]))
|
||||||
|
|||||||
@@ -11,9 +11,11 @@ OWMode:
|
|||||||
dw 0
|
dw 0
|
||||||
OWFlags:
|
OWFlags:
|
||||||
dw 0
|
dw 0
|
||||||
org $aa8010
|
|
||||||
OWReserved:
|
OWReserved:
|
||||||
dw 0
|
dw 0
|
||||||
|
org $aa8010
|
||||||
|
OWVersionInfo:
|
||||||
|
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
|
||||||
|
|
||||||
;Hooks
|
;Hooks
|
||||||
org $02a929
|
org $02a929
|
||||||
@@ -40,10 +42,6 @@ JSL OWAdjustExitPosition
|
|||||||
org $02c1a9
|
org $02c1a9
|
||||||
JSL OWEndScrollTransition
|
JSL OWEndScrollTransition
|
||||||
|
|
||||||
; org $09AFFB
|
|
||||||
; jsl OWDestroyDuplicateSprites : nop #2 ; LDA.w $0C9A,X : CMP.w $040A
|
|
||||||
; db $B0 ; changing following opcode to BCS
|
|
||||||
|
|
||||||
org $04E881
|
org $04E881
|
||||||
Overworld_LoadSpecialOverworld_RoomId:
|
Overworld_LoadSpecialOverworld_RoomId:
|
||||||
org $04E8B4
|
org $04E8B4
|
||||||
@@ -244,25 +242,16 @@ OWWhirlpoolEnd:
|
|||||||
|
|
||||||
OWDestroyItemSprites:
|
OWDestroyItemSprites:
|
||||||
{
|
{
|
||||||
LDX.b #$0F
|
PHX : LDX.b #$0F
|
||||||
.nextSprite
|
.nextSprite
|
||||||
LDA.w $0E20,X
|
LDA.w $0E20,X
|
||||||
CPY.b #$D8 : BCC .continue
|
CMP.b #$D8 : BCC .continue
|
||||||
CPY.b #$EC : BCS .continue
|
CMP.b #$EC : BCS .continue
|
||||||
.killSprite ; need to kill sprites from D8 to EB on screen transition
|
.killSprite ; need to kill sprites from D8 to EB on screen transition
|
||||||
STZ.w $0DD0,X
|
STZ.w $0DD0,X
|
||||||
.continue
|
.continue
|
||||||
DEX : BPL .nextSprite
|
DEX : BPL .nextSprite
|
||||||
RTL
|
PLX : RTL
|
||||||
; LDA.w $0C9A,X : CMP.w $040A ; what we wrote over
|
|
||||||
; BNE .killSprite
|
|
||||||
; ; need to kill sprites from D8 to EB
|
|
||||||
; CPY.b #$D8 : BCC .keepSprite
|
|
||||||
; CPY.b #$EC : BCS .keepSprite
|
|
||||||
; .killSprite
|
|
||||||
; CLC : RTL
|
|
||||||
; .keepSprite
|
|
||||||
; SEC : RTL
|
|
||||||
}
|
}
|
||||||
OWMirrorSpriteOnMap:
|
OWMirrorSpriteOnMap:
|
||||||
{
|
{
|
||||||
@@ -674,10 +663,7 @@ OWBonkSpritePrep:
|
|||||||
org $aa9000
|
org $aa9000
|
||||||
OWDetectEdgeTransition:
|
OWDetectEdgeTransition:
|
||||||
{
|
{
|
||||||
PHY : PHX
|
|
||||||
JSL OWDestroyItemSprites
|
JSL OWDestroyItemSprites
|
||||||
PLX : PLY
|
|
||||||
|
|
||||||
STZ.w $06FC
|
STZ.w $06FC
|
||||||
LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla
|
LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla
|
||||||
JSR OWShuffle
|
JSR OWShuffle
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user