* Move to new options system.
switch to using self.random
reformat rules file.
* further reformats
* fix tests to use new options system.
* fix slot data to not use self.multiworld
* I hate python
* new starting_items docstring to prepare for 1.20.5+ item components.
fix invalid json being output to starting_items
* more typing fixes.
* stupid quotes around type declarations
* removed unused variable in ItemPool.py
change null check in Structures.py
* update rules "self" variable to a "world: MinecraftWorld" variable
* get key, and not value for required bosses.
* Docs: `NetworkItem.player`
In many contexts, it's difficult to tell whether this is the sending player or the receiving player.
* correct player info
* Update NetUtils.py
Co-authored-by: Aaron Wagener <mmmcheese158@gmail.com>
---------
Co-authored-by: Aaron Wagener <mmmcheese158@gmail.com>
* Tunnels Theater Flowers fix + Flowers&PP2 Unit Tests
* copypaste
* Can just do it like this
* This is even better probably
* Also do some cleanup :3
* God damnit
`MultiWorld.can_beat_game()` with no arguments would initially check if
`self.state` is beatable, but then would create an empty state,
`state = CollectionState(self)`, to sweep spheres from to determine if
the game is beatable. The issue was that `self.state` and the new empty
state could be different.
Currently, it seems that everywhere in Archipelago's codebase that calls
`MultiWorld.can_beat_game()` with no arguments or `starting_state=None`
has a `self.state` that only contains precollected items, so the new
empty state happens to result in an equivalent state, but this should
not be relied upon to always be the case.
This patch changes `can_beat_game()` to initially check if the new empty
state is beatable instead of `self.state`.
This appears to be a bug introduced way back in 27b6dd8bd7Fixes#3742
* Updates filler item names to match the actual item names
* Adds more descriptive error message in case this error comes back
* Properly raises exception instead of just text
* Replaces exception with assert
* TLOZ: Fix non-deterministic item pool generation
The way the item pool was constructed involved iterating unions of sets.
Sets are unordered, so the order of iteration of these combined sets
would be non-deterministic, resulting in the items in the item pool
being generated in a different order with the same seed.
Rather than creating unions of sets at all, the original code has been
replaced with using Counter objects. As a dict subclass, Counter
maintains insertion order, and its update() method makes it simple to
combine the separate item dictionaries into a single dictionary with the
total count of each item across each of the separate item dictionaries.
Fixes#3664 - After investigating more deeply, the only differences I
could find between generations of the same seed was the order of items
created by TLOZ, so this patch appears to fix the non-deterministic
generation issue. I did manage to reproduce the non-deterministic
behaviour with just TLOZ in the end, but it was very rare. I'm not
entirely sure why generating with SMZ3 specifically would cause the
non-deterministic behaviour in TLOZ to be frequently present, whereas
generating with other games or multiple TLOZ yamls would not.
* Change import order
---------
Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
* Core: dump all item placements for generation failures
* pass the multiworld from remaining fill
* change how the args get handled to fix formatting
---------
Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
* makes start inventory from pool warn and fixes the itempool to match when it can not find a matching item to remove
* calc the difference correctly
* save new filler and non-removed items differently so we don't remove existing items at random
Fixes randomly placed ingredients not being deterministic (depending on settings)
and in turn also fixes logic not being deterministic if they get replaced by fragments.
All the types being copied are built-in types with their own `copy()`
methods, so using the `copy` module was a bit overkill and also slower.
This patch replaces the use of the `copy` module in
`CollectionState.copy()` with using the built-in `.copy()` methods.
The copying of `reachable_regions` and `blocked_connections` was also
iterating the keys of each dictionary and then looking up the value in
the dictionary for that key. It is faster, and I think more readable, to
iterate the dictionary's `.items()` instead.
For me, when generating a multiworld including the template yaml of
every world with `python -O .\Generate.py --skip_output`, this patch
saves about 2.1s. The overall generation duration for these yamls varies
quite a lot, but averages around 160s for me, so on average this patch
reduced overall generation duration (excluding output duration) by
around 1.3%.
Timing comparisons were made by calling time.perf_counter() at the start
and end of `CollectionState.copy()`'s body, and summing the differences
between the starts and ends of the method body into a global variable
that was printed at the end of generation.
Additional timing comparisons were made, using the `timeit` module, of
the individual function calls or dictionary comprehensions used to
perform the copying.
The main performance cost was `copy.deepcopy()`, which gets slow as the
number of keys multiplied by the number of values within the
sets/Counters gets large, e.g., to deepcopy a `dict[int, Counter[str]]`
with 100 keys and where each Counter contains 100 keys was 30x slower
than most other tested copying methods. Increasing the number of dict
keys or Counter keys only makes it slower.
* Core: Check parent_region.can_reach first in Location.can_reach
The comment about self.access_rule computing faster on average appears
to no longer be correct with the current caching system for region
accessibility, resulting in self.parent_region.can_reach computing
faster on average.
Generation of template yamls for each game that does not require a rom
to generate, generated with `python -O .\Generate.py --seed 1`
(all durations averaged over at 4 or 5 generations):
Full generation with `spoiler: 1` and no progression balancing:
89.9s -> 72.6s
Only output from above case:
2.6s -> 2.2s
Full generation with `spoiler: 3` and no progression balancing:
769.9s -> 627.1s
Only playthrough calculation + paths from above case:
680.5s -> 555.3s
Full generation with `spoiler: 1` with default progression balancing:
123.5s -> 98.3s
Only progression balancing from above case:
11.3s -> 9.6s
* Update BaseClasses.py
* Update BaseClasses.py
* Update BaseClasses.py
---------
Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
* Update worlds/dark_souls_3/Locations.py
Co-authored-by: Scipio Wright <scipiowright@gmail.com>
* Fix Covetous Silver Serpent Ring location
* Update location groups
This should cover pretty much all of the seriously hidden items. It
also splits out miniboss drops, mimic drops, and hostile NPC drops.
* Remove the "Guarded by Keys" group
On reflection, I don't think this is actually that useful. It'll also
get a lot muddier once we can randomize shops and ashes become
pseudo-"keys".
* Restore Knight Slayer's Ring classification
* Support infusions/upgrades in the new DS3 mod system
* Support random starting loadouts
* Make an item's NPC status orthogonal to its category
* Track location groups with flags
* Track Archipelago/Offline mismatches on the server
Also fix a few incorrect item names.
* Add additional locations that are now randomizable
* Don't put soul and multiple items in shops
* Add an option to enable whether NG+ items/locations are included
* Clean up useful item categorization
There are so many weapons in the game now, it doesn't make sense to
treat them all as useful
* Add more variety to filler items
* Iron out a few bugs and incompatibilities
* Fix more silly bugs
* Get tests passing
* Update options to cover new item types
Also recategorize some items.
* Verify the default values of `Option`s.
Since `Option.verify()` can handle normalization of option names, this allows options to define defaults which rely on that normalization. For example, it allows a world to exclude certain locations by default.
This also makes it easier to catch errors if a world author accidentally sets an invalid default.
* Make a few more improvements and fixes
* Randomize Path of the Dragon
* Mark items that unlock checks as useful
These items all unlock missable checks, but they're still good to ahve in the game for variety's sake.
* Guarantee more NPC quests are completable
* Fix a syntax error
* Fix rule definition
* Support enemy randomization
* Support online Yhorm randomization
* Remove a completed TODO
* Fix tests
* Fix force_unique
* Add an option to smooth out upgrade item progression
* Add helpers for setting location/entrance rules
* Support smoother soul item progression
* Fill extra smoothing items into conditional locations as well as other worlds
* Add health item smoothing
* Handle infusions at item generation time
* Handle item upgrades at genreation time
* Fix Grave Warden's Ashes
* Don't overwrite old rules
* Randomize items based on spheres instead of DS3 locations
* Add a smoothing option for weapon upgrades
* Add rules for crow trades
* Small fixes
* Fix a few more bugs
* Fix more bugs
* Try to prevent Path of the Dragon from going somewhere it doesn't work
* Add the ability to provide enemy presets
* Various fixes and features
* Bug fixes
* Better Coiled Sword placement
* Structure DarkSouls3Location more like DarkSouls3Item
* Add events to make DS3's spheres more even
* Restructure locations to work like items do now
* Add rules for more missable locations
* Don't add two Storm Rulers
* Place Hawk Ring in Farron Keep
* Mark the Grass Crest Shield as useful
* Mark new progression items
* Fix a bug
* Support newer better Path of the Dragon code
* Don't lock the player out of Coiled Sword
* Don't create events for missable locations
* Don't throw strings
* Don't smooth event items
* Properly categorize Butcher Knife
* Be more careful about placing Yhorm in low-randomization scenarios
* Don't try to smooth DLC items with DLC disabled
* Fix another Yhorm bug
* Fix upgrade/infusion logic
* Remove the PoolType option
This distinction is no longer meaningful now that every location in
the game of each type is randomized
* Categorize HWL: Red Eye Orb as an NPC location
* Don't place Storm Ruler on CA: Coiled Sword
* Define flatten() locally to make this APWorld capable
* Fix some more Leonhard weirdness
* Fix unique item randomization
* Don't double Twin Dragon Greatshield
* Remove debugging print
* Don't add double Storm Ruler
Also remove now-redundant item sorting by category in create_items.
* Don't add double Storm Ruler
Also remove now-redundant item sorting by category in create_items.
* Add a missing dlc_enabled check
* Use nicer options syntax
* Bump data_version
* Mention where Yhorm is in which world
* Better handle excluded events
* Add a newline to Yhorm location
* Better way of handling excluded unradomized progression locations
* Fix a squidge of nondeterminism
* Only smooth items from this world
* Don't smooth progression weapons
* Remove a location that doesn't actually exist in-game
* Classify Power Within as useful
* Clarify location names
* Fix location requirements
* Clean up randomization options
* Properly name Coiled Sword location
* Add an option for configuring how missable items are handled
* Fix some bugs from location name updates
* Fix location guide link
* Fix a couple locations that were busted offline
* Update detailed location descriptions
* Fix some bugs when generating for a multiworld
* Inject Large Leather Shield
* Fix a few location issues
* Don't allow progression_skip_balancing for unnecessary locs
* Update some location info
* Don't uniquify the wrong items
* Fix some more location issues
* More location fixes
* Use hyphens instead of parens for location descriptions
* Update and fix more locations
* Fix Soul of Cinder boss name
* Fix some logic issues
* Add item groups and document item/location groups
* Fix the display name for "Impatient Mimics"
* Properly handle Transposing Kiln and Pyromancer's Flame
* Testing
* Some fixes to NPC quests, late basin, and transposing kiln
* Improve a couple location names
* Split out and improve missable NPC item logic
* Don't allow crow trades to have foreign items
* Fix a variable capture bug
* Make sure early items are accessible early even with early Castle
* Mark ID giant slave drops as missable
* Make sure late basin means that early items aren't behind it
* Make is_location_available explicitly private
* Add an _add_item_rule utility that checks availability
* Clear excluded items if excluded_locations == "unnecessary"
* Don't allow upgrades/infusions in crow trades
* Fix the documentation for deprecated options
* Create events for all excluded locations
This allows `can_reach` logic to work even if the locations are
randomized.
* Fix up Patches' and Siegward's logic based on some manual testing
* Factor out more sub-methods for setting location rules
* Oops, left these in
* Fixing name
* Left that in too
* Changing to NamedRange to support special_range_names
* Alphabetizing
* Don't call _is_location_available on foreign locations
* Add missing Leonhard items
* Changing late basin to have a post-small-doll option
* Update basin option, add logic for some of Leonhard Hawkwood and Orbeck
* Simplifying an option, fixing a copy-paste error
* Removing trailing whitespace
* Changing lost items to go into start inventory
* Revert Basin changes
* Oops
* Update Options.py
* Reverting small doll changes
* Farron Keep boss requirement logic
* Add Scroll for late_dlc
* Fixing excluded unnecessary locations
* Adding Priestess Ring as being after UG boss
* Removing missable from Corvian Titanite Slab
* Adding KFF Yhorm boss locks
* Screams about Creighton
* Elite Knight Set isn't permanently missable
* Adding Kiln requirement to KFF
* fixing valid_keys and item groups
* Fixing an option-checker
* Throwing unplaceable Storm Ruler into start inventory
* Update locations
* Refactor item injection
* Update setup doc
* Small fixes
* Fix another location name
* Fix injection calculation
* Inject guaranteed items along with progression items
* Mark boss souls as required for access to regions
This allows us to set quest requirements for boss souls and have them
automatically propagated to regions, means we need less machinery for
Yhorm bosses, and allows us to get rid of a few region-transition
events.
* Make sure Sirris's quest can be completed before Pontiff
* Removing unused list
* Changing dict to list
* Removing unused test
* Update __init__.py
* self.multiworld.random -> self.random (#9)
* Fix some miscellaneous location issues
* Rewrite the DS3 intro page/FAQ
* Removing modifying the itempool after fill (#7)
Co-authored-by: Natalie Weizenbaum <nweiz@google.com>
* Small fixes to the setup guide (#10)
Small fixes, adding an example for connecting
* Expanded Late Basin of Vows and Late DLC (#6)
* Add proper requirements for CD: Black Eye Orb
* Fix Aldrich's name
* Document the differences with the 2.x.x branch
* Don't crash if there are more items than locations in smoothing
* Apply suggestions from code review
Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com>
* Code review
* Fix _replace_with_filler
* Don't use the shared flatten function in SM
* Track local items separately rather than iterating the multiworld
* Various formatting/docs changes suggested by PyCharm (#12)
* Drop deprecated options
* Rename "offline randomizer" to "static randomizer" which is clearer
* Move `enable_*_locations` under removed options.
* Avoid excluded locations for locally-filled items
* Adding Removed options to error (#14)
* Changes for WebHost options display and the options overhaul
* unpack iterators in item list (#13)
* Allow worlds to add options to prebuilt groups
Previously, this crashed because `typing.NamedTuple` fields such as
`group.name` aren't assignable. Now it will only fail for group names
that are actually incorrectly cased, and will fail with a better error
message.
* Style changes, rename exclude behavior options, remove guaranteed items option
* Spacing/Formatting (#18)
* Various Fixes (#19)
* Universally Track Yhorm (#20)
* Account for excluded and missable
* These are behaviors now
* This is singular, apparently
* Oops
* Fleshing out the priority process
* Missable Titanite Lizards and excluded locations (#22)
* Small style/efficiency changes
* Final passthrough fixes (#24)
* Use rich option formatting
* Make the behavior option values actual behaviors (#25)
* Use !=
* Remove unused flatten utility
* Some changes from review (#28)
* Fixing determinism and making smooth faster (#29)
* Style change
* PyCharm and Mypy fixes (#26)
Co-authored-by: Scipio Wright <scipiowright@gmail.com>
* Change yhorm default (#30)
* Add indirect condition (#27)
* Update worlds/dark_souls_3/docs/locations_en.md
Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com>
* Ship all item IDs to the client
This avoids issues where items might get skipped if, for instance,
they're only in the starting inventory.
* Make sure to send AP IDs for infused/upgraded weapons
* Make `RandomEnemyPresetOption` compatible with ArchipelagoMW/Archipelago#3280 (#31)
* Fix cast
* More typing and small fixes (#32)
---------
Co-authored-by: Scipio Wright <scipiowright@gmail.com>
Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Co-authored-by: Exempt-Medic <ExemptMedic@Gmail.com>
Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com>
Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>
Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
* makes grub hunt goal option that calculates the total available grubs (including item link replacements) and requires all of them to be gathered for goal completion
* update slot data name for grub count
* add option to set number needed for grub hub
* updates to grub hunt goal based on review
* copy/paste fix
* account for 'any' goal and fix overriding non-grub goals
* making sure godhome is in logic for any and removing redundancy on completion condition
* fix typing
* i hate typing
* move to stage_pre_fill
* modify "any" goal so all goals are in logic under minimal settings
* rewrite grub counting to create lookups for grubs and groups that can be reused
* use generator instead of list comprehension
* fix whitespace merging wrong
* minor code cleanup
* Fixing logic bugs
* Require energy attack in the cathedral and energy form in the body
* King Jelly can be beaten easily with only the Dual Form
* I think that I have a problem with my left and right...
* There is a monster that is blocking the path, soo need attack to pass
* The Li cage is not accessible without the Sunken city boss
* Removing useless space.
Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
* Two more minors logic modification
* Adapting tests to af9b6cd
* Reformat the Region file
---------
Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
The access rules for "<Environment name> Chest n", "<Environment name>
Shrine n" etc. locations recursively called state.can_reach() for the
n-1 location name, with the n=1 location being the only location to have
the actual access rule set.
This patch removes the recursion, instead setting the actual access rule
directly on each location, increasing the performance of checking
accessibility of n>1 locations.
Risk of Rain 2 was already quite fast to generate despite the recursion
in the access rules, but with this patch, generating a multiworld with
200 copies of the template RoR2 yaml (and progression balancing
disabled through a meta.yaml) goes from about 18s to about 6s for me.
From generating the same seed before and after this patch, the same
result is produced.
* Sort entrances in spoiler log
* Rearrange portal list to closer match the vanilla game order, for better spoiler and because I already did this mod-side
* Add break (thanks vi)
* MMBN3: Press program now has proper color index when received remotely
* Initial commit of OSRS untangled from MMBN3 branch
* Fixes some broken region connections
* Removes some locations
* Rearranges locations to fill in slots left by removed locations
* Adds starting area rando
* Moves Oak and Willow trees to resource regions
* Fixes various PEP8 violations
* Refactor of regions
* Fixes variable capture issue with region rules
* Partial completion of brutal grind logic
* Finishes can_reach_skill function
* Adds skill requirements to location rules, fixes regions rules
* Adds documentation for OSRS
* Removes match statement
* Updates Data Version to test mode to prevent item name caching
* Fixes starting spawn logic for east varrock
* Fixes river lum crossing logic to not assume you can phase across water
* Prevents equipping items when you haven't unlocked them
* Changes canoe logic to not require huge levels
* Skeletoning out some data I'll need for variable task system
* Adds csvs and parser for logic
* Adds Items parsing
* Fixes the spawning logic to not default to Chunksanity when you didn't pick it
* Begins adding generation rules for data-driven logic
* Moves region handling and location creating to different methods
* Adds logic limits to Options
* Begun the location generation has
* Randomly generates tasks for each skill until populated
* Mopping up improper names, adding custom logic, and fixes location rolling
* Drastically cleans up the location rolling loop
* Modifies generation to properly use local variables and pass unit tests
* Game is now generating, but rules don't seem to work
* Lambda capture, my old nemesis. We meet again
* Fixes issue with Corsair Cove item requirement causing logic loop
* Okay one more fix, another variable capture
* On second thought lets not have skull sceptre tasks. 'Tis a silly place
* Removes QP from item pool (they're events not items)
* Removes Stronghold floor tasks, no varbit to track them
* Loads CSV with pkutil so it can be used in apworld
* Fixes logic of skill tasks and adds QP requirements to long grinds
* Fixes pathing in pkgutil call
* Better handling for empty task categories, no longer throws errors
* Fixes order for progressive tasks, removes un-checkable spider task
* Fixes logic issues related to stew and the Blurite caves
* Fixes issues generating causing tests to sporadically fail
* Adds missing task that caused off-by-one error
* Updates to new Options API
* Updates generation to function properly with the Universal Tracker (Thanks Faris)
* Replaces runtime CSV parsing with pre-made python files generated from CSVs
* Switches to self.random and uses random.choice instead of doing it manually
* Fixes to typing, variable names, iterators, and continue conditions
* Replaces Name classes with Enums
* Fixes parse error on region special rules
* Skill requirements check now returns an accessrule instead of being one that checks options
* Updates documentation and setup guide
* Adjusts maximum numbers for combat and general tasks
* Fixes region names so dictionary lookup works for chunksanity
* Update worlds/osrs/docs/en_Old School Runescape.md
Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com>
* Update worlds/osrs/docs/en_Old School Runescape.md
Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com>
* Updates readme.md and codeowners doc
* Removes erroneous East Varrock -> Al Kharid connection
* Changes to canoe logic to account for woodcutting level options
* Fixes embarassing typo on 'Edgeville'
* Moves Logic CSVs to separate repository, addresses suggested changes on PR
* Fixes logic error in east/west lumbridge regions. Fixes incorrect List typing in main
* Removes task types with weight 0 from the list of rollable tasks
* Missed another place that the task type had to be removed if 0 weight
* Prevents adding an empty task weight if levels are too restrictive for tasks to be added
* Removes giant blank space in error message
* Adds player name to error for not having enough available tasks
---------
Co-authored-by: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com>