archipelagomw / archipelago Goto Github PK
View Code? Open in Web Editor NEWArchipelago Multi-Game Randomizer and Server
Home Page: https://archipelago.gg
License: Other
Archipelago Multi-Game Randomizer and Server
Home Page: https://archipelago.gg
License: Other
When merging code for items_handling, /received
for TextClient got broken, because "can receive, but can't send" is not a thing anymore.
Actual implementation does not require a server update. I misremembered. no_location/tags and items_handling are completely separate.
-- original text below --
Proposed solution 1:
Proposed solution 2:
Proposed solution 3:
The file still denotes AP version 0.1.3. It is also missing the beetraps option for Minecraft.
I made a fork of the Super Metroid & A Link to the Past randomizer. It started out as a way to make a minor change but has grown into a separate, standalone randomizer, and now I'm curious to see how easily I could add Archipelago support to it.
The documentation for adding games mentions something about Python modules and stuff, but I already have a functioning randomizer. The README states “In all cases, presently, Archipelago is also the randomizer itself,” implying it's possible for this not to be the case.
Is this correct and, if so, what else would I need to do beyond implementing the network protocol?
After SNIClient connects to a SNES running a multiworld ROM, connecting to another one also running a multiworld ROM will not change the player name or game to reflect the new ROM. Try running two separate multiworld games on an FXPAK PRO and snes9x, connect to one, and then connect to another in the same SNIClient instance. It will report the name and game of the first SNES you connect to. SNIClient likely "locks in" the player name/game when it first connects to a valid multiworld ROM.
Running setup.py build
with setuptools >=61.0.0 ends in
error: Multiple top-level packages discovered in a flat-layout: ['SNI', 'data', 'worlds', 'WebHostLib', 'EnemizerCLI'].
To avoid accidental inclusion of unwanted files or directories,
setuptools will not proceed with this build.
If you are trying to create a single distribution with multiple packages
on purpose, you should not rely on automatic discovery.
Instead, consider the following options:
1. set up custom discovery (`find` directive with `include` or `exclude`)
2. use a `src-layout`
3. explicitly set `py_modules` or `packages` with a list of names
To find more information, look for "package discovery" on setuptools docs.
the breaking change has something to do with auto-discovery and is documented here: https://github.com/pypa/setuptools/blob/main/CHANGES.rst#breaking-changes
pip install setuptools=60.10.0
is the current work-around, but we should look into that.
Attempting to item link keys or songs if they are set to be in the OoT game's dungeons or song locations causes an error when it attempts to place these items and remove them from the item pool, as item link has already removed them.
Collecting the validation chest would skip the boss at the top of GT. This chest should be added to the boss block list
When u hint for a item in free hints with more of one of them or hints for all of them instead of asking if you want more like other hint costs.
Example I hinted for power bombs and instead of one it hinted like 15.
Continuing the discussion from #558, one of the challenges for people trying out Archipelago for the first time, especially if they don't have a more experienced friend to tell them this info directly, is matching the game lengths and item counts across the group, which is especially important for smaller groups (~2–5 players). It's no fun (well, less fun) to be the only one left playing your game for 2 or 3 hours after everyone else has finished, or to be BK'd for an hour waiting for the FF1 player to finally reach the volcano, or something like that. And it's also often less fun if the overwhelming majority of the items available in the pool are for a single game.
Some documentation to set expectations around these things would help new players to make informed decisions and avoid unpleasant early experiences in that regard. To clarify, this problem is twofold:
The challenge is, of course, that both of these are highly variable based on players' settings and, in the case of game length, skill. Also, some games' completion time is a lot more sensitive to the random seed than others, and the group composition has an effect, too. (As a general trend, I think Archipelago pulls game length towards the midpoint in the group as players who are progressing faster get BK'd more often and players who are progressing slower get more boosts from other players.) So there's no way the documentation can cover all cases and possibilities, but I don't think that's an excuse not to set some baseline expectations for people using recommended or default settings.
The Final Fantasy Randomizer Beginner's Guide sets a—in my experience, fairly accurate—guideline that your first run will probably take about 5 hours. This is great information to have because it lets you schedule your group accordingly. Obviously, it's better if you've completed a randomizer solo before you play in a group, so then you can estimate your time based on that, but you can't realistically expect everyone to do that. We can't expect everyone to read this documentation, either, but it's a lot faster for someone to tell their friend how long to expect than for everyone to actually test it.
Regarding item counts, my proposal is to add documentation to each game page clarifying:
This information will need to be kept up-to-date if changes to the defaults or player settings change these numbers, but I don't think that should be too complicated. And even if things get out of date, the exact numbers are less important than the ballpark amount—20, 100, 200, 500? It might be possible to collect this information automatically by generating games with min/max YAML settings and testing the result, though that could be challenging. But at the very least, the numbers the Multiworld Tracker displays for each game are a good start and it would be fine to put those somewhere that you don't have to generate a game to see.
As for game length, I don't know what we could do other than collect a bunch of data on game length. I suppose, for games hosted on archipelago.gg, it might be possible to programmatically measure the median time between a game starting and being completed, although I don't know how useful that metric will be if things are skewed by a lot of plays using a specific non-standard settings, plus the difference between sync & async sessions, etc. Personally I'm more for surveying a few people for their impressions of how long a game took when they were new at running it in Archipelago and how fast they are at it now.
YAML:
name: ItemLinkTest
game:
SMZ3: 1
SMZ3:
item_links:
[{name: "smz3 link", item_pool: ["Spazer"], replacement_item: "Nothing"}]
Error:
Traceback (most recent call last):
File "__startup__.py", line 113, in run
File "Console.py", line 15, in run
File "Generate.py", line 668, in <module>
File "Generate.py", line 214, in main
File "Main.py", line 227, in main
File "worlds\AutoWorld.py", line 62, in call_all
File "worlds\AutoWorld.py", line 55, in call_single
File "worlds\smz3\__init__.py", line 327, in pre_fill
File "BaseClasses.py", line 334, in get_all_state
File "worlds\smz3\__init__.py", line 300, in collect
KeyError: 2
Similar to the patch file's meta data including :0
as port earlier (until the server spun up), the archipelago://
link also have port 0. The issue with the link may be bigger though, because you have to reload the page to get the link updated.
What i would suggest as a solution is
archipelago://
links being removed from jinjaarchipelago://
links being set through javascript/connect
string being updated through javascriptworlds/**/.gitignore
, worlds/**/requirements.txt
) from binary distsetup.py
for Since it is possible to use weighted settings for what game is being played, and multiple games do not use some sort of data file to set up, it may therefore be possible for a player to put in a selection of games where there is currently no way of knowing what they're meant to be playing unless they look at the spoiler file. It would be useful if a proper list of who's playing what could be displayed, whether it's created through the command-line generator or on the website.
'Degasi Seabase - Jellyshroom Cave - Outside PDA' is listed as having a position of {'x': -83.2, 'y': -276.4, 'z': -345.5}
. I believe the X-coord got flipped though and should be +83.2
Attached screenshot shows what I believe to be that PDA at +83.2.
{x: -83.2, z: -345.5} seems to be outside the boundaries of Jellyshroom Cave.
In its current state, this also makes the check inaccessible since there's no way I can find to access those coordinates at that depth, potentially causing a broken seed if progression is placed there (thankfully the seed I was playing had junk there).
Installer asks for OoT ROM even if i have not selected OoT as Generator Option.
Can't progress the setup when clicking next.
I do have the OoT Client marked to be installed, and that triggers the mandatory ROM selection. I think that is an issue, otherwise there wouldn't be two options for OoT
type
yet, so version check is required.items_handling
in Connectversion
by a hashdatapackage_versions
by hashesdatapackage_version
from RoomInfo and version
from DataPackageplayers
from RoomInfogames
in RoomInfo to be a Set, including "Archipelago"exclusions
from GetDataPackageThere is no hard reason to PR or merge stages in order. Stages 1+2 could be implemented at the same time as 4+5 by testing against multiple branches.
games
in RoomInfo and missing players
insert more items here when we know
version
: 0.3.5) items_handling
in Connect for new clients (Connect version
: TBD)games
revamp in RoomInfo (depends on stage1 and 2 being completed)insert all games here
At the discretion of client lib devs, but should not happen before TBD.
Stage 1/2 can be tested against a server running #757
Tagging remote issue Ijwu/Enemizer#12 here preventing fixing this, the prefix BM (Berserker's Multiworld) has to stay until Enemizer accepts AP and we can verify the user has a version of Enemizer that allows for AP.
Referring to PR #340.
I checked with @Berserker66, admittedly after merging, and it seems that RetroArch cannot read from the ROM itself. Due to the name address being moved in the SNIClient RetroArch will receive commands to read from ROM and will not send back data.
The previous address was intentionally in the RAM because RetroArch can read from RAM.
Any ideas for solutions? Immediate action would be to revert the merged commit until further plan or action is in place, or to revert the SM_ROMNAME_START change but still write to the new location if desired.
Currently, when settings conflict with one another it must be resolved during generation, which can lead to confusion during gameplay as the seed did not generate as expected, or the conflict was resolved in an unexpected way.
This could be fixed/mitigated by guarding against conflicting options in the Webhost, and giving feedback on conflicting settings.
Example:
In Super Mario 64, there can be at max 120 Stars, but when 100 Coin Stars are disabled only 105.
The Option StarsToFinish
is the amount of stars to finish the game, and ExtraStars
are Stars added to the total.
Sum of both must be smaller or equal 120 if 100 Coin Stars is Enabled, and 105 if disabled.
Currently, during generation the amount of extra stars is truncated if set too high, and StarsToFinish
has a max value of 100 to not allow impossible seeds.
This solution forbids some valid combinations, such as 110 required and 10 Extra Stars, but more importantly shrinking the amount of extra stars is done during generation meaning the actual amount is unknown to the user until generation finishes.
Instead, are better solution would be implementing Constraints such as StarsToFinish + ExtraStars <= 120 - 15 * (100 Coin Stars Enabled)
.
The issue can be seen either by resetting to the menu and manually backing up your save from time to time, or simply by using rolling saves (automatic backup save feature, which is automatically enabled when you turn on the Door Color Rando option OR the Area Rando option).
E.g. in the below screenshot, the player received an E Tank from another world in between saves "Samus C" (an auto backup rolling save) and "Samus A". The player will never again have the Energy Tank that was received and saved to saveslot "Samus A", if that save is softlocked, or abandoned for any other reason.
Note: This bug affects "remote items" items as well, that is, having the Remote Items feature enabled, it affects items that you find and send to yourself and your co-op partners (if any). When the player collects an item for themself at step 1, the player loses access to it at step 4.
As suggested by black-sliver, the player needs to notice the missing item and ask for the multiworld owner to re-send it to them with a /send
server command in the webhost webpage console.
Deleting saveslots does not help. The only local workaround is to delete the SRAM entirely (e.g. P2_playername_abcdefg.srm
file corresponding to their ROM) and start over from the set of received items only.
This is a bug in the design going back to total's multiworld implementation in the SM ROM: The receive queue is global and not tied to a specific save slot.
(There is an existing mechanism allowing re-receiving of items when the player dies/resets and reloads their most recent save. Alongside the global queue is a global pointer into the queue, SRAM_MW_ITEMS_RECV_SPTR
, indicating which received item was last saved to any saveslot. Upon reload, the queue is reset to this value and reprocessed onward from there. Other than this mechanism, nothing in the queue is reprocessed.)
The result of the design is that, once the receiving of an item has been saved at a save station, older saves and blank saves can never receive it. SRAM_MW_ITEMS_RECV_SPTR
can only increase, never allowing re-processing of any part of the queue that has been received+saved to a different saveslot.
There is no quick fix, since the game's internal state has very little information about items received from other worlds that could be validated against. For example, the only effect outside of the message queue of having processed the receiving of an E Tank from another world, is that Samus's maximum health is 100 more than it would otherwise be. So we can't easily go through the queue and validate if every message was processed.
I think lordlou and I will be discussing the best design change to fix this. Might add in other save-related feature work too. Just wanted to have an issue on hand to track since we can't attempt a fix yet until we have a good design.
Sonic Adventure 2 Battle communicates to Archipelago via the APCpp Client.
in yaml file, set RandomCharmCosts to random/shuffle, can not start the game.
err msg in HK mod: An error occurred when attempting to connect...
err msg in server:
[websockets.server at 2022-07-23 15:42:33,627]: connection open
[root at 2022-07-23 15:42:34,260]: Notice (all): Paodan (Team #1) playing Hollow Knight has joined. Client(0.3.0), []).
[root at 2022-07-23 15:42:34,261]: Notice (Player Paodan in team 1): Now that you are connected, you can use !help to list commands to run via the server. If your client supports it, you may have additional local commands you can list with /help.
[root at 2022-07-23 15:42:37,325]: Notice (all): Paodan (Team #1) has left the game
[websockets.server at 2022-07-23 15:42:37,325]: connection closed
Currently the SNIClient houses a lot of specific memory addresses and handling logic for ALttP, SM, and SMZ3. DKC3 support was recently added, with its game-specific stuff living in a Client.py
file in the dkc3
world folder. I would like to port the other games to be handled in a similar way, in an effort to make the SNIClient as generic and extensible as possible.
(I can't assign myself to this issue, please feel free to assign to me at your convenience)
python SNIClient.py
(does not happen when running CommonClient.py)Expected: Client closes
Bug: Client hangs for as long as I was willing to wait (136 minutes). See screenshot:
Full console paste: https://pastebin.com/zasxGiLt
This happens 100% of the time so far. I've had some similar weird issues on another Linux platform but this seems to be the most straightforward way to get SNIClient into a weird state. (So I doubt this is a super recent regression.)
should probably be cleaned up.
Sample:
File "Archipelago/WebHostLib/tracker.py", line 999, in getTracker
player_small_key_locations[item_player].add(ids_small_key[item_id])
KeyError: 12
from https://archipelago.gg/room/8VKZgwHTRoC3Wj7KSM07bQ -> Tracker
Suspecting Player 12 to be an ItemLink Group with keys in it.
When trying to generate an OoT game with all items item-linked, if in-game hints are not turned off an error occurs while attempting to generate hints
This is mostly apparent when using one game with a lot of progression items, and a 2nd game with a lot of progression gates setting accessibility: minimal on the 2nd game. This was reproduce with the following combinations of games
Archipidle + Timespinner
Archipidle + Super Metroid
Archipidle + AlttP
As example i included two Yamls.zip tested on AP 3.4.0 using seed 55934839902109730105
Generation output:
T:\Git\Archipelago>Generate.py --seed 55934839902109730105
P1 Weights: Jarno_Pudle.yaml >> No description specified
P2 Weights: SMJarno.yaml >> Generated by https://archipelago.gg/
Generating for 2 players, 08473603582407276377 Seed 55934839902109730105 with plando: bosses
Archipelago (0.3.4) logging initialized.
Archipelago Version 0.3.4 - Seed: 55934839902109730105
Found World Types:
A Link to the Past : 144 Items (IDs: 2 - 180) | 287 Locations (IDs: 59758 - 4194341)
ChecksFinder : 3 Items (IDs: 80000 - 80002) | 25 Locations (IDs: 81000 - 81024)
Dark Souls III : 320 Items (IDs: 100000 - 100319) | 324 Locations (IDs: 100000 - 100323)
Donkey Kong Country 3 : 8 Items (IDs: 14430208 - 14430215) | 191 Locations (IDs: 14430208 - 14430398)
Factorio : 222 Items (IDs: 131070 - 131292) | 183 Locations (IDs: 131072 - 131254)
Final Fantasy : 192 Items (IDs: 256 - 498) | 255 Locations (IDs: 257 - 767)
Hollow Knight : 249 Items (IDs: 16777216 - 16777464) | 740 Locations (IDs: 16777216 - 16777955)
Meritous : 23 Items (IDs: 593000 - 593022) | 104 Locations (IDs: 593000 - 593103)
Minecraft : 46 Items (IDs: 45000 - 45100) | 114 Locations (IDs: 42000 - 42113)
Ocarina of Time : 148 Items (IDs: 66001 - 66202) | 663 Locations (IDs: 67010 - 67673)
Raft : 325 Items (IDs: 47001 - 47325) | 154 Locations (IDs: 48001 - 48155)
Rogue Legacy : 76 Items (IDs: 90000 - 90097) | 844 Locations (IDs: 91000 - 92259)
Risk of Rain 2 : 11 Items (IDs: 37001 - 37011) | 500 Locations (IDs: 37006 - 37505)
Sonic Adventure 2 Battle : 41 Items (IDs: 16711680 - 16711731) | 255 Locations (IDs: 16711680 - 16712451)
Starcraft 2 Wings of Liberty: 111 Items (IDs: 1000 - 1802) | 119 Locations (IDs: 1100 - 3805)
Super Metroid : 30 Items (IDs: 83000 - 83037) | 105 Locations (IDs: 82000 - 82260)
Super Mario 64 : 18 Items (IDs: 3626000 - 3626214) | 135 Locations (IDs: 3626000 - 3626214)
SMZ3 : 151 Items (IDs: 84000 - 84223) | 316 Locations (IDs: 85000 - 85510)
Secret of Evermore : 156 Items (IDs: 64000 - 64904) | 338 Locations (IDs: 64000 - 64385)
Slay the Spire : 4 Items (IDs: 8000 - 8003) | 31 Locations (IDs: 19001 - 22003)
Subnautica : 81 Items (IDs: 35000 - 35080) | 181 Locations (IDs: 33000 - 34049)
Timespinner : 181 Items (IDs: 1337000 - 1337249) | 212 Locations (IDs: 1337000 - 1337249)
VVVVVV : 20 Items (IDs: 2515000 - 2515019) | 20 Locations (IDs: 2515000 - 2515019)
The Witness : 185 Items (IDs: 158000 - 159987) | 585 Locations (IDs: 158000 - 158800)
Creating World.
Creating Items.
Calculating Access Rules.
Running Item Plando
Running Pre Main Fill.
Filling the world with 199 items.
Balancing multiworld progression for 2 Players.
Beginning output...
Could not access required locations for accessibility check. Missing: {IDLE for at least 50 minutes 0 seconds (JarnoPudle), IDLE for at least 26 minutes 30 seconds (JarnoPudle), IDLE for at least 29 minutes 0 seconds (JarnoPudle), IDLE for at least 45 minutes 30 seconds (JarnoPudle), IDLE for at least 35 minutes 0 seconds (JarnoPudle), Energy Tank, Waterway (SMJarno), IDLE for at least 28 minutes 30 seconds (JarnoPudle), Reserve Tank, Wrecked Ship (SMJarno), Missile (green Maridia shinespark) (SMJarno), IDLE for at least 45 minutes 0 seconds (JarnoPudle), IDLE for at least 32 minutes 30 seconds (JarnoPudle), IDLE for at least 34 minutes 0 seconds (JarnoPudle), IDLE for at least 38 minutes 0 seconds (JarnoPudle), IDLE for at least 36 minutes 30 seconds (JarnoPudle), IDLE for at least 35 minutes 30 seconds (JarnoPudle), Super Missile (pink Maridia) (SMJarno), IDLE for at least 48 minutes 0 seconds (JarnoPudle), IDLE for at least 32 minutes 0 seconds (JarnoPudle), IDLE for at least 44 minutes 30 seconds (JarnoPudle)}
Location Accessibility requirements not fulfilled.
Generating output files (2/2).
Calculating playthrough.
Uncaught exception
Traceback (most recent call last):
File "T:\Git\Archipelago\Generate.py", line 737, in
main()
File "T:\Git\Archipelago\Generate.py", line 270, in main
callback(erargs, seed)
File "T:\Git\Archipelago\Main.py", line 420, in main
create_playthrough(world)
File "T:\Git\Archipelago\Main.py", line 466, in create_playthrough
raise RuntimeError(f'Not all progression items reachable ({sphere_candidates}). '
RuntimeError: Not all progression items reachable ({IDLE for at least 50 minutes 0 seconds (JarnoPudle), IDLE for at least 29 minutes 0 seconds (JarnoPudle), IDLE for at least 45 minutes 30 seconds (JarnoPudle), Missile (green Maridia shinespark) (SMJarno), IDLE for at least 45 minutes 0 seconds (JarnoPudle), IDLE for at least 34 minutes 0 seconds (JarnoPudle), IDLE for at least 38 minutes 0 seconds (JarnoPudle), IDLE for at least 35 minutes 30 seconds (JarnoPudle), Super Missile (pink Maridia) (SMJarno), IDLE for at least 48 minutes 0 seconds (JarnoPudle), IDLE for at least 44 minutes 30 seconds (JarnoPudle), IDLE for at least 26 minutes 30 seconds (JarnoPudle), IDLE for at least 35 minutes 0 seconds (JarnoPudle), Energy Tank, Waterway (SMJarno), IDLE for at least 28 minutes 30 seconds (JarnoPudle), Reserve Tank, Wrecked Ship (SMJarno), IDLE for at least 32 minutes 30 seconds (JarnoPudle), IDLE for at least 36 minutes 30 seconds (JarnoPudle), IDLE for at least 32 minutes 0 seconds (JarnoPudle)}). Something went terribly wrong here.
Traceback (most recent call last):
File "T:\Git\Archipelago\Generate.py", line 737, in
main()
File "T:\Git\Archipelago\Generate.py", line 270, in main
callback(erargs, seed)
File "T:\Git\Archipelago\Main.py", line 420, in main
create_playthrough(world)
File "T:\Git\Archipelago\Main.py", line 466, in create_playthrough
raise RuntimeError(f'Not all progression items reachable ({sphere_candidates}). '
RuntimeError: Not all progression items reachable ({IDLE for at least 50 minutes 0 seconds (JarnoPudle), IDLE for at least 29 minutes 0 seconds (JarnoPudle), IDLE for at least 45 minutes 30 seconds (JarnoPudle), Missile (green Maridia shinespark) (SMJarno), IDLE for at least 45 minutes 0 seconds (JarnoPudle), IDLE for at least 34 minutes 0 seconds (JarnoPudle), IDLE for at least 38 minutes 0 seconds (JarnoPudle), IDLE for at least 35 minutes 30 seconds (JarnoPudle), Super Missile (pink Maridia) (SMJarno), IDLE for at least 48 minutes 0 seconds (JarnoPudle), IDLE for at least 44 minutes 30 seconds (JarnoPudle), IDLE for at least 26 minutes 30 seconds (JarnoPudle), IDLE for at least 35 minutes 0 seconds (JarnoPudle), Energy Tank, Waterway (SMJarno), IDLE for at least 28 minutes 30 seconds (JarnoPudle), Reserve Tank, Wrecked Ship (SMJarno), IDLE for at least 32 minutes 30 seconds (JarnoPudle), IDLE for at least 36 minutes 30 seconds (JarnoPudle), IDLE for at least 32 minutes 0 seconds (JarnoPudle)}). Something went terribly wrong here.
Press enter to close.
Currently we are looking at roughly 20MB per instance. With each world added this will rise. With rising popularity per world this may become exponential.
MultiServer.py loads all the worlds and keeps references. This happens in
from worlds.AutoWorld import AutoWorldRegister
proxy_worlds = {name: world(None, 0) for name, world in AutoWorldRegister.world_types.items()}
and can't be undone easily because each world will keep a reference to AutoWorld, which keeps a reference to all worlds.
MultiServer.py only needs a world reference for very few things currently, so it could instead work on the same DataPackage clients use with some extras, not loading any world.
Or it could load only the played worlds, which would still save the majority of the memory.
Currently the client protocol requires each MultiServer to hold data for all worlds, but that will be changed in #813 via #757
edit:
Points 1 and 2 are done for WebHost, point 3 should be complete in #877
Point 4 is new
Greetings all!
To begin, just wanted to give many thanks for the people that have contributed to AP. I have had loads of fun with it playing solo along with friends. During a recent play sessions with a few friends, we believe a potential bug was discovered as it relates to the FFR specific to AP. If this is not the correct medium to post about this, I will delete this message and migrate it to the appropriate location. Details of what we encountered below.
When an AP game is generated via https://archipelago.gg/generate and at least one file in the compressed file (.zip in this case) contains a FFR yaml that is configured with the preset NOverworld along with a second yaml for a different game, the item that would replace the Canoe (MARK) does not convey from a remote world to the FFR world. The FFR player will obtain the Canoe but not MARK. The result of this is reduced access to locations to their own and potential items for others locked by MARK.
FFR player obtains the MARK and SIGIL (and not Canoe or Floater as they are replaced respectively in NOverworld).
FFR player obtains the SIGIL but not the MARK (or Canoe)
As Archipelago continues to grow in size, the switch from percentage based hints becomes less effective because of games having significantly different play times so proposal for a new way of handling hints.
hint_cost
option to be used for any world so players can set their own custom price for a hintallow_hint_override
default onRather than accessing options with a dict through Autoworld.world.option_name[player]
the option classes can be moved to Autoworld.options.option_name
or Autoworld.options[option_name]
and the current Autoworld.options
should be migrated to Autoworld.option_definitions
.
Can potentially use a TypedDict to auto fill out Autoworld.options
to mimic Autoworld.option_definitions
and already be filled with default option values, then have the actual Options filled in during the generation parsing step and gain access to typing hints.
(Using latest main)
GENERATORS: 1
seed = get_seed(8)
python3 WebHost.py
Expected Result: Completable seed
Actual Result: Morph Ball cannot be reached and the seed cannot be completed. (Spoiler log)
Synthesizing info from lordlou, Espeon65536, and Berserker:
Upstream Varia rando software is implemented as a singleton. Thus the doorsDict
, which defines a per-player set of door types throughout the SM world, is a singleton class variable of DoorsManager class for the entire process, rather than being an instance variable of the class.
So, DoorsManager.doorsDict
class variable gets reused from the previous seed roll if the new seed roll has the same player
identifier integer as the previous roll; and both seeds must have been rolled in the same generator process (under default configs, this process reuse would happen only under WebHost, and only after at least 8 door color rando seeds have been rolled during the same run of the WebHost--thus the heisenbug).
First known report of this issue was on discord March 11th by divine. Thus the bug has been experienced since AP 0.2.5 or earlier. Once the main archipelago.gg server had been up for a while, players were estimating that somewhere in the range of 10-40% of multiworlds that include Super Metroid were rendered uncompletable by this bug.
Lots of questions asked consistently in the discord that are not currently addressed in the FAQ on the website.
On archipelago.gg, if you follow a link to a specific section on a page, the section header will appear at the very tippy-top of the browser window. However, the very tippy-top of the window is hidden behind the white header bar with all the common links on it, so the first few lines of the section (including the header) are invisible until the user scrolls up. This seems unintentional. Example: 'Joining a multiworld game' on the SC2 setup guide takes you too low to see all of the instructions.
This crash is in both 0.2.5 through the website and latest main branch.
(I forgot the website saves settings. It looks like it's not an issue in 0.2.5)
I narrowed this crash down to this setting.
If SM's minor_qty is anything but 100, it crashes.
You can use the website https://archipelago.gg/games/Super%20Metroid/player-settings
and lower "Minor Quantity" and then press "Generate Game" "Export Settings"
or use this yaml:
Super Metroid:
minor_qty: 22
game: Super Metroid
name: b
Traceback (most recent call last):
File "Generate.py", line 661, in <module>
main()
File "Generate.py", line 207, in main
callback(erargs, seed)
File "/home/user/code/Archipelago/Main.py", line 413, in main
multidata_task.result()
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 444, in result
return self.__get_result()
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 389, in __get_result
raise self._exception
File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/home/user/code/Archipelago/Main.py", line 364, in write_multidata
assert location.item.code is not None, "item code None should be event, " \
AssertionError: item code None should be event, location.address should then also be None
This post is based on the personal experience my cloud had when playing Archipelago seeds. For us as non - programmers it is quite impossible to come up with some kind of proof.
When progression balancing could either be turned on or off, in nearly all seeds we played, a moon pearl for ALttP players would kind of always appear in sphere 4 the latest.
When the progression balancing system changed, there were some discussions around it and one of our members asked about it in the discord and got the response that setting progression balancing to 50 would be equal to the old "on" setting.
Well it just isn't. In all the seeds we played we noticed shifts in hard progression items being placed waaaaay deepeer inside the multiworld than it used to.
The peak happened yesterday in a MW with ALttP and Timespinner where my mates moon pearl was placed in front of the emperors throne room which was literally the 9th last check before finishing the game and finishing my seed would have been quicker since I had go mode by then.
The moon pearl landed in sphere 11 out of 16:
https://archipelago.gg/dl_spoiler/-MUoOXddSROhiENePp1D-A
To us, this feels like the moon pearl has landed in the trash item pool and is used as a filling item when it is actually a hard access gate for this game and needs to be placed earlier.
Summary:
In our experience, BK mode probability for ALttP has raised drastically since the change of the Progression Balancing system even though we have been assured that setting it to 50 is the same as the old setting "on", which is just not the truth at all.
Kindly advise how we can get the good experience back without downgrading to a version that has the old progression balancing system. Thank you
Since it was the most stable game AP had ever to offer and it brilliantly helped flattening the BK curve according to our experience, please bring back ArchipIdle
Item-linked keys in LTTP causes this error to occur any time the multiworld tracker page is accessed, making the page unloadable
File "C:\src\Archipelago\WebHostLib\tracker.py", line 987, in getTracker player_small_key_locations[item_player].add(ids_small_key[item_id]) KeyError: 3
If a advancements can only be done with a specific structure give a entrance hint on what dimension it is in as a feature request more than a actual problem
JS will ignore the filename given in tutorials.json when requesting a tutorial's markdown and instead request a file based on the url (game/document/lang
will request game/document_lang.md
),
Multiple possible solutions:
Hello,
Just found out about this project and at the same time the previous project "Berserker's Multiworld". I want to use Archipelago since it's newer and more updated, but the settings page for A Link to the Past is much more cleaner and easier to understand on the Berserker page. E.g. it has an easy to understand "Goal" setting at first spot and also a "Sprite" list for Link which is commonly used - both are missing in Archipelago.
Per multiple reports from players of the ongoing community SM async game (which started 4 days ago on AP 0.2.5):
Steps:
Bug part 1: SM crashes on load before Samus is able to move.
Bug part 2: Players rolled back their Archipelago to 0.2.5 to work around Bug part 1, but the crash remained. Likely cause would be that attempting to play with 0.3.0 client puts something into SRAM that the 0.2.5 ROM doesn't understand, and SRAM persists past the rollback. Players must delete their save to continue the seed, losing all local progress.
Right now, Locations.py lists 'Grassy Plateaus West Wreck - Beam PDA' as 'need_laser_cutter': True
; however, it isn't needed. Enter the wreck and find your way to the ventilation shaft under the stairs. Follow it until it opens up into the room that contains the Data Terminal. From this big room, there's a second ventilation shaft connected that takes you to the room with the Beam PDA.
There seems to be some incorrect depencies, or its not handled very cleanly
C:\Users\Jarno\Desktop\AP>WebHost.py
[2022-05-07 10:21:49,148] [Errno 2] No such file or directory: 'C:\Users\Jarno\Desktop\AP\Zelda no Densetsu - Kamigami no Triforce (Japan).sfc'
Traceback (most recent call last):
File "C:\Users\Jarno\Desktop\AP\WebHost.py", line 60, in
update_sprites_lttp()
File "C:\Users\Jarno\Desktop\AP\WebHostLib\lttpsprites.py", line 36, in update_sprites_lttp
sprite = Sprite(os.path.join(input_dir, file))
File "C:\Users\Jarno\Desktop\AP\worlds\alttp\Rom.py", line 514, in init
self.get_vanilla_sprite_data()
File "C:\Users\Jarno\Desktop\AP\worlds\alttp\Rom.py", line 546, in get_vanilla_sprite_data
base_rom_bytes = bytes(read_rom(open(file_name, "rb")))
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\Jarno\Desktop\AP\Zelda no Densetsu - Kamigami no Triforce (Japan).sfc'
[2022-05-07 10:21:49,179] Could not update LttP sprites.
[2022-05-07 10:21:50,132] Serving on http://0.0.0.0:80
It should probably not throw an error there just mention maybe mention that the sprites could not updated as the file was not found
and link in wiki, since wiki can't be updated with PRs.
Depending on timeline, we may also want to
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.