* Pulsars no longer count as basic anti-air for protoss.
* This is in response to player feedback that they were just too weak DPS-wise
* Haven's Fall (P) logic loosened slightly.
* Void rays are now a one-unit solution to the rule
* Scouts are now considered a one-unit solution to the rule
* Two-unit solutions are now considered standard rather than advanced
* Caladrius is now listed as an anti-muta unit for the two-unit solutions
* This was discussed in the #SC2-dev channel.
* Snarky did some testing and found that void rays were barely any worse than destroyers at handling mutas, and destroyers are already listed as a one-unit solution.
* Snarky also found that scouts could mostly solo the mission at low skill level
* Note that this rule only applies to the "beating the infestations" part of the mission; there are additional requirements for beating it, including a competent comp.
* The Host (T) now also can use SoA abilities if SoA presence is set to `any_race_lotv`, not just `everywhere`
* Update the descriptions for priority and exclude locations to be more clear.
* Revision on priority
* Moved my change over to the documentation instead of the generated yaml comment.
* update per vi feedback
* Trying a 2 sentence approach
* more details!
* Update options api.md
* Update options api.md
* APQuest
* Add confetti cannon
* ID change on enemy drop
* nevermind
* Write the apworld
* Actually implement hard mode
* split everything into multiple files
* Push out webworld into a file
* Comment
* Enemy health graphics
* more ruff rules
* graphics :)
* heal player when receiving health upgrade
* the dumbest client of all time
* Fix typo
* You can kinda play it now! Now we just need to render the game... :)))
* fix kvui imports again
* It's playable. Kind of
* oops
* Sounds and stuff
* exceptions for audio
* player sprite stuff
* Not attack without sword
* Make sure it plays correctly
* Collect behavior
* ruff
* don't need to clear checked_locations, but do need to still clear finished_game
* Connect calls disconnect, so this is not necessary
* more seemless reconnection
* Ok now I think it's correct
* Bgm
* Bgm
* minor adjustment
* More refactoring of graphics and sound
* add graphics
* Item column
* Fix enemies not regaining their health
* oops
* oops
* oops
* 6 health final boss on hard mode
* boss_6.png
* Display APQuest items correctly
* auto switch tabs
* some mypy stuff
* Intro song
* Confetti Cannon
* a bit more confetti work
* launcher component
* Graphics change
* graphics and cleanup
* fix apworld
* comment out horse and cat for now
* add docs
* copypasta
* ruff made my comment look unhinged
* Move that comment
* Fix typing and don't import kvui in nogui
* lmao that already exists I don't need to do it myself
* Must've just copied this from somewhere
* order change
* Add unit tests
* Notes about the client
* oops
* another intro song case
* Write WebWorld and setup guides
* Yes description provided
* thing
* how to play
* Music and Volume
* Add cat and horse player sprites
* updates
* Add hammer and breakable wall
* TODO
* replace wav with ogg
* Codeowners and readme
* finish unit tests
* lint
* Todid
* Update worlds/apquest/client/ap_quest_client.py
Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com>
* Update worlds/apquest/client/custom_views.py
Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com>
* Filler pattern
* __future__ annotations
* twebhost
* Allow wasd and arrow keys
* correct wording
* oops
* just say the website
* append instead of +=
* qwint is onto my favoritism
* kitty alias
* Add a comment about preplaced items for assertAccessDependency
* Use classvar_matrix instead of MultiworldTestBase
* actually remove multiworld stuff from those tests
* missed one more
* Refactor a bit more
* Fix getting of the user path
* Actually explain components
* Meh
* Be a bit clearer about what's what
* oops
* More comments in the regions.py file
* Nevermind
* clarify regions further
* I use too many brackets
* Ok I'm done fr
* simplify wording
* missing .
* Add precollected example
* add note about precollected advancements
* missing s
* APQuest sound rework
* Volume slider
* I forgot I made this
* a
* fix volume of jingles
* Add math trap to game (only works in play_in_console mode so far)
* Math trap in apworld and client side
* Fix background during math trap
* fix leading 0
* Sound and further ui improvements for Math Trap
* fix music bug
* rename apquest subfolder to game
* Move comment to where it belongs
* Clear up language around components (hopefully)
* Clear up what CommonClient is
* Reword some more
* Mention Archipelago (the program) explicitly
* Update worlds/apquest/docs/en_APQuest.md
Co-authored-by: Ixrec <ericrhitchcock@gmail.com>
* Explain a bit more why you would use classvar matrix
* reword the assert raises stuff
* the volume slider thing is no longer true
* german game page
* Be more clear about why we're overriding Item and Location
* default item classification
* logically considered -> relevant to logic ()
* Update worlds/apquest/items.py
Co-authored-by: Ixrec <ericrhitchcock@gmail.com>
* a word on the ambiguity of the word 'filler'
* more rewording
* amount -> number
* stress the necessity of appending to the multiworld itempool
* Update worlds/apquest/locations.py
Co-authored-by: Ixrec <ericrhitchcock@gmail.com>
* get_location_names_with_ids
* slight rewording of the new helper method
* add some words about creating known location+item pairs
* Add some more words to worlds/apqeust/options.py
* more words in options.py
* 120 chars (thanks Ixrec >:((( LOL)
* Less confusing wording about rules, hopefully?
* victory -> completion
* remove the immediate creation of the hammer rule on the option region entrance
* access rule performance
* Make all imports module-level in world.py
* formatting
* get rid of noqa RUF012 (and also disable the rule in my local ruff.toml
* move comment for docstring closer to docstring in another place
* advancement????
* Missing function type annotations
* pass mypy again (I don't love this one but all the alternatives are equally bad)
* subclass instead of override
* I forgor to remove these
* Get rid of classvar_matrix and instead talk about some other stuff
* protect people a bit from the assertAccessDependency nonsense
* reword a bit more
* word
* More accessdependency text
* More accessdependency text
* More accessdependency text
* More accessdependency text
* oops
* this is supposed to be absolute
* Add some links to docs
* that's called game now
* Add an archipelago.json and explain what it means
* new line who dis
* reorganize a bit
* ignore instead of skip
* Update archipelago.json
* She new on my line till I
* Update archipelago.json
* add controls tab
* new ruff rule? idk
* WHOOPS
* Pack graphics into fewer files
* annoying ruff format thing
* Cleanup + mypy
* relative import
* Update worlds/apquest/client/custom_views.py
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
* Update generate_math_problem.py
* Update worlds/apquest/game/player.py
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
---------
Co-authored-by: Duck <31627079+duckboycool@users.noreply.github.com>
Co-authored-by: Ixrec <ericrhitchcock@gmail.com>
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
3 logic issues:
* #3046 made it so that prizes were included in LttP's pre_fill items. It accounted for it in regular pre_fill, but missed stage_pre_fill.
* LttP defines a maximum number of heart pieces and heart containers logically within each difficulty. Item condensing did not account for this, and could reduce the number of heart pieces below the required amount logically. Notably, this makes some combination of settings much harder to generate, so another solution may end up ideal.
* Current logic rules do not properly account for the case of standard start and enemizer, requiring a large amount of items logically within a short number of locations. However, the behavior of Enemizer in this situation is well-defined, as the guards during the standard starting sequence are not changed. Thus the required items can be safely minimized.
* Core: Only error in playthrough generation if game is not beatable
The current flow of accessibility works like this:
```
if fulfills_accessibility fails:
if multiworld can be beaten:
log a warning
else:
raise Exception
if playthrough is enabled:
if any progression items are not reachable:
raise Exception
```
This means that if you do a generation where the game is beatable but some full players' items are not reachable, it doesn't crash on accessibility check, but then crashes on playthrough. This means that **whether it crashes depends on whether you have playthrough enabled or not**.
Imo, erroring on something accessibility-related is outside of the scope of create_playthrough. Create_playthrough only needs to care about whether it can fulfill its own goal - Building a minimal playthrough to everyone's victory.
The actual accessibility check should take care of the accessibility.
* Reword
* Simplify sentence
The "+" and "-" trigger operations modify sets/lists in-place, but
triggers could set a value to the same set/list for multiple slots using
weights.yaml.
This fix deep-copies all values set from new (trigger) weights to ensure
that the values do not get shared across multiple slots.