Giter Club home page Giter Club logo

archipelago's People

Contributors

agilbert1412 avatar alchav avatar alwaysintreble avatar amazingampharos avatar beauxq avatar berserker66 avatar black-sliver avatar bonta0 avatar caitsith2 avatar compiling avatar el-u avatar espeon65536 avatar exempt-medic avatar hatkirby avatar ijwu avatar jaredweakstrike avatar jarno458 avatar kevincathcart avatar legendarylinux avatar llcooldave avatar lordlou avatar n00byking avatar newsoupvi avatar pepperpow avatar porygone avatar scipiowright avatar silvris avatar thephar avatar zig-for avatar zunawe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

archipelago's Issues

Make MultiServer use less memory

TLDR

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.

Analysis

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.

Saving potential

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

Proposed solution A

  • Generate and cache DataPackage, include extra info, like Groups, which are not part of DataPackage but accessibel by the server.
  • Load DataPackage + extra info instead of world references
  • ✅ Change all lookups to use that data
  • Once old protocol compatibility is dropped, delete unused worlds from data (dicts).

edit:
Points 1 and 2 are done for WebHost, point 3 should be complete in #877
Point 4 is new

OoT item link hint bug

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

Subnautica: Laser cutter isn't needed for 'Grassy Plateaus West Wreck - Beam PDA'

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.

Output who's playing what

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.

setuptools 61.0.0 incompatibility

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.

Website: jumping to a section on a page hides the first couple lines

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.

Item linked LTTP keys breaks multiworld tracker

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

Migrate most Game-Specific data/logic out of SNIClient

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)

Enhancement: Feedback on Option Conflicts / Option Constraints

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).

Invalid player name/game in SNIClient under specific circumstances

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.

Installer 0.3.0 Hotfix 1 - OoT

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

Linux source SNIClient hangs forever if you close with X button

  1. Kubuntu 22.04 stable
  2. git clone <this repo> (I'm on commit bd4850b, current latest main)
  3. Create and activate virtualenv
  4. python SNIClient.py (does not happen when running CommonClient.py)
  5. Accept installation of missing depedencies shown on console
  6. Click the X at the top right of the client window to close it soon after it has started

Expected: Client closes
Bug: Client hangs for as long as I was willing to wait (136 minutes). See screenshot:

image

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.)

Hint system overhaul

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.

  • Return to hint_cost being strictly an int specifying how many points are needed per hint in host.yaml
  • generic hint_cost option to be used for any world so players can set their own custom price for a hint
  • Add a new option to host.yaml allow_hint_override default on
  • Add a new hint_cost attribute to Locations default value of 1 and allow worlds to override this so they can have different costs for their base locations or specific locations

Guidelines for run length & item distribution

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:

  • Length of a game.
  • Number of items.

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:

  • How many Archipelago-randomized items (that is, checks) the game has with the default settings
  • The minimum and maximum numbers of checks for the game, and which settings have the biggest impact on this where appropriate.

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.

Port Options system from MultiWorld to AutoWorld

Rather 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.

Progression Balancing issues

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

A Link to the Past Settings

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.

How can I integrate an existing randomizer?

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?

