Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mega Man 2: Implement New Game #3256

Merged
merged 172 commits into from
Aug 20, 2024
Merged

Mega Man 2: Implement New Game #3256

merged 172 commits into from
Aug 20, 2024

Conversation

Silvris
Copy link
Collaborator

@Silvris Silvris commented May 3, 2024

What is this fixing or adding?

Adds Mega Man 2 as a supported game to Archipelago.

How was this tested?

5 apworld releases.
Numerous unsupported games, by myself and others.

If this makes graphical changes, please attach screenshots.

AP_91189178803762945109_P1_SilvrisRock_000
AP_66100321510070973225_P1_Player1_001

Copy link
Collaborator

@Exempt-Medic Exempt-Medic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All my comments were addressed. I'm a little confused/worried about the collect/remove here but, eh, core can decide about that. This worlds generates fast, even when scaled to ridiculous numbers of players like 1000. I'd be lying if I said that wasn't an insane relief after the other worlds I reviewed XD
No generation errors occurred other than with non-ASCII item names which is now fixed

Copy link
Member

@NewSoupVi NewSoupVi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code is pretty nice in terms of performance & logic, I don't think I had almost any genuine issues with it except I do want collect and remove to be looked at for a possible simplification.

However, I'm not quite happy that line 77 to 250 of rules.py took me 1.5h to review. They really don't do anything crazy, but the shortened variable names, use of "magic numbers", and generally not always picking the most readable container / iterator (I'd especially like seeing .items() used more and tuples & range to be used less where possible) made it really really hard to penetrate, sometimes taking me several minutes to understand what a single comprehension is doing.

But I guess at the end of the day, as long as you understand it, it's kind of fine.

Anyway, all in all, I imagine we can get this one through pretty quick.

worlds/mm2/rules.py Show resolved Hide resolved
worlds/mm2/rules.py Outdated Show resolved Hide resolved
worlds/mm2/rules.py Show resolved Hide resolved
worlds/mm2/rules.py Outdated Show resolved Hide resolved
worlds/mm2/rules.py Outdated Show resolved Hide resolved
worlds/mm2/rules.py Outdated Show resolved Hide resolved
worlds/mm2/rules.py Outdated Show resolved Hide resolved
worlds/mm2/__init__.py Show resolved Hide resolved
worlds/mm2/__init__.py Outdated Show resolved Hide resolved
Comment on lines 73 to 82
def can_defeat_enough_rbms(state: "CollectionState", player: int,
required: int, boss_requirements: Dict[int, List[str]]):
can_defeat = 0
for boss, reqs in boss_requirements.items():
if boss in robot_masters:
if state.has_all(map(lambda x: weapons_to_name[x], reqs), player):
can_defeat += 1
if can_defeat >= required:
return True
return False
Copy link
Member

@NewSoupVi NewSoupVi Aug 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ftr, this game gens so fast so I'm definitely not gonna force this, but even just for readability, I think this should be further "pre-reduced". Consider this:

robot_master_reqs = {
    boss: reqs for boss, reqs in boss_requirements.items() if boss in robot_masters
}
world.robot_master_to_weapon_names = {
    map(lambda x: weapons_to_name[x], reqs) for boss, reqs in robot_master_reqs
}
def can_defeat_enough_rbms(state: "CollectionState", player: int,
                           required: int, robot_master_to_weapon_names: Dict[int, List[str]]):
    can_defeat = 0
    for boss, weapon_names in robot_master_to_weapon_names.items():
        if state.has_all(weapon_names, player):
            can_defeat += 1
            if can_defeat >= required:
                return True
    return False

Copy link
Member

@NewSoupVi NewSoupVi Aug 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In fact, at that point, you don't even need the names of the robot masters anymore, do you! The variable boss is now unused in that for loop.

You can reduce it down to a list of only the weapon names lists that beat each robot master somewhere, but omit the information about which robot master they belong to bc that's not relevant to the logic:

world.robot_master_weapon_lists = [
    [weapons_to_name[x] for x in weapons_that_kill_it]  # "Map" is a bit wank at also causes a typing issue lol
    for boss, weapons_that_kill_it in boss_requirements.items() 
    if boss in robot_masters
]

and then your rbm function can be:

def can_defeat_enough_rbms(state: "CollectionState", player: int,
                           required: int, robot_master_weapon_lists: List[List[str]]):
    can_defeat = 0
    for weapon_list in robot_master_weapon_lists:
        if state.has_all(weapon_list, player):
            can_defeat += 1
            if can_defeat >= required:
                return True
    return False

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh you could even sort it by length to make the early exit more likely to be sooner... ok maybe this is going too far now

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I'm going to keep it as is, mostly because the current structure of boss_requirements is useful for debugging should there still be another error in the rule. Being able to see the end result of the validation was already very useful in debugging issues in the past, and with the speed it generates at, changing it isn't worth losing that.

Copy link
Member

@NewSoupVi NewSoupVi Aug 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm saying you could have both, boss requirements as a "source of truth" and "robot_master_weapons" as a prepared / filtered & int->str converted version for this specific access rule

In fact, in my sample impl of this, I just had that conversion sitting right before the setting of the rbm access rules, as a local variable, not even attaching it to world at all

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Anyway think abt it, I'll do a rereview at some point tomorrow probably

@Exempt-Medic Exempt-Medic removed the waiting-on: author Issue/PR is waiting for feedback or changes from its author. label Aug 20, 2024
@NewSoupVi
Copy link
Member

Oh hold up, isn't this missing a MegaMan2Client.py?

@Silvris
Copy link
Collaborator Author

Silvris commented Aug 20, 2024

Oh hold up, isn't this missing a MegaMan2Client.py?

Bizhawk Client

@NewSoupVi
Copy link
Member

Oh hold up, isn't this missing a MegaMan2Client.py?

Bizhawk Client

🤦 my bad

@NewSoupVi
Copy link
Member

Ok then I think this is good :) Give me a lil bit

@NewSoupVi NewSoupVi merged commit 0e6e359 into ArchipelagoMW:main Aug 20, 2024
19 checks passed
gurglemurgle5 pushed a commit to gurglemurgle5/Archipelago that referenced this pull request Aug 20, 2024
* initial (broken) commit

* small work on init

* Update Items.py

* beginning work, some rom patches

* commit progress from bh branch

* deathlink, fix soft-reset kill, e-tank loss

* begin work on targeting new bhclient

* write font

* definitely didn't forget to add the other two hashes no

* update to modern options, begin colors

* fix 6th letter bug

* palette shuffle + logic rewrite

* fix a bunch of pointers

* fix color changes, deathlink, and add wily 5 req

* adjust weapon weakness generation

* Update Rules.py

* attempt wily 5 softlock fix

* add explicit test for rbm weaknesses

* fix difficulty and hard reset

* fix connect deathlink and off by one item color

* fix atomic fire again

* de-jank deathlink

* rewrite wily5 rule

* fix rare solo-gen fill issue, hopefully

* Update Client.py

* fix wily 5 requirements

* undo fill hook

* fix picopico-kun rules

