Fork of Archipelago Multi-Game Randomizer and Server that runs on https://ap.hollymcfarland.com
Go to file
Fabian Dill 38cbcc662f
WebUI (#100)
* Object-Oriented base changes for web-ui prep

* remove debug raise

* optimize broadcast to serialize once

* Implement WebUI socket, static assets, and classes

- Still need to wrap logging functions and send output to UI
- UI commands are successfully being sent to the server

* GUI operational. Wrap logging functions, implement server address selection on GUI, automatically launch web browser when client websocket is served

* Update MultiServer status when a user disconnects / reconnects

* Implement colored item and hint checks, improve GUI readability

* Fix improper formatting on received items

* Update SNES connection status on disconnect / reconnect. Implement itemFound, prevent accidentally printing JS objects

* Minor text change for itemFound

* Fixed a very wrong comment

* Fixed client commands not working, fixed un-helpful error messages appearing in GUI

* Fix a bug causing a failure to connect to a multiworld server if a previously existing cached address was present and the client was loaded without an address passed in

* Convert WebUI to React /w Redux. WebSocket communications not yet operational.

* WebUI fully converted to React / Redux.

- Websocket communication operational
- Added a button to connect to the multiserver which appears only when a SNES is connected and a server connection is not active

* Restore some features lost in WebUI

- Restore (found) notification on hints if the item has already been obtained
- Restore (x/y) indicator on received items, which indicates the number of items the client is waiting to receive from the client in a queue

* Fix a grammatical UI big causing player names to show only an apostrophe when possessive

* Add support for multiple SNES Devices, and switching between them

* freeze support for client

* make sure flask works when frozen

* UI Improvements

- Hint messages now actually show a found status via ✔ and  emoji
- Active player name is always a different color than other players (orange for now)
- Add a toggle to show only entries relevant to the active player
- Added a WidgetArea
- Added a notes widget

* Received items now marked as relevant

* Include production build for deployment

* Notes now survive a browser close. Minimum width applied to monitor to prevent CSS issues.

* include webUi folder in setup.py

* Bugfixes for Monitor

- Fix a bug causing the monitor window to grow beyond it's intended content limit
- Reduced monitor content limit to 200 items
- Ensured each monitor entry has a unique key

* Prevent eslint from yelling at me about stupid things

* Add button to collapse sidebar, press enter on empty server input to disconnect on purpose

* WebUI is now aware of client disconnect, message log limit increased to 350, fix !missing output

* Update WebUI to v2.2.1

- Added color to WebUI for entrance-span
- Make !missing show total count at bottom of list to match /missing behavior

* Fix a bug causing clients version <= 2.2.0 to crash when anyone asks for a hint

- Also fix a bug in the WebUI causing the entrance location to always show as "somewhere"

* Update WebUI color palette (this cost me $50)

* allow text console input alongside web-ui

* remove Flask
a bit overkill for what we're doing

* remove jinja2

* Update WebUI to work with new hosting mechanism

* with flask gone, we no longer need subprocess shenanigans

* If multiple web ui clients try to run, at least present a working console

* Update MultiClient and WebUI to handle multiple clients simultaneously.

- The port on which the websocket for the WebUI is hosted is not chosen randomly from 5000 - 5999. This port is passed to the browser so it knows which MultiClient to connect to

- Removed failure condition if a web server is already running, as there is no need to run more than one web server on a single system. If an exception is thrown while attempting to launch a web server, a check is made for the port being unavailable. If the port is unavailable, it probably means the user is launching a second MultiClient. A web browser is then opened with a connection to the correct webui_socket_port.

- Add a /web command to the MultiClient to repoen the appropriate browser window and get params in case a user accidentally closes the tab

* Use proper name for WebUI

* move webui into /data with other data files

* make web ui optional
This is mostly for laptop users wanting to preserve some battery, should not be needed outside of that.

* fix direct server start

* re-add connection timer

* fix indentation

Co-authored-by: Chris <chris@legendserver.info>
2020-06-03 21:29:43 +02:00
.github use pytest for github unittests 2020-04-29 18:44:03 +02:00
data WebUI (#100) 2020-06-03 21:29:43 +02:00
test Update dungeon tests to work with the new exploration algorithm 2020-05-10 19:54:40 +10:00
.gitignore ignore mystery_result_*.yaml 2020-04-29 23:56:51 -07:00
Adjuster.py store last used adjuster settings and use them for patching 2020-04-26 15:14:30 +02:00
AdjusterMain.py store last used adjuster settings and use them for patching 2020-04-26 15:14:30 +02:00
BaseClasses.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
Bosses.py rename has_blunt_weapon to has_melee_weapon 2020-04-20 19:17:10 +02:00
Dungeons.py Update Dungeons.py (#72) 2020-04-25 05:51:40 +02:00
ER_hint_reference.txt Replace keysanity with map/compass/key/bk shuffle 2019-12-13 22:37:52 +01:00
EntranceRandomizer.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
EntranceShuffle.py Remove crossworld connections from dungeonsfull (#97) 2020-05-25 16:01:43 +02:00
Fill.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
Gui.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
GuiUtils.py Fix json decoding 2018-01-01 12:13:39 -05:00
InvertedRegions.py Replace world exploration with a faster algorithm - use BFS and keep track of all entrances that are currently blocked by progression items 2020-05-10 19:27:13 +10:00
ItemList.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
Items.py fix comapss 2020-04-22 04:59:49 +02:00
LICENSE Following this howto in the hopes of doing it right. IANAL. 2020-01-28 22:54:19 +01:00
Main.py implement skip_playthrough in mystery 2020-05-31 00:28:03 +02:00
ModuleUpdate.py Run update/install once, as it installs/updates everything in one go 2020-03-22 02:34:24 +01:00
MultiClient.py WebUI (#100) 2020-06-03 21:29:43 +02:00
MultiMystery.py implement skip_playthrough in mystery 2020-05-31 00:28:03 +02:00
MultiServer.py WebUI (#100) 2020-06-03 21:29:43 +02:00
Mystery.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
NetUtils.py WebUI (#100) 2020-06-03 21:29:43 +02:00
Options.py Skeleton of new Options module 2020-03-18 16:15:32 +01:00
OverworldGlitchRules.py Make Pyramid Fairy offset mirror require access to Hyrule Castle Courtyard through the secret passage entrance (the normal route is not possible if you killed Agahnim). 2020-05-08 19:32:04 +10:00
Patch.py Patch.py multithreaded sfc->bmbp 2020-05-02 13:02:34 +02:00
Plando.py Disallow spaces in generated names 2020-04-18 21:46:57 +02:00
Plandomizer_Template.txt rename ocarina to flute. 2020-02-17 10:08:03 +01:00
README.md Update README.md 2020-04-21 21:14:07 +02:00
Regions.py Replace world exploration with a faster algorithm - use BFS and keep track of all entrances that are currently blocked by progression items 2020-05-10 19:27:13 +10:00
Rom.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
Rules.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
Text.py Keep goose/honk to just ganon/triforce 2020-04-29 22:39:22 -07:00
Utils.py fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
WebUiClient.py WebUI (#100) 2020-06-03 21:29:43 +02:00
WebUiServer.py WebUI (#100) 2020-06-03 21:29:43 +02:00
appveyor.yml Drop Python 3.7 auto builds 2020-05-30 02:07:29 +02:00
easy.yaml fix /snes <snes_interface> if interface contains spaces (which it shouldn't, but meh) 2020-06-03 02:19:16 +02:00
host.yaml implement skip_playthrough in mystery 2020-05-31 00:28:03 +02:00
icon.ico the setup experience 2020-04-07 04:18:26 +02:00
inno_setup.iss make qualified OS name match acronym for BMBP 2020-05-10 13:49:34 +02:00
meta.yaml update meta.yaml with new progression balancing 2020-05-19 02:57:34 +02:00
pytest.ini use pytest for github unittests 2020-04-29 18:44:03 +02:00
requirements.txt rip out port forwarding. Broken and as a result mostly unused. 2020-05-30 03:47:40 +02:00
setup.py WebUI (#100) 2020-06-03 21:29:43 +02:00

README.md

Berserker's Multiworld

This is a complete fork of Bonta's Multiworld V31. It is a drop-in replacement with everything from Bonta's Multiworld included. You can find a guide here: https://docs.google.com/document/d/1r7qs1-MK7YbFf2d-mEUeTy2wHykIf1ALG9pLtVvUbSw/edit# Or use the Wiki button at the top

Additions/Changes

Project

  • Available in precompiled form and guided setup for Windows 64Bit on Releases page.
  • Compatible with Python 3.7 and 3.8. Potentially future versions as well.
  • Update modules if they are too old, preventing a crash when trying to connect among potential other issues
  • Autoinstall missing modules
  • Allow newer versions of modules than specified, as they will usually not break compatibility
  • Support for V31 extendedmsu
  • Has support for binary patching to allow legal distribution of multiworld rom files
  • Various performance improvements (over 100% faster in most cases)
  • Various fixes
  • Overworld Glitches Logic
  • Newer Entrance Randomizer Logic, allowing more potential item and boss locations
  • completely redesigned command interface, with !help and /help

MultiMystery.py

  • Allows you to generate a Multiworld with individual player mystery weights. Since weights can also be set to 100%, this also allows for individual settings for each player in a regular multiworld. Basis is a .yaml file that sets these weights. You can find an easy.yaml in this project folder to get started.
  • Additional instructions are at the start of the file. Open with a text editor.
  • Configuration options in the host.yaml file.

MultiServer.py

  • Supports automatic port-forwarding, can be enabled in host.yaml
  • improved !players command, mentioning how many players are currently connected of how many expected and who's missing
  • /forfeit Playername now works when the player is not currently connected
  • Added /hint and !hint, configuration in host.yaml and description in help
  • various commands, like /send and /hint use "fuzzy text matching", no longer requiring you to enter a location, player name or item name perfectly

Mystery.py

  • Defaults to generating a non-race ROM (Bonta's only makes race ROMs at this time) If a race ROM is desired, pass --create-race as argument to it
  • When an error is generated due to a broken .yaml file, it now mentions in the error trace which file, line and character is the culprit
  • Option for progressive items, allowing you to turn them off (see easy.yaml for more info)
  • Rom-Option for extendedmsu (see easy.yaml for more info)
  • Option for "timer"
  • Option for "dungeon_counters", allowing you to configure the dungeon item counter
  • Option for "glitch_boots", allowing to run glitched modes without automatic boots
  • Supports new Meta-Mystery mode. Read meta.yaml for details.
  • Added dungeonssimple and dungeonsfull ER modes

MultiClient.py

  • Awaits a QUsb2Snes connection when started, latching on when available
  • completely redesigned command interface, with !help and /help
  • Running it with a patch file will patch out the multiworld rom and then automatically connect to the host that created the multiworld
  • Cheating is now controlled by the server and can be disabled through host.yaml
  • Automatically starts QUsb2Snes, if it isn't running
  • Better reconnect to both snes and server