General intro-level documentation

  • A brief intro to some of the jargon would be helpful. It's not exactly intuitive what people mean when they say "checks" or "location checks" or "in logic" etc.
  • The hint system could be a little better documented. It would be even nicer if there was some automatic list of possible hints (e.g. https://archipelago.gg/datapackage ) either in the client or on the website.
  • It should be clearer what it means to forfeit—especially the automatic "forfeit" that happens in some games after your goal is completed. It's jarring, for example, when you die on Risk of Rain 2's "Commencement" and get a message saying you "forfeited" but actually you won, basically?
  • Games where you don't run a text client should explain how to access the text console or ask for hints

Bring back Archipidle

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

LttP RomName tag is still BM

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.

SM: Morph Ball is unreachable very often if server has been running a while

Steps to encounter the issue:

(Using latest main)

  1. Add this line to local config.yaml (create the file in the Archipelago repo root if it doesn't exist). I believe this reduces how many seeds you need to roll before the relevant process's doorsDict becomes corrupt (by a factor of 8, as the default is 8 generator processes).
    GENERATORS: 1
  2. Change the call to get_seed() in generator.py (WebHostLib) at line 107. This narrows the seed number to a known value for consistent local testing:
    seed = get_seed(8)
  3. Start the WebHost: python3 WebHost.py
  4. Roll a solo, door color rando Super Metroid seed in browser:
    a. Navigate to local Archipelago instance in browser
    b. Go to Super Metroid - Settings page
    c. Change Morph Placement from default Early to Normal
    d. Change Door Colors Rando from default No to Yes
    e. Everything else should be default. May get a different result if non-default settings have stuck around!
    f. Press Generate Game button
    f. View Spoiler log and confirm that it generated seed = 8 (all item locations - spoiler log)
  5. Roll a solo, non-door-color-rando SM seed in browser: [door color can also encounter this bug, but it's easier to see without it]
    a. Go back to the Super Metroid - Settings page
    b. Ensure Morph Placement is still Normal
    c. Change Door Colors Rando from Yes back to No
    d. Press Generate Game button

Expected Result: Completable seed
Actual Result: Morph Ball cannot be reached and the seed cannot be completed. (Spoiler log)

Likely cause

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.

Free hint give all hints

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.

Invalid port in archipelago:// link when opening a room

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

  • provide a way to poll a room's port
  • archipelago:// links being removed from jinja
  • archipelago:// links being set through javascript
  • /connect string being updated through javascript

Subnautica: X-coord sign flipped for 'Degasi Seabase - Jellyshroom Cave - Outside PDA'

'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.
image

{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).

SM: Items received between saves can never be re-received in older saves

Steps:

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).

  1. Receive an item from the network. It is added to Samus's inventory.
  2. Save the game.
  3. (Discover you are softlocked in a Door Color Rando or Area Rando situation, for example the way out may be a door type that you can't open yet. Or, you want to go back for some other reason.)
  4. Load an older save game from a different saveslot.
    Bug: The item that was received in step 1 can never be received in the older save.
    Expected: Re-receive the item from step 1 as soon as the older save is loaded.

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.

image

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.

Workaround

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.

Analysis

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.

Follow-up

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.

Generate crash in Super Metroid minor_qty

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

SM: 0.3.0 crashes old games on load and corrupts SRAM for downgrade

Per multiple reports from players of the ongoing community SM async game (which started 4 days ago on AP 0.2.5):

Steps:

  1. Play part of seed on Archipelago 0.2.5
  2. Upgrade to 0.3.0
  3. Attempt to continue the seed

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.

Doc: Move "Running from source" to source tree

and link in wiki, since wiki can't be updated with PRs.

Depending on timeline, we may also want to

  • update it
  • be more explicit about c compiler (i.e. test in a clean VM which download(s) and additional steps are required on windows)
  • merge in the mac-from-source documentation if we get mac builds soon
  • or link to the mac-from-source documentation if we do not
  • mention pycharm?

WebHost.py seems to have a dependency on the Zelda rom

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

RetroArch support for SM

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.

@lordlou @strotlog Opinions?

Webhost tutorial naming 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:

  1. look up game/document/lang in the json and request the correct url - this adds 1 fetch because json is not required currently
  2. when deploying the MDs to static/generated/*, rename them to match what js expects and remove filename from tutorials.json to avoid confusion
  3. have jinja fill in the filename into the DOM instead of game + document + lang - this moves the lookup to python
  4. completely get rid of tutorials.json, have the list be generated from jinja and fill in the .md link from python

Installer improvements post-0.2.0

  • better feedback on rom selection pages (this is gone now)
  • move rom selection to its own group (instead of having to uncheck in two places) (this is gone now)
  • exclude useless files (worlds/**/.gitignore, worlds/**/requirements.txt) from binary dist
  • clean up OoT's Compress/Uncompress in the binary dist or on source level
  • try and fix setup.py for Linux and Mac

FAQ needs actual FAQs

Lots of questions asked consistently in the discord that are not currently addressed in the FAQ on the website.

Implement planned 0.4.0 protocol changes

Protocol changes

  • Drop Print in favour of PrintJSON. At least multiclient.net can't handle arbitrary type yet, so version check is required.
  • Drop support for missing items_handling in Connect
  • Replace DataPackage per-game version by a hash
  • Replace RoomInfo datapackage_versions by hashes
  • Drop datapackage_version from RoomInfo and version from DataPackage
  • Drop players from RoomInfo
  • Change games in RoomInfo to be a Set, including "Archipelago"
  • Drop exclusions from GetDataPackage
  • Drop support for IgnoreGame tag

Implementation

There 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.

Stage 1: Verify client lib support of revamped games in RoomInfo and missing players

Stage 2: Update clients that require update from stage 1

insert more items here when we know

  • Timespinner
  • RL
  • RoR2
  • Subnautica
  • HK
  • Raft
  • CommonClient - 0.3.5

Stage 3: Implement new features, in the server

  • Use PrintJSON for Chat and Countdown - fall back to Print for old clients (Connect version: 0.3.5)
    #812
  • Require items_handling in Connect for new clients (Connect version: TBD)
  • Datapackage per-game checksum - in addition to version integer
    #684
  • games revamp in RoomInfo (depends on stage1 and 2 being completed)
    #757

Stage 4: Implement new features in client libs, send new version

Stage 5: Update clients to new libs

insert all games here

  • CommonClient (TextClient, SNIClient, Adventure, Factorio, FF1, KH2, LADX, OoT, Pokemon R/B, SC2, Wargroove, Z1, Zillion)
  • SoE - v0.3.9
  • Meritous
  • Witness
  • Dark Souls III

Stage 6: Drop backwards-compat in server

  • Drop fallback to Print
  • Drop version check from items_handling requirement
    #757
  • Drop DataPackage per-game version (replaced by hash)
  • Drop RoomInfo datapackage_versions (replaced by hashes)
  • Drop RoomInfo datapackage_version and DataPackage version (removed)
    #757
  • Drop GetDataPackage exclusions (replaced by games)
  • Drop support for IgnoreGame tag
  • Update minimum required client version in server

Stage 7: Drop backwards-compat in client

At the discretion of client lib devs, but should not happen before TBD.

Random Notes

Stage 1/2 can be tested against a server running #757

Item Link cannot be used with SMZ3

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

FFR AP participates do not receive MARK with FFR NOverworld preset settings

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.

Description

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.

Steps to Reproduce

  • Generate a rom and yaml file from https://4-4-0.finalfantasyrandomizer.com/ using the NOverworld present with AP enabled.
  • Create a yaml file for any game that is not FFR
  • Included both created yamls into a compressed file
  • Upload the file to https://archipelago.gg/generate with the !forfeit option enabled
  • Verify that the spoiler log has the Floater and Canoe in a/the non FFR world (this may take multiple generations)
  • Have both players load their world
  • Have the non FFR player use the !forfiet command

Expected Result

FFR player obtains the MARK and SIGIL (and not Canoe or Floater as they are replaced respectively in NOverworld).

Actual Result

FFR player obtains the SIGIL but not the MARK (or Canoe)

Additional Notes

  • This was initial discovered on a play session using FFR, SMZ3, ALttP and SM64
  • Was tested with FFR with SMZ3, FFR with SM64 and solo FFR and the result was reproduceable in all cases.
  • The FFR player has done practice sessions abstract of AP and could not reproduce this effect
  • For additional clarification, please feel free to reach out to Pandatron76#8419 on Discord and/or I can reply to messages on this thread.

OoT item link key/song bugs

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.

A problem in Hollow Night - RandomCharmCosts

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

Reimplement /received

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:

  • allow items_handling 0b011
  • have TextClient check server_version and send ConnectUpdate to 0b011
  • /received automagically works

Proposed solution 2:

  • as above, but send the ConnectUpdate when /received is being used the first time

Proposed solution 3:

  • implement server-side
  • make berserker unhappy
  • ?
  • profit

Accessibility: minimal sometimes runs out of locations to place items

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.