* for real this time

* update minimum damage requirement

* begin move to procedure patch

* finish move to APPP, allow rando boobeam, color updates

* fix color bug, UT support?

* what do you mean I forgot the procedure

* fix UT?

* plando weakness and fixes

* sfx when item received, more time stopper edge cases

* Update test_weakness.py

* fix rules and color bug

* fix color bug, support reduced flashing

* major world overhaul

* Update Locations.py

* fix first found bugs

* mypy cleanup

* headerless roms

* Update Rom.py

* further cleanup

* work on energylink

* el fixes

* update to energylink 2.0 packet

* energylink balancing

* potentially break other clients, more balancing

* Update Items.py

* remove startup change from basepatch

we write that in patch, since we also need to clean the area before applying

* el balancing and feedback

* hopefully less test failures?

* implement world version check

* add weapon/health option

* Update Rom.py

* x/x2

* specials

* Update Color.py

* Update Options.py

* finally apply location groups

* bump minor version number instead

* fix duplicate stage sends

* validate wily 5, tests

* see if renaming fixes

* add shuffled weakness

* remove passwords

* refresh rbm select, fix wily 5 validation

* forgot we can't check 0

* oops I broke the basepatch (remove failing test later)

* fix solo gen fill error?

* fix webhost patch recognition

* fix imports, basepatch

* move to flexibility metric for boss validation

* special case boobeam trap

* block strobe on stage select init

* more energylink balancing

* bump world version

* wily HP inaccurate in validation

* fix validation edge case

* save last completed wily to data storage

* mypy and pep8 cleanup

* fix file browse validation

* fix test failure, add enemy weakness

* remove test seed

* update enemy damage

* inno setup

* Update en_Mega Man 2.md

* setup guide

* Update en_Mega Man 2.md

* finish plando weakness section

* starting rbm edge case

* remove * imports

* properly wrap later weakness additions in regen playthrough

* fix import

* forgot readme

* remove time stopper special casing

since we moved to proper wily 5 validation, this special casing is no longer important

* properly type added locations

* Update CODEOWNERS

* add animation reduction

* deprioritize Time Stopper in rush checks

* special case wily phase 1

* fix key error

* forgot the test

* music and general cleanup

* the great rename

* fix import

* thanks pycharm

* reorder palette shuffle

* account for alien on shuffled weakness

* apply suggestions

* fix seedbleed

* fix invalid buster passthrough

* fix weakness landing beneath required amount

* fix failsafe

* finish music

* fix Time Stopper on Flash/Alien

* asar pls

* Apply suggestions from code review

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

* world helpers

* init cleanup

* apostrophes

* clearer wording

* mypy and cleanup

* options doc cleanup

* Update rom.py

* rules cleanup

* Update __init__.py

* Update __init__.py

* move to defaultdict

* cleanup world helpers

* Update __init__.py

* remove unnecessary line from fill hook

* forgot the other one

* apply code review

* remove collect

* Update rules.py

* forgot another

---------

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
agilbert1412 pushed a commit to agilbert1412/Archipelago that referenced this pull request Aug 24, 2024
* initial (broken) commit

* small work on init

* Update Items.py

* beginning work, some rom patches

* commit progress from bh branch

* deathlink, fix soft-reset kill, e-tank loss

* begin work on targeting new bhclient

* write font

* definitely didn't forget to add the other two hashes no

* update to modern options, begin colors

* fix 6th letter bug

* palette shuffle + logic rewrite

* fix a bunch of pointers

* fix color changes, deathlink, and add wily 5 req

* adjust weapon weakness generation

* Update Rules.py

* attempt wily 5 softlock fix

* add explicit test for rbm weaknesses

* fix difficulty and hard reset

* fix connect deathlink and off by one item color

* fix atomic fire again

* de-jank deathlink

* rewrite wily5 rule

* fix rare solo-gen fill issue, hopefully

* Update Client.py

* fix wily 5 requirements

* undo fill hook

* fix picopico-kun rules

* for real this time

* update minimum damage requirement

* begin move to procedure patch

* finish move to APPP, allow rando boobeam, color updates

* fix color bug, UT support?

* what do you mean I forgot the procedure

* fix UT?

* plando weakness and fixes

* sfx when item received, more time stopper edge cases

* Update test_weakness.py

* fix rules and color bug

* fix color bug, support reduced flashing

* major world overhaul

* Update Locations.py

* fix first found bugs

* mypy cleanup

* headerless roms

* Update Rom.py

* further cleanup

* work on energylink

* el fixes

* update to energylink 2.0 packet

* energylink balancing

* potentially break other clients, more balancing

* Update Items.py

* remove startup change from basepatch

we write that in patch, since we also need to clean the area before applying

* el balancing and feedback

* hopefully less test failures?

* implement world version check

* add weapon/health option

* Update Rom.py

* x/x2

* specials

* Update Color.py

* Update Options.py

* finally apply location groups

* bump minor version number instead

* fix duplicate stage sends

* validate wily 5, tests

* see if renaming fixes

* add shuffled weakness

* remove passwords

* refresh rbm select, fix wily 5 validation

* forgot we can't check 0

* oops I broke the basepatch (remove failing test later)

* fix solo gen fill error?

* fix webhost patch recognition

* fix imports, basepatch

* move to flexibility metric for boss validation

* special case boobeam trap

* block strobe on stage select init

* more energylink balancing

* bump world version

* wily HP inaccurate in validation

* fix validation edge case

* save last completed wily to data storage

* mypy and pep8 cleanup

* fix file browse validation

* fix test failure, add enemy weakness

* remove test seed

* update enemy damage

* inno setup

* Update en_Mega Man 2.md

* setup guide

* Update en_Mega Man 2.md

* finish plando weakness section

* starting rbm edge case

* remove * imports

* properly wrap later weakness additions in regen playthrough

* fix import

* forgot readme

* remove time stopper special casing

since we moved to proper wily 5 validation, this special casing is no longer important

* properly type added locations

* Update CODEOWNERS

* add animation reduction

* deprioritize Time Stopper in rush checks

* special case wily phase 1

* fix key error

* forgot the test

* music and general cleanup

* the great rename

* fix import

* thanks pycharm

* reorder palette shuffle

* account for alien on shuffled weakness

* apply suggestions

* fix seedbleed

* fix invalid buster passthrough

* fix weakness landing beneath required amount

* fix failsafe

* finish music

* fix Time Stopper on Flash/Alien

* asar pls

* Apply suggestions from code review

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

* world helpers

* init cleanup

* apostrophes

* clearer wording

* mypy and cleanup

* options doc cleanup

* Update rom.py

* rules cleanup

* Update __init__.py

* Update __init__.py

* move to defaultdict

* cleanup world helpers

* Update __init__.py

* remove unnecessary line from fill hook

* forgot the other one

* apply code review

* remove collect

* Update rules.py

* forgot another

