From 060092a53eeecbf59e3cf6f3d397f56e842f884e Mon Sep 17 00:00:00 2001 From: Thomas Prescott Date: Fri, 3 Mar 2023 21:55:02 -0600 Subject: [PATCH 1/8] add ability to disable forfeits --- MultiServer.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MultiServer.py b/MultiServer.py index 4108b8dd..cf9cd952 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -46,6 +46,9 @@ class Context: self.lookup_name_to_id = {} self.lookup_id_to_name = {} + self.disable_client_forfeit = False + + async def send_msgs(websocket, msgs): if not websocket or not websocket.open or websocket.closed: return @@ -281,6 +284,9 @@ async def process_client_cmd(ctx : Context, client : Client, cmd, args): if args.startswith('!players'): notify_all(ctx, get_connected_players_string(ctx)) if args.startswith('!forfeit'): + if ctx.disable_client_forfeit: + notify_client(client, 'Forfeit is currently disabled server-side.') + return forfeit_player(ctx, client.team, client.slot) if args.startswith('!countdown'): try: From 35e7784445dc2b67dd50a4393e10617b481094a9 Mon Sep 17 00:00:00 2001 From: Thomas Prescott Date: Mon, 6 Mar 2023 23:21:24 -0600 Subject: [PATCH 2/8] clarify forfeit disabled --- MultiServer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index cf9cd952..a9f9e9e2 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -285,9 +285,9 @@ async def process_client_cmd(ctx : Context, client : Client, cmd, args): notify_all(ctx, get_connected_players_string(ctx)) if args.startswith('!forfeit'): if ctx.disable_client_forfeit: - notify_client(client, 'Forfeit is currently disabled server-side.') - return - forfeit_player(ctx, client.team, client.slot) + 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) if args.startswith('!countdown'): try: timer = int(args.split()[1]) From 1bb4d5f03b7fa5a1dda2a9d1925abc9e27355078 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 9 Mar 2023 11:14:13 -0700 Subject: [PATCH 3/8] Version bump and note --- Main.py | 2 +- RELEASENOTES.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Main.py b/Main.py index 11138c65..7d3ae0eb 100644 --- a/Main.py +++ b/Main.py @@ -31,7 +31,7 @@ from Utils import output_path, parse_player_names from source.item.FillUtil import create_item_pool_config, massage_item_pool, district_item_pool_config from source.tools.BPS import create_bps_from_data -__version__ = '1.1.4-dev' +__version__ = '1.1.5-dev' from source.classes.BabelFish import BabelFish diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fd66faff..4c65204f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -181,6 +181,8 @@ Same as above but both small keys and bigs keys of the dungeon are not allowed o # Bug Fixes and Notes +* 1.1.5 + * MultiServer can not disable forfeits if desired * 1.1.4 * Removed a Triforce text * Fix for Desert Tiles 1 key door From b44caa76a7c7178e4696355c8706f2dd8c9f063d Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 13 Mar 2023 14:26:25 -0600 Subject: [PATCH 4/8] Customize certain potions refills. --- Fill.py | 7 ++++--- Main.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Fill.py b/Fill.py index 4859ebc3..9acf7d45 100644 --- a/Fill.py +++ b/Fill.py @@ -661,9 +661,10 @@ def sell_potions(world, player): for potion in ['Green Potion', 'Blue Potion', 'Red Potion']: location = random.choice(filter_locations(ItemFactory(potion, player), locations, world, potion=True)) locations.remove(location) - p_item = next(item for item in world.itempool if item.name == potion and item.player == player) - world.push_item(location, p_item, collect=False) - world.itempool.remove(p_item) + 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.itempool.remove(p_item) def sell_keys(world, player): diff --git a/Main.py b/Main.py index f731df8a..f6631ce5 100644 --- a/Main.py +++ b/Main.py @@ -250,6 +250,7 @@ def main(args, seed=None, fish=None): set_rules(world, player) district_item_pool_config(world) + fill_specific_items(world) for player in range(1, world.players + 1): if world.shopsanity[player]: sell_potions(world, player) @@ -262,7 +263,6 @@ def main(args, seed=None, fish=None): if args.print_custom_yaml: world.settings.record_item_pool(world) dungeon_tracking(world) - fill_specific_items(world) logger.info(world.fish.translate("cli", "cli", "placing.dungeon.prizes")) fill_prizes(world) From f4524d8a871c104b605da39590d30bdf5c6a7cef Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 13 Mar 2023 16:28:11 -0600 Subject: [PATCH 5/8] Fix Snitch Lady (West) location on map --- source/overworld/EntranceShuffle2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index 51a702dd..0aa18e92 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -3001,7 +3001,7 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d), 'Inverted Big Bomb Shop': (0x8b 'Lost Woods Gamble': (0x240, 0x080), 'Fortune Teller (Light)': (0x2c0, 0x4c0), 'Snitch Lady (East)': (0x310, 0x7a0), - 'Snitch Lady (West)': (0x800, 0x7a0), + 'Snitch Lady (West)': (0x080, 0x7a0), 'Bush Covered House': (0x2e0, 0x880), 'Tavern (Front)': (0x270, 0x980), 'Light World Bomb Hut': (0x070, 0x980), From 02c7a5279cde735a0a149199034d7bc4b107a841 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 13 Mar 2023 20:40:45 -0600 Subject: [PATCH 6/8] Fix some paired doors --- DoorShuffle.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index 6bafd806..6a954f3c 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -1813,7 +1813,8 @@ def shuffle_door_types(door_type_pools, paths, world, player): for dungeon, doors in custom_dict.items(): 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) # big keys used_doors = shuffle_big_key_doors(door_type_pools, used_doors, start_regions_map, all_custom, world, player) From b2b3d789cad2a9553cf3789cc507c97fe9e55414 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 13 Mar 2023 20:42:55 -0600 Subject: [PATCH 7/8] Some rom fixes: - standing item data now cleared on dungeon exit Escape assist won't fill arrows resulting in free quiver in retro bow mode --- Rom.py | 2 +- data/base2current.bps | Bin 93952 -> 93980 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index 0ca8e140..2fa2dee5 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '4faba57f154a2263bf91af041a0d8700' +RANDOMIZERBASEHASH = '15edc718abbbd94ee34e15ae24b219a3' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 5a239f15ad6edbb9e939796d1ecad384d3162259..aa3b0b2195ea6804734645a963163a4ac524d11b 100644 GIT binary patch delta 9289 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 From 636819ffc00c27e7befe0e9aa800ca02fc529606 Mon Sep 17 00:00:00 2001 From: aerinon Date: Tue, 14 Mar 2023 16:05:28 -0600 Subject: [PATCH 8/8] Versioning update --- Main.py | 4 +++- RELEASENOTES.md | 9 +++++++-- Rom.py | 4 +++- data/base2current.bps | Bin 93980 -> 93979 bytes 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Main.py b/Main.py index f6631ce5..69476418 100644 --- a/Main.py +++ b/Main.py @@ -34,7 +34,9 @@ from source.overworld.EntranceShuffle2 import link_entrances_new from source.tools.BPS import create_bps_from_data 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 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fbfdfe5c..e2c23a11 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -109,8 +109,13 @@ These are now independent of retro mode and have three options: None, Random, an # Bug Fixes and Notes -* Unreleased Version - * MultiServer can not disable forfeits if desired +* 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 * Fix for mirror portal in inverted * Yet another fix for blocked door in Standard ER diff --git a/Rom.py b/Rom.py index 2fa2dee5..49ab7804 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '15edc718abbbd94ee34e15ae24b219a3' +RANDOMIZERBASEHASH = '29863ca305a8474c452cd13b3f921898' class JsonRom(object): @@ -1608,6 +1608,8 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): rom.name.extend([0] * (21 - len(rom.name))) rom.write_bytes(0x7FC0, rom.name) + rom.write_bytes(0x138010, bytearray(__version__, 'utf8')) + # set player names 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])) diff --git a/data/base2current.bps b/data/base2current.bps index aa3b0b2195ea6804734645a963163a4ac524d11b..832779a30453f400fad4258196d067eb09eafe59 100644 GIT binary patch delta 2651 zcmW+#dstLu8b9xuE0+-lW`;o#4+m66@tPT8;b`r8EidbuspXW2u%o7}SLE`Y0|y-O zFqhBagBf*3;dmI793CvnG_>_bTf4JQ`m}3nn5B>5RiMTV+RTF7mVQHOUC@(X88E zw#qFJ+Pg(|d#jw^EVBRZ?%3t=4zd-Zyt2NP4U2LV99ic?_Ci3;Z}PMM2*`tjPy1Yx zF10hr%RX+92X_e~`{(AcofG@;4LAT}@EbHc^7ekY&?T}P-|YB%7km0znBD%FVa+GC z?e+$deG_-n&rEoIzbtjfwawcKzgv!60}Zm87uj4!prwIVww)~-i5d2X$s9#r#Q*0En6TvA6C9I(6GlW-a5XRB(JE2>np zDFw7nKGQbw(D(REGUsKT7^!{-`S_}8MU8}HkN&F279*Le^|NpNY6>i)2W11a{|8F;ep`_J3FKD<~$gYxba1OOVL!YLcIec-e22GXHda(;!!RyzKSn@L*Q0 zmz|p7t_09?SQ_21HZH||VWZJ5<0Uy#`HCS^4CrJl6JB>?80bxEZFi}8oa)iAMVzQIM) ziDJ*ylwLJWH}{C9GdAFR78EO~ZXBGo2y%Mv&Z-)rh|<-)8^P9-edVR1n!c@De`qTk za~|hU4t!x^zC+Ozi89S@RtyQT?h|B6G@J7M&}E(X(Yz`0(gC2VO;5feus52wnmkif6QI&ke8Bp}vy{n3@NGO-NO*4BOw6CRDgY{_2R*ZjKe$Pa(y#>uN1;RFCN*=m{FMyrPa5|S~XiOLd}#?+DND5?G1 zb5tDe_UY=#DGlV%nmY2S26ACJ`B4Lf8QlZZ&e6`U5_N3)!tX0^z3Y$r=`V9i$U-gT z4%<>EuQ4~$%~}T{Og5?1!aQSaQ@o8&ORNInIdvc3$LXoB?h>=&0FR*jz(%m zTQ5+|D6&8YMeqUZHjs+C-Q^9 zw6WS&j>bDMp1*-cu0Rz9taU=PT75%EPY|`$0_U$p`C6239&OiMR%f3sXMl`Z4EIQU`+OS@lLlhP<&r3 z>An-is-wQOG{UdHnuY}9b-947G{7X?%uz-ZO3Nlq24K=J;>}&Y7esIW5EV-Zm@9bv z1UYYj%H=CJ@5AM*1Ks@)*GT(pcIQbglF6>s0W$lPm+c7i&Y)&=Ah09h8_9W-QbpAv zDqbBdof7!l;nT@$tnV0<`x=PqZ7Kc3JoJ?-L3hwNj(CSblO`{(g{&iaDX_KVmM=^z z?3#%ChvL@2i%#D|g?<{Q)~h)CyiB5}&|!7_>U#8xYqPJf)Y8Z$xjV$UUdE0?en};S z>$HDb`tDh^4aE{9wEzlNkwH?2D(n4>%fpnA$0;x}dlm1%UmxG`&b1bgq*4gyU}TTP zFx?)Tonn3@Po+ZcGwG$i+ns0Q7i~jSheRqQ|69~F}wwv=FQF8MeWSZxKHfrM@3zM?~vSdB0S z?)A&|lu7osnhu~8W{@Ea68_#;J^tI<hi4IqAyVDhPkkWJ* zr<%%Og41C#txF&m(_y?Z(BeKy7Hvl7+b>t2og8NZ1Wd3bAvI08wK$N~WR(eKq%R{l zm6vo>Otokki5T-wW)CCBOfZW1&@WqS?)c@7K1W<`ea>>_O5}c?BHPv$#*gR~(%m+} zX!9_e2?d|8Jun?tt+Sxe zJTf~2md%Mtt3qukUMc8 z@F=R1C}#w~S#GBmT?}+uod>v;&Ffg<2o+m=@=;ul=a2#4^5y%3Rb(Ioo-w~s$4)=g z?A&=Gl(tEBB~ymriX9ioG%HM0&0Og1U2lb-bSX7^YA<|6 TJ0cGrF3@Xc=0Chs#n${E3=cYS delta 2633 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