mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-03-22 15:45:04 -07:00
* 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>
85 lines
4.5 KiB
Python
85 lines
4.5 KiB
Python
from collections.abc import Mapping
|
|
from typing import Any
|
|
|
|
# Imports of base Archipelago modules must be absolute.
|
|
from worlds.AutoWorld import World
|
|
|
|
# Imports of your world's files must be relative.
|
|
from . import items, locations, options, regions, rules, web_world
|
|
|
|
# APQuest will go through all the parts of the world api one step at a time,
|
|
# with many examples and comments across multiple files.
|
|
# If you'd rather read one continuous document, or just like reading multiple sources,
|
|
# we also have this document specifying the entire world api:
|
|
# https://github.com/ArchipelagoMW/Archipelago/blob/main/docs/world%20api.md
|
|
|
|
|
|
# The world class is the heart and soul of an apworld implementation.
|
|
# It holds all the data and functions required to build the world and submit it to the multiworld generator.
|
|
# You could have all your world code in just this one class, but for readability and better structure,
|
|
# it is common to split up world functionality into multiple files.
|
|
# This implementation in particular has the following additional files, each covering one topic:
|
|
# regions.py, locations.py, rules.py, items.py, options.py and web_world.py.
|
|
# It is recommended that you read these in that specific order, then come back to the world class.
|
|
class APQuestWorld(World):
|
|
"""
|
|
APQuest is a minimal 8bit-era inspired adventure game with grid-like movement.
|
|
Good games don't need more than six checks.
|
|
"""
|
|
|
|
# The docstring should contain a description of the game, to be displayed on the WebHost.
|
|
|
|
# You must override the "game" field to say the name of the game.
|
|
game = "APQuest"
|
|
|
|
# The WebWorld is a definition class that governs how this world will be displayed on the website.
|
|
web = web_world.APQuestWebWorld()
|
|
|
|
# This is how we associate the options defined in our options.py with our world.
|
|
options_dataclass = options.APQuestOptions
|
|
options: options.APQuestOptions # Common mistake: This has to be a colon (:), not an equals sign (=).
|
|
|
|
# Our world class must have a static location_name_to_id and item_name_to_id defined.
|
|
# We define these in regions.py and items.py respectively, so we just set them here.
|
|
location_name_to_id = locations.LOCATION_NAME_TO_ID
|
|
item_name_to_id = items.ITEM_NAME_TO_ID
|
|
|
|
# There is always one region that the generator starts from & assumes you can always go back to.
|
|
# This defaults to "Menu", but you can change it by overriding origin_region_name.
|
|
origin_region_name = "Overworld"
|
|
|
|
# Our world class must have certain functions ("steps") that get called during generation.
|
|
# The main ones are: create_regions, set_rules, create_items.
|
|
# For better structure and readability, we put each of these in their own file.
|
|
def create_regions(self) -> None:
|
|
regions.create_and_connect_regions(self)
|
|
locations.create_all_locations(self)
|
|
|
|
def set_rules(self) -> None:
|
|
rules.set_all_rules(self)
|
|
|
|
def create_items(self) -> None:
|
|
items.create_all_items(self)
|
|
|
|
# Our world class must also have a create_item function that can create any one of our items by name at any time.
|
|
# We also put this in a different file, the same one that create_items is in.
|
|
def create_item(self, name: str) -> items.APQuestItem:
|
|
return items.create_item_with_correct_classification(self, name)
|
|
|
|
# For features such as item links and panic-method start inventory, AP may ask your world to create extra filler.
|
|
# The way it does this is by calling get_filler_item_name.
|
|
# For this purpose, your world *must* have at least one infinitely repeatable item (usually filler).
|
|
# You must override this function and return this infinitely repeatable item's name.
|
|
# In our case, we defined a function called get_random_filler_item_name for this purpose in our items.py.
|
|
def get_filler_item_name(self) -> str:
|
|
return items.get_random_filler_item_name(self)
|
|
|
|
# There may be data that the game client will need to modify the behavior of the game.
|
|
# This is what slot_data exists for. Upon every client connection, the slot's slot_data is sent to the client.
|
|
# slot_data is just a dictionary using basic types, that will be converted to json when sent to the client.
|
|
def fill_slot_data(self) -> Mapping[str, Any]:
|
|
# If you need access to the player's chosen options on the client side, there is a helper for that.
|
|
return self.options.as_dict(
|
|
"hard_mode", "hammer", "extra_starting_chest", "confetti_explosiveness", "player_sprite"
|
|
)
|