---------

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Ars-Ignis added a commit to Ars-Ignis/Archipelago that referenced this pull request Aug 28, 2024
commit 0fb69dce33be7876c4491b4682f88af5c78fb19b
Author: Bryce Wilson <gyroscope15@gmail.com>
Date:   Sat Aug 24 19:08:27 2024 -0700

    Pokemon Emerald: Fix map update sending to all trackers (#3846)

commit e99f027b424eb37949ece2c768d75ddf3b96ae38
Author: Justus Lind <DeamonHunter@users.noreply.github.com>
Date:   Sun Aug 25 02:19:42 2024 +1000

    Muse Dash: Update to 4.7.0 - Let's Rhythm Jam! (#3837)

    * Update to Muse Dash 4.7.0 Muse Dash - Let's Rhythm Jam!

    * Add the replaced song to the removed list.

    * Oops add the other secret song to this list.

    * Add trailing comma

    Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>

    ---------

    Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>

commit dddffa1660423a379faf3a4808b962679084dc68
Author: Aaron Wagener <mmmcheese158@gmail.com>
Date:   Sat Aug 24 03:54:33 2024 -0500

    LTTP: fix own_dungeon setting from not being placed in the player's own world (#3816)

commit 83367c694602beff5fd84e1160909cc85ce771fb
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Sat Aug 24 04:53:56 2024 -0400

    ALttP: Fix accessibility (locations -> full) (#3801)

commit 0fcca25870be3ec343d13a3ab7b4e0d63c13b84b
Author: Silvris <58583688+Silvris@users.noreply.github.com>
Date:   Fri Aug 23 22:41:00 2024 -0500

    Core: deepcopy plando items #3841

commit d1a7fd7da118d9470c037f7374445f0f086ede6a
Author: Bryce Wilson <gyroscope15@gmail.com>
Date:   Fri Aug 23 17:51:52 2024 -0700

    Pokemon Emerald: Send current map to trackers (#3726)

commit 5c5f2ffc947a6fc2befd09f528694964e44edc9f
Author: qwint <qwint.42@gmail.com>
Date:   Fri Aug 23 19:12:01 2024 -0500

    kvui: assert kivy is not imported before kvui (#3823)

commit 6f617e302d65058fc4602991f465b3db2fbebe44
Author: Scipio Wright <scipiowright@gmail.com>
Date:   Fri Aug 23 20:09:50 2024 -0400

    Launcher: Update message that displays when installing a custom apworld for a game in main (#3607)

commit 35c9061c9cb3fbb12687e7afba73824c27e4ec1e
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Sat Aug 24 02:08:46 2024 +0200

    The Witness: Switch to world.player_name (#3693)

    * lint

    * player_name

    * oops lmao

    * shorten

commit e61d521ba8df5a1dfd1dda44a4e7c7e9989865a9
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Sat Aug 24 02:08:04 2024 +0200

    The Witness: Shuffle Dog (#3425)

    * Town Pet the Dog

    * Add shuffle dog to options presets

    * I cri evritim

    * I guess it's as good a time as any

    * :(

    * fix the soft conflict

    * add all the shuffle dog options to some of the unit tests bc why not

    * Laser Panels are just 'General' now, I'm pretty sure

    * Could I really call it allsanity?

commit 6efa065867332fc7fa91d3cc4add38c9fff96231
Author: gaithern <36639398+gaithern@users.noreply.github.com>
Date:   Fri Aug 23 19:06:08 2024 -0500

    Kingdom Hearts: Make Ceiling Division Human-Readable #3839

commit 56dbba6a31a8be06d698155c3ef2d419c5b8388c
Author: PoryGone <98504756+PoryGone@users.noreply.github.com>
Date:   Fri Aug 23 20:05:42 2024 -0400

    Celeste 64: Typo #3840

    oops

commit 43cb9611fb28a02f594ed2170281043285ae8101
Author: Doug Hoskisson <beauxq@users.noreply.github.com>
Date:   Fri Aug 23 17:05:30 2024 -0700

    Core: some typing and cleaning in `BaseClasses.py` (#3391)

    * Core: some typing and cleaning in `BaseClasses.py`

    * more backwards `__repr__`

    * double-quote string

    * remove some end-of-line whitespace

commit 64b654d42ec016c4e94b81842f3b6bac73f54740
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Fri Aug 23 01:15:05 2024 +0200

    Core, some worlds: Rename sweep_for_events to sweep_for_advancements (#3571)

    * Rename sweep_for_events to sweep_for_advancements

    * more event->advancement renames

    * oops accidentally deleted the deprecation thing in the force push

    * Update TestDungeon.py

    * Update BaseClasses.py

    * Update BaseClasses.py

    * oops

    * utils.deprecate

    * treble, you had no idea how right you were

    * Update test_panel_hunt.py

    * Update BaseClasses.py

    Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>

    ---------

    Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>

commit 74aab81f79bc0c2e0356efbcf1ad7b4211b23ce8
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Fri Aug 23 00:23:22 2024 +0200

    Purge the world: multiworld evil from osrs (#3751)

commit f390b33c17132ef37563847496106479992111db
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Fri Aug 23 00:23:05 2024 +0200

    The Witness: Ban Excluded Panels from Panel Hunt (#3818)

    * excluded panels should not be picked by panel hunt

    * ban excluded panels from panel hunt

    * Get rid of an unused variable

commit 31852801c9849c9f9c015030839086b3188fc6bd
Author: Kappatechy <jmdewar@shaw.ca>
Date:   Thu Aug 22 15:35:29 2024 -0600

    LTTP: Fix a bug in Triforce Pieces Mode: Extra (#3784)

    When triforce_pieces_mode is set to "extra", the number of Triforce pieces in the pool should be equal to the number required plus the number extra. The number available was being used in this calculation, instead of the number required.

commit e35addf5b26a380e36af425445f6b9b459ccddfb
Author: B1t <christopher.j.wallis@gmail.com>
Date:   Thu Aug 22 11:59:11 2024 -0600

    ALTTP: Minor Tweaks to the Adjuster UI (#2533)

    * Tweak ALTTP Adjuster padding/size to accommodate resizing

      - Set minsize so the actions buttons on bottom are always visible.
      - Added a minor amount of padding around the top level objects.
      - Increased the size of the entry fields for roms to match general
        button size.
      - Updated layout calls so vertical spacing doesn't increase
        between fields when maximizing the window
      - Added a little bit of spacing on the rom label so it more closely
        lines up with the other rom selection field

    * Tweak ALTTP Adjuster padding/size to accommodate resizing

      - Set minsize so the actions buttons on bottom are always visible.
      - Added a minor amount of padding around the top level objects.
      - Increased the size of the entry fields for roms to match general
        button size.
      - Updated layout calls so vertical spacing doesn't increase
        between fields when maximizing the window
      - Added a little bit of spacing on the rom label so it more closely
        lines up with the other rom selection field

commit 3cdcb8c455d7f1951a4becf8bf06d2933feb3a28
Author: Spineraks <markvanderboor@hotmail.com>
Date:   Wed Aug 21 21:40:40 2024 +0200

    Yacht Dice: setup: change release-link to latest (#3827)

    On the installation page, link to the latest release, instead of the page with all releases

commit 48c6a6fb4c04f906dcad757c9ec9d1c5cd5a1cbf
Author: Spineraks <markvanderboor@hotmail.com>
Date:   Wed Aug 21 19:59:21 2024 +0200

    YachtDice: implement new game (#3482)

    * Add the yacht dice (from other git) world to the yacht dice fork

    * Update .gitignore

    * Removed zillion because it doesn't work

    * Update .gitignore

    * added zillion again...

    * Now you can have 0 extra fragments

    * Added alt categories, also options

    * Added item categories

    * Extra categories are now working! :dog:

    * changed options and added exceptions

    * Testing if I change the generate.py

    * Revert "Testing if I change the generate.py"

    This reverts commit 7c2b3df6170dcf8d8f36a1de9fcbc9dccdec81f8.

    * ignore gitignore

    * Delete .gitignore

    * Update .gitignore

    * Update .gitignore

    * Update logic, added multiplicative categories

    * Changed difficulties

    * Update offline mode so that it works again

    * Adjusted difficulty

    * New version of the apworld, with 1000 as final score, always

    Will still need to check difficulty and weights of adding items.
    Website is not ready yet, so this version is not usable yet :)

    * Changed yaml and small bug fixes

    Fix when goal and max are same
    Options: changed chance to weight

    * no changes, just whitespaces

    * changed how logic works

    Now you put an array of mults and the cpu gets a couple of tries

    * Changed logic, tweaked a bit too

    * Preparation for 2.0

    * logic tweak

    * Logic for alt categories properly now

    * Update setup_en.md

    * Update en_YachtDice.md

    * Improve performance of add_distributions

    * Formatting style

    * restore gitignore to APMW

    * Tweaked generation parameters and methods

    * Version 2.0.3

    manual input option
    max score in logic always 2.0.3
    faster gen

    * Comments and editing

    * Renamed setup guide

    * Improved create_items code

    * init of locations: remove self.event line

    * Moved setting early items to generate_early

    * Add my name to CODEOWNERS

    * Added Yacht Dice to the readme in list of games

    * Improve performance of Yacht Dice

    * newline

    * Improve typing

    * This is actually just slower lol

    * Update worlds/yachtdice/Items.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Apply suggestions from code review

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update Options.py

    * Styling

    * finished text whichstory option

    * removed roll and rollfragments; not used

    * import; worlds not world :)

    * Option groups!

    * ruff styling, fix

    * ruff format styling!

    * styling and capitalization of options

    * small comment

    * Cleaned up the "state_is_a_list" a little bit

    * RUFF :dog:

    * Changed filling the itempool for efficiency

    Now, we start with 17 extra items in the item pool, it's quite likely you need at least 17 items (~80%?).
    And then afterwards, we delete items if we overshoot the target of 1000, and add items if we haven't reached an achievable score of 1000 yet. Also, no need to recompute the entire logic when adding points.

    * :dog:

    * Removed plando "fix"

    * Changed indent of score multiplier

    * faster location function

    * Comments to docstrings

    * fixed making location closest to goal_score be goal_score

    * options format

    * iterate keys and values of a dict together

    * small optimization ListState

    * faster collection of categories

    * return arguments instead of making a list (will :dog: later)

    * Instead of turning it into a tuple, you can just make a tuple literal

    * remove .keys()

    * change .random and used enumerate

    * some readability improvements

    * Remove location "0", we don't use that one

    * Remove lookup_id_to_name entirely

    I for sure don't use it, and as far as I know it's not one of the mandatory functions for AP, these are item_name_to_id and location_name_to_id.

    * .append instead of += for single items, percentile function changed

    Also an extra comment for location ids.

    * remove ) too many

    * Removed sorted from category list

    * Hash categories (which makes it slower :( )

    Maybe I messed up or misunderstood...
    I'll revert this right away since it is 2x slower, probably because of sorted instead of sort?

    * Revert "Hash categories (which makes it slower :( )"

    This reverts commit 34f2c1aed8c8813b2d9c58896650b82a810d3578.

    * temporary push: 40% faster generation test

    Small changes in logic make the generation 40% faster.
    I'll have to think about how big the changes are. I suspect they are rather limited.
    If this is the way to go, I'll remove the temp file and redo the YachtWeights file, I'll remove the functions there and just put the new weights here.

    * Add Points item category

    * Reverse changes of bad idea :)

    * ruff :dog:

    * Use numpy and pmf function to speed up gen

    Numpy has a built-in way to sum probability mass functions (pmf).
    This shaves of 60% of the generation time :D

    * Revert "Use numpy and pmf function to speed up gen"

    This reverts commit 9290191cb323ae92321d6c2cfcfe8c27370f439b.

    * Step inbetween to change the weights

    * Changed the weights to make it faster

    135 -> 81 seconds on 100 random yamls

    * Adjusted max_dist, split dice_simulation function

    * Removed nonlocal and pass arguments instead

    * Change "weight-lists" to Dict[str, float]

    * Removed the return from ini_locations.

    Also added explanations to cat_weights

    * Choice options; dont'use .value (will ruff later)

    * Only put important options in slotdata

    * :dog:

    * Add Dict import

    * Split the cache per player, limit size to 400.

    * :dog:

    * added , because of style

    * Update apworld version to 2.0.6

    2.0.5 is the apworld I released on github to be tested
    I never separately released 2.0.4.

    * Multiple smaller code improvements

    - changed names in YachtWeights so we don't need to translate them in Rules anymore
    - we now remember which categories are present in the game, and also put this in slotdata. This we do because only one of two categories is present in a game. If for some reason both are present (plando/getitem/startinventory), we now know which category to ignore
    -

    * :dog: ruff

    * Mostly minimize_extra_items improvements

    - Change logic, generation is now even faster (0.6s per default yaml).
    - Made the option 'minimize_extra_items' do a lot more, hopefully this makes the impact of Yacht Dice a little bit less, if you want that. Here's what is also does now:
     - you start with 2 dice and 2 rolls
     - there will be less locations/items at the start of you game

    * ruff :dog:

    * Removed printing options

    * Reworded some option descriptions

    ---------

    Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

commit eaa81560616099905e226c042d3c8f4635c869ec
Author: Silvris <58583688+Silvris@users.noreply.github.com>
Date:   Wed Aug 21 09:20:16 2024 -0500

    MM2: fix Wily 5 Time Stopper rule (#3824)

    * fix time stopper rule

    * that was the entirely wrong rule actually

commit 54a7bb566400ac1054d61782eae74ea3f8540cf0
Author: Trevor L <80716066+TRPG0@users.noreply.github.com>
Date:   Tue Aug 20 17:18:28 2024 -0600

    Blasphemous: Total overhaul (#3355)

    * Blasphemous: WIP overhaul

    * Entrance rule mistake

    * stuff

    * Getting closer

    * Real?? Maybe??

    * Don't fail me now 🙏

    * Add starting location tests

    * More tests (it still doesn't work actually 😔)

    * REAL

    * Add unreachable regions to test_reachability.py

    * PR ready

    - Remove unused functions from init
    - Use group exclusive functions in rules
    - Style changes

    * Bump required client version

    * Clean up unused imports

    * Change slot data

    * Review fixes

    - Prevent strength calculations from including excess items
    - Add new lines to ends of files
    - Fix missed deprecated option and random usage in init

    * Update option docstrings, add groups

    * Add preprocessor files

    * Update option docstrings again actually

    * Update player strength calculation

    * Rename group methods

    * Fix missing logic for RESCUED_CHERUB_06

    * Register indirect conditions

    * Register indirect conditions (part 2)

    * Update extracted logic, change slot data key

    * Add region to excluded list

    * A capital letter

    * Use camelCase keys in preprocessor

    * Write some of new setup guide

    * Remove indents before list points

    * Change locationinfo to list of dictonaries

    * Finish docs, update extractor config and data

    * Mark region_data.py as generated

    * Suggested changes

    * More suggested changes

    * Suggested changes again

    - Use OptionError
    - Create list of disabled locations before looping
    - Check if options are equal to str instead of int
    - Clean up start location override
    - Reword some of setup guide
    - Organize location list
    - Remove unnecessary escaped quotes from option docstrings
    - Add world type to test base

    * C# moment

    * Requested changes

    * Update .gitattributes

    ---------

    Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>

commit 0e6e35974735764a99e06eb7ce1d63b11bc32e83
Author: Silvris <58583688+Silvris@users.noreply.github.com>
Date:   Mon Aug 19 21:59:29 2024 -0500

    Mega Man 2: Implement New Game (#3256)

    * initial (broken) commit

    * small work on init

    * Update Items.py

    * beginning work, some rom patches

    * commit progress from bh branch

    * deathlink, fix soft-reset kill, e-tank loss

    * begin work on targeting new bhclient

    * write font

    * definitely didn't forget to add the other two hashes no

    * update to modern options, begin colors

    * fix 6th letter bug

    * palette shuffle + logic rewrite

    * fix a bunch of pointers

    * fix color changes, deathlink, and add wily 5 req

    * adjust weapon weakness generation

    * Update Rules.py

    * attempt wily 5 softlock fix

    * add explicit test for rbm weaknesses

    * fix difficulty and hard reset

    * fix connect deathlink and off by one item color

    * fix atomic fire again

    * de-jank deathlink

    * rewrite wily5 rule

    * fix rare solo-gen fill issue, hopefully

    * Update Client.py

    * fix wily 5 requirements

    * undo fill hook

    * fix picopico-kun rules

    * for real this time

    * update minimum damage requirement

    * begin move to procedure patch

    * finish move to APPP, allow rando boobeam, color updates

    * fix color bug, UT support?

    * what do you mean I forgot the procedure

    * fix UT?

    * plando weakness and fixes

    * sfx when item received, more time stopper edge cases

    * Update test_weakness.py

    * fix rules and color bug

    * fix color bug, support reduced flashing

    * major world overhaul

    * Update Locations.py

    * fix first found bugs

    * mypy cleanup

    * headerless roms

    * Update Rom.py

    * further cleanup

    * work on energylink

    * el fixes

    * update to energylink 2.0 packet

    * energylink balancing

    * potentially break other clients, more balancing

    * Update Items.py

    * remove startup change from basepatch

    we write that in patch, since we also need to clean the area before applying

    * el balancing and feedback

    * hopefully less test failures?

    * implement world version check

    * add weapon/health option

    * Update Rom.py

    * x/x2

    * specials

    * Update Color.py

    * Update Options.py

    * finally apply location groups

    * bump minor version number instead

    * fix duplicate stage sends

    * validate wily 5, tests

    * see if renaming fixes

    * add shuffled weakness

    * remove passwords

    * refresh rbm select, fix wily 5 validation

    * forgot we can't check 0

    * oops I broke the basepatch (remove failing test later)

    * fix solo gen fill error?

    * fix webhost patch recognition

    * fix imports, basepatch

    * move to flexibility metric for boss validation

    * special case boobeam trap

    * block strobe on stage select init

    * more energylink balancing

    * bump world version

    * wily HP inaccurate in validation

    * fix validation edge case

    * save last completed wily to data storage

    * mypy and pep8 cleanup

    * fix file browse validation

    * fix test failure, add enemy weakness

    * remove test seed

    * update enemy damage

    * inno setup

    * Update en_Mega Man 2.md

    * setup guide

    * Update en_Mega Man 2.md

    * finish plando weakness section

    * starting rbm edge case

    * remove * imports

    * properly wrap later weakness additions in regen playthrough

    * fix import

    * forgot readme

    * remove time stopper special casing

    since we moved to proper wily 5 validation, this special casing is no longer important

    * properly type added locations

    * Update CODEOWNERS

    * add animation reduction

    * deprioritize Time Stopper in rush checks

    * special case wily phase 1

    * fix key error

    * forgot the test

    * music and general cleanup

    * the great rename

    * fix import

    * thanks pycharm

    * reorder palette shuffle

    * account for alien on shuffled weakness

    * apply suggestions

    * fix seedbleed

    * fix invalid buster passthrough

    * fix weakness landing beneath required amount

    * fix failsafe

    * finish music

    * fix Time Stopper on Flash/Alien

    * asar pls

    * Apply suggestions from code review

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * world helpers

    * init cleanup

    * apostrophes

    * clearer wording

    * mypy and cleanup

    * options doc cleanup

    * Update rom.py

    * rules cleanup

    * Update __init__.py

    * Update __init__.py

    * move to defaultdict

    * cleanup world helpers

    * Update __init__.py

    * remove unnecessary line from fill hook

    * forgot the other one

    * apply code review

    * remove collect

    * Update rules.py

    * forgot another

    ---------

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

commit c4e7b6ca822da05241330174c852c12c96a210e7
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Tue Aug 20 01:34:40 2024 +0200

    The Witness: Add "vague" hints making use of other games' region names and location groups (#2921)

    * Vague hints work! But, the client will probably reveal some of the info through scouts atm

    * Fall back on Everywhere if necessary

    * Some of these failsafes are not necessary now

    * Limit region size to 100 as well

    * Actually... like this.

    * Nutmeg

    * Lol

    * -1 for own player but don't scout

    * Still make always/priority ITEM hints

    * fix

    * uwu notices your bug

    * The hints should, like, actually work, you know?

    * Make it a Toggle

    * Update worlds/witness/hints.py

    Co-authored-by: Bryce Wilson <gyroscope15@gmail.com>

    * Update worlds/witness/hints.py

    Co-authored-by: Bryce Wilson <gyroscope15@gmail.com>

    * Make some suggested changes

    * Make that ungodly equation a bit clearer in terms of formatting

    * make that not sorted

    * Add a warning about the feature in the option tooltip

    * Make using region names experimental

    * reword option tooltip

    * Note about singleplayer

    * Slight rewording again

    * Reorder the order of priority a bit

    * this condition is unnecessary now

    * comment

    * No wait the order has to be like this

    * Okay now I think it's correct

    * Another comment

    * Align option tooltip with new behavior

    * slight rewording again

    * reword reword reword reword

    * -

    * ethics

    * Update worlds/witness/options.py

    Co-authored-by: Bryce Wilson <gyroscope15@gmail.com>

    * Rename and slight behavior change for local hints

    * I think I overengineered this system before. Make it more consistent and clear now

    * oops I used checks by accident

    * oops

    * OMEGA OOPS

    * Accidentally commited a print statemetn

    * Vi don't commit nonsense challenge difficulty impossible

    * This isn't always true but it's good enough

    * Update options.py

    * Update worlds/witness/options.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Scipio :3

    * switch to is_event instead of checking against location.address

    * oop

    * Update test_roll_other_options.py

    * Fix that unit test problem lol

    * Oh is this not fixed in the apworld?

    ---------

    Co-authored-by: Bryce Wilson <gyroscope15@gmail.com>
    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

commit f253dffc0708fb8f3a2fb53bd003c2895ec39e97
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Tue Aug 20 01:16:35 2024 +0200

    The Witness: Panel Hunt Mode (#3265)

    * Add panel hunt options

    * Make sure all panels are either solvable or disabled in panel hunt

    * Pick huntable panels

    * Discards in disable non randomized

    * Set up panel hunt requirement

    * Panel hunt functional

    * Make it so an event can have multiple names

    * Panel hunt with events

    * Add hunt entities to slot data

    * ruff

    * add to hint data, no client sneding yet

    * encode panel hunt amount in compact hint data

    * Remove print statement

    * my b

    * consistent

    * meh

    * additions for lcient

    * Nah

    * Victory panels ineligible for panel hunt

    * Panel Hunt Postgame option

    * cleanup

    * Add data generation file

    * pull out set

    * always disable gate ep in panel hunt

    * Disallow certain challenge panels from being panel hunt panels

    * Make panelhuntpostgame its own function, so it can be called even if normal postgame is enabled

    * disallow PP resets from panel hunt

    * Disable challenge timer and elevetor start respectively in disable hunt postgame

    * Fix panelhunt postgame

    * lol

    * When you test that the bug is fixed but not that the non-bug is not unfixed

    * Prevent Obelisks from being panel hunt panels

    * Make picking panels for panel hunt a bit more sophisticated, if less random

    * Better function maybe ig

    * Ok maybe that was a bit too much

    * Give advanced players some control over panel hunt

    * lint

    * correct the logic for amount to pick

    * decided the jingle thing was dumb, I'll figure sth out client side. Same area discouragement is now a configurable factor, and the logic has been significantly rewritten

    * comment

    * Make the option visible

    * Safety

    * Change assert slightly

    * We do a little logging

    * number tweak & we do a lil logging

    * we do a little more logging

    * Ruff

    * Panel Hunt Option Group

    * Idk how that got here

    * Update worlds/witness/options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/witness/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * remove merge error

    * Update worlds/witness/player_logic.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * True

    * Don't have underwater sliding bridge when you have above water sliding bridge

    * These are not actually connected lol

    * get rid of unnecessary variable

    * Refactor compact hint function again

    * lint

    * Pull out Entity Hunt Picking into its own class, split it into many functions. Kept a lot of the comments tho

    * forgot to actually add the new file

    * some more refactoring & docstrings

    * consistent naming

    * flip elif change

    * Comment about naming

    * Make static eligible panels a constant I can refer back to

    * slight formatting change

    * pull out options-based eligibility into its own function

    * better text and stuff

    * lint

    * this is not necessary

    * capitalisation

    * Fix same area discouragement 0

    * Simplify data file generation

    * Simplify data file generation

    * prevent div 0

    * Add Vault Boxes -> Vault Panels to replacements

    * Update options.py

    * Update worlds/witness/entity_hunt.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update entity_hunt.py

    * Fix some events not working

    * assert

    * remove now unused function

    * lint

    * Lasers Activate, Lasers don't Solve

    * lint

    * oops

    * mypy

    * lint

    * Add simple panel hunt unit test

    * Add Panel Hunt Tests

    * Add more Panel Hunt Tests

    * Disallow Box Short for normal panel hunt

    ---------

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

commit c010c8c938921da9d58c0522d40f09f4c72ee223
Author: KonoTyran <Kono.Tyran@gmail.com>
Date:   Mon Aug 19 15:58:30 2024 -0700

    Minecraft: Update to new options system. (#3765)

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

commit 1e8a8e7482d4412f13a98121d208399fb48da3e1
Author: Doug Hoskisson <beauxq@users.noreply.github.com>
Date:   Mon Aug 19 11:37:36 2024 -0700

    Docs: `NetworkItem.player` (#3811)

    * 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>

commit 182f7e24e5e460a28a51c04e9e57e2df9964841c
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Mon Aug 19 07:49:06 2024 +0200

    The Witness: Fix Tunnels Theater Flower EP Access Logic + Add Unit Test for it (and Expert PP2) (#3807)

    * 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

commit 9277cb39efcca4e53ecca75c96436bd19eb0993a
Author: Mysteryem <Mysteryem@users.noreply.github.com>
Date:   Mon Aug 19 05:44:06 2024 +0100

    Core: Fix incorrect default state checked in MultiWorld.can_beat_game (#3813)

    `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 27b6dd8bd761

    Fixes #3742

commit 28a97095167fb6a43fd2c80c71c9a80f87bc9591
Author: gaithern <36639398+gaithern@users.noreply.github.com>
Date:   Sun Aug 18 17:39:37 2024 -0500

    Kingdom Hearts: Implement New Game (#3201)

    * Added Final Ansem Goal

    * Update __init__.py

    * Update Rules.py

    * New EotW logic

    * Update __init__.py

    * Update __init__.py

    * Update Items.py

    * Update Rules.py

    * Rename Location to be more meaningful, logic fixes

    * Removed Aerith locations

    * Change to allow randomized keyblade stats

    * Fixed incorrect option description.  Fixed victory locations for alternative win condition settings

    * Commit

    * Lots of changes

    * Fixes

    * Fixes

    * Update Rules.py

    * Update Rules.py

    * Update Rules.py

    * Update Rules.py

    * Fixes

    * Update Rules.py

    * Update Rules.py

    * Update Options.py

    * Old Book is not required

    * Added Jungle Slider

    * Add Cid Check

    * Add Wonderland Book Check

    * Add OC Green Trinity

    * Add Inferno Band Event

    * Add Kurt Zisa Zantetsuken and Unknown EXP Necklace checks

    * Update Locations.py

    * Fix Final Ansem Goal

    * Update __init__.py

    * Update __init__.py

    * Add options to exclude super bosses and 100 acre wood

    * Fix puppies trp, remove cid check

    * Fix 100 Acre Wood Option

    * Material to Empty Bottle

    * Fixed rules, location names, etc

    * Fix super bosses

    * Add item + location groups, level sanity

    * Fix location and item group names

    * Add Bad Starting Weapons Option

    * Logic Error for 100 Acre Wood

    * Update Rules.py

    * Update __init__.py

    * Fixes related to randomized keyblade stats and super bosses

    * Credits and Fixes

    * Logic fixes, location name group changes

    * Update Options.py

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/docs/kh1_en.md

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update .gitignore

    * Update CODEOWNERS

    * Update docs/CODEOWNERS

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Fixed Atlantica item group name

    * Update CODEOWNERS

    * Update Client.py

    * Update Items.py

    * Update __init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Fixed report group name

    * Fixes for PR

    * Update Options.py

    * Push changes for making the Final Rest Door appear, few option fixes

    * Update Rules.py

    * Website formatting, 0 min for reports, option description typo

    * Create KH1Client.py

    * Update worlds/kh1/docs/kh1_en.md

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update Options.py

    * Update Options.py

    * Update Rules.py

    * Update Rules.py

    * Update Rules.py

    * Add Donald and Goofy Death Link

    * Add fight logic for optional bosses

    * Update __init__.py

    * Update Options.py

    * Update worlds/kh1/Options.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update Client.py

    * Update kh1_en.md

    * Update __init__.py

    * Cleaning up for PR

    * Update Client.py

    * Added event locations for vanilla items

    * Add proper location groups and auto hint synth shop items when entering

    * so many changes

    * Update Rules.py

    * fixed oathkeeper and crabclaw logic

    * Update Rules.py

    * Update Rules.py

    * Update Rules.py

    * Update Rules.py

    * Update en_Kingdom Hearts.md

    * Update en_Kingdom Hearts.md

    * fixing text

    * Update kh1_en.md

    * Addition of new key items

    * Update Regions.py

    * Push for start item from pool test

    * Update worlds/kh1/Options.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Document update

    * Update Rules.py

    * Added starting world range and final rest goal option

    * Update kh1_en.md

    * Update en_Kingdom Hearts.md

    * Update __init__.py

    * Update __init__.py

    * Clean up options descriptions

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/Client.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Fix grammar in document

    * Update __init__.py

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Removed return type

    * Update __init__.py

    * Update __init__.py

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>

    * Update __init__.py

    * Fix missing i replacement, rework set rules to use "self" instead of a million arguments

    * Update KH1Client.py

    Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>

    * Reformat rules, fix bug with exp mult, add to readme

    * Clean up regions, fix client

    * Fix item send prompt

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/en_Kingdom Hearts.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/kh1_en.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/kh1_en.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/kh1_en.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/docs/kh1_en.md

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/test/test_goal.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Items.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Locations.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Regions.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Locations.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Locations.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Items.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Regions.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Regions.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/__init__.py

    Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>

    * Fix so many suggestions

    * removed junk in missable locations option

    * Update __init__.py

    * Change credits order

    * Update en_Kingdom Hearts.md

    * Standardize punctuation

    * Update en_Kingdom Hearts.md

    * Update en_Kingdom Hearts.md

    * Update Regions.py

    * Removed "disclude" options in generation fillers

    * Update Rules.py

    * Update __init__.py

    * Fix cemetery typo

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Add option groups and option presets

    * Update worlds/kh1/__init__.py

    That's a good idea!

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Options.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Presets.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * fixed HB rule and formatting on a line in Items.py

    * Fix logic bug with Geppetto's House postcard

    * Update Rules.py

    * Update Options.py

    * Update __init__.py

    * Update __init__.py

    * Huge under-the-hood update for PR

    * More updates for PR

    * Update worlds/kh1/__init__.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update worlds/kh1/Rules.py

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    * Update __init__.py

    ---------

    Co-authored-by: Scipio Wright <scipiowright@gmail.com>
    Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>
    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

commit 49a5b5277430de3be718cd765cb87ed1bf48a77f
Author: Scrungip <95324612+Scrungip@users.noreply.github.com>
Date:   Sun Aug 18 16:03:57 2024 -0500

    VVVVVV: Make unnecessary Trinkets filler (#3806)

    * Make unnecessary trinkets filler

    * Proper syntax

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    ---------

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

commit 2b1802cceed205af50439b3e256f75a36ff5acbb
Author: Doug Hoskisson <beauxq@users.noreply.github.com>
Date:   Fri Aug 16 18:19:16 2024 -0700

    Core: type for `CommonContext.ui` (#3796)

    * Core: type for `CommonContext.ui`

    * use `Optional`

commit f5218faea73983172a593f2caae9058769c0b7db
Author: Bryce Wilson <gyroscope15@gmail.com>
Date:   Fri Aug 16 13:23:47 2024 -0700

    Pokemon Emerald: Ensure dig tutor is always usable (#3660)

    * Pokemon Emerald: Ensure dig tutor is always usable

    * Pokemon Emerald: Clarify comment

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    ---------

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

commit 81092247c65817dc5f7529ce0ffd934b8007d085
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Fri Aug 16 16:20:20 2024 -0400

    Core: early_local != local_early #3780

commit ca96e7e2941325c46035a5f69775b5baffbf18e0
Author: Kaito Sinclaire <ks@rosenthalcastle.org>
Date:   Fri Aug 16 13:20:02 2024 -0700

    Fix !remaining for cross-world items (#3732)

    * Fix !remaining for other worlds

    * Typing fixes for the previous change

    * Update LocationStore test to match what get_remaining now returns

commit c014c5a54a8dcd83836f719d8ad06b945bfdea5e
Author: digiholic <digikun@gmail.com>
Date:   Fri Aug 16 14:10:30 2024 -0600

    [OSRS] Fixes Incorrect filler item names causing failures on tests. (#3768)

    * 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

commit e9c863dffd7bad83ca65ea68c6f9470d393d0b70
Author: Emily <35015090+EmilyV99@users.noreply.github.com>
Date:   Fri Aug 16 15:04:23 2024 -0400

    Docs: Update 'tag' documentation (#3632)

    * Add tag docs for HintGame

    * Apply suggestions from code review

    Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>

    * Make Tracker/TextOnly consistent with previous commit

    * Apply suggestion

    Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>

    * fix spacing

    * Apply suggestion

    Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>

    * apply suggestion correcting footnotes

    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

    ---------

    Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
    Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

commit 7eda4c47f87fba03ae738811aadfd9c8fd863805
Author: Mysteryem <Mysteryem@users.noreply.github.com>
Date:   Fri Aug 16 19:57:04 2024 +0100

    TLOZ: Fix non-deterministic item pool generation (#3779)

    * 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>

commit 474a3181c69643ec402bd5e5d6d156627d6d5907
Author: Scipio Wright <scipiowright@gmail.com>
Date:   Fri Aug 16 14:53:54 2024 -0400

    TUNIC: Give the fox a gun (in logic) (very small PR) (#3790)

    * Add bomb wall logic

    * Remove option call from can_shop

    * Gun for the envoy blocking Quarry

    * has_sword -> can_shop on cube cave entrance region

commit 4af6927e230144e7045f394efd6ea029b1339b05
Author: Star Rauchenberger <fefferburbia@gmail.com>
Date:   Fri Aug 16 14:52:16 2024 -0400

    Lingo: Fixed Initiated-side Eight Door not opening (#3793)

commit 06df072095deae83a41d67f3fb8b30053c2545ef
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Fri Aug 16 14:49:37 2024 -0400

    Core: Require excluded locations to be reachable with full/locations accessibility (#3802)

    * Make excludeds reachable

    * Update all_state tests

commit 56aabe51b83ef1185a2c7f5b43a386a106f21562
Author: agilbert1412 <alexgilbert@yahoo.com>
Date:   Wed Aug 14 18:07:06 2024 +0300

    Stardew Valley: Add Quality Bobber in the logic rules for fish quality gold and above #3792

commit 5e5f24cdd260810f2d823a9ddb6b77795e91afa8
Author: Scipio Wright <scipiowright@gmail.com>
Date:   Wed Aug 14 10:55:02 2024 -0400

    TUNIC: Add off and on aliases for the Entrance Rando option #3794

commit 9fbaa6050f40aded0546ea143743e1b3db559aa9
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Wed Aug 14 00:21:42 2024 -0400

    I have no idea (#3791)

commit 0af31c71e0a8e3930cf24aec717fdea644054314
Author: Scipio Wright <scipiowright@gmail.com>
Date:   Tue Aug 13 20:35:08 2024 -0400

    TUNIC: Swap from multiworld.get to world.get for applicable things (#3789)

    * Swap from multiworld.get to world.get for applicable things

    * Why was this even here in the first place?

commit 169da1b1e021bda141f7049cae591bb5c67d37df
Author: Aaron Wagener <mmmcheese158@gmail.com>
Date:   Tue Aug 13 17:31:26 2024 -0500

    Tests: fix the all games multiworld test (#3788)

commit 8e7ea06f39248b93f02f9640eae9a3d21c805fdb
Author: Aaron Wagener <mmmcheese158@gmail.com>
Date:   Tue Aug 13 17:17:42 2024 -0500

    Core: dump all item placements for generation failures. (#3237)

    * 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>

commit 96d48a923a34a1cd4c5f64a5f2e12acc657dd041
Author: Aaron Wagener <mmmcheese158@gmail.com>
Date:   Tue Aug 13 15:28:05 2024 -0500

    Core: recontextualize `CollectionState.collect` (#3723)

    * Core: renamed `CollectionState.collect` arg from `event` to `prevent_sweep` and remove forced collection

    * Update TestDungeon.py

    ---------

    Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>

commit dcaa2f7b971d9b41de7a84331008a095223ac997
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Tue Aug 13 12:02:09 2024 -0400

    Core: Two Small Fixes (#3782)

commit 50330cf32f05e5e1afb65b51f4fd5c01391c3534
Author: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>
Date:   Mon Aug 12 19:32:14 2024 +0200

    Core: Remove broken unused code from Options.py (#3781)

    "Unused" is a baseless assertion, but this code path has been crashing on the first statement for 6 months and noone's complained

commit 67520adceae7d7a1222afd319ab274868f3bd3b9
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Sun Aug 11 20:13:45 2024 -0400

    Core: Error on empty options.as_dict (#3773)

    * Error on empty options.as_dict

    * ValueError instead

    * Apply suggestions from code review

    Co-authored-by: Aaron Wagener <mmmcheese158@gmail.com>

    ---------

    Co-authored-by: Aaron Wagener <mmmcheese158@gmail.com>
    Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com>

commit a3e54a951fb2ea322fe5a13ba09024e57425a4a2
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Sun Aug 11 19:53:40 2024 -0400

    Undertale: Fix slot_data and options.as_dict() (#3774)

    * Undertale: Fixing slot_data

    * Booleans were difficult

commit ae0abd38217d03bba2f2ab78ee6a2311c5fdb995
Author: qwint <qwint.42@gmail.com>
Date:   Sun Aug 11 17:57:59 2024 -0500

    Core: change start inventory from pool to warn when nothing to remove (#3158)

    * 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

commit 21bbf5fb95bcf6c1cc842197ca44ec253c5daeb4
Author: Scipio Wright <scipiowright@gmail.com>
Date:   Sun Aug 11 18:24:30 2024 -0400

    TUNIC: Add note to Universal Tracker stuff #3772

commit 09e052c750fcd1fa2e56afb8e9ec39e95775e382
Author: Jarno <jarnowesthof@gmail.com>
Date:   Mon Aug 12 00:24:09 2024 +0200

    Timespinner: Fix eels check logic #3777

commit 68a92b0c6fe5b011da20ab5338c3f23757f1876d
Author: Scipio Wright <scipiowright@gmail.com>
Date:   Sun Aug 11 08:47:17 2024 -0400

    Clique: Update to new options API (#3759)

commit 8e06ab4f688c5e32350bea51ae47f8fcb3dd3e71
Author: Silvris <58583688+Silvris@users.noreply.github.com>
Date:   Sat Aug 10 06:49:32 2024 -0500

    Core: fix invalid __package__ of zipped worlds (#3686)

    * fix invalid package fix

    * add comment describing fix

commit 9dba39b6064b162124885f556b7b72476774907e
Author: black-sliver <59490463+black-sliver@users.noreply.github.com>
Date:   Sat Aug 10 13:08:24 2024 +0200

    SoE: fix determinism (#3745)

    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.

commit a6f376b02e48e98f253b42ca66fb99eaa927a1ab
Author: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Date:   Fri Aug 9 16:38:42 2024 -0400

    TLOZ: world: multiworld (#3752)

commit c66a8605da1ba1aaaaac57bc2722ee1b585d4c5d
Author: Kaito Sinclaire <ks@rosenthalcastle.org>
Date:   Fri Aug 9 08:04:59 2024 -0700

    DOOM, DOOM II: Update steam URLs (#3746)

commit ac7590e621be1662e9522022670c5949e0195cfa
Author: Mysteryem <Mysteryem@users.noreply.github.com>
Date:   Fri Aug 9 16:02:41 2024 +0100

    HK: fix iterating all worlds instead of only HK worlds in stage_pre_fill (#3750)

    Would cause generation to fail when generating with HK and another game.

    Mistake in 6803c373e5ff.

commit 30f97dd7dead5cad3a9d7a1eecf3737a210098c7
Author: Mysteryem <Mysteryem@users.noreply.github.com>
Date:   Fri Aug 9 13:25:39 2024 +0100

    Core: Speed up CollectionState.copy() using built-in copy methods (#3678)

    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.

commit 6e41c6067208d0286f56694f4281d03a0aaf6dad
Author: Mysteryem <Mysteryem@users.noreply.github.com>
Date:   Fri Aug 9 13:13:01 2024 +0100

    Core: Check parent_region.can_reach first in Location.can_reach (#3724)

    * 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>

commit 5efb3fd2b0450f68dc95f3b79a0f48746b5e732d
Author: Natalie Weizenbaum <nweiz@google.com>
Date:   Fri Aug 9 03:14:26 2024 -0700

    DS3: Version 3.0.0 (#3128)

    * 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

 …
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
affects: core Issues/PRs that touch core and may need additional validation. is: new game Pull requests for implementing new games into Archipelago. waiting-on: core-review Issue/PR has been peer-reviewed and is ready to be merged or needs input from a core maintainer.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants