docs: add common terms documentation to website (#680)
* docs: add common terms documentation to website * minor cleanup * some rewording and reformatting. * tighten up world definition clarity Co-authored-by: Rome Reginelli <mduo13@gmail.com> * Clarify seed definition a bit better Co-authored-by: Rome Reginelli <mduo13@gmail.com> * add text for "out of logic" and that slot names must be unique * rename common terms to glossary Co-authored-by: Rome Reginelli <mduo13@gmail.com>
This commit is contained in:
parent
5f2193f2e4
commit
61f751a1db
|
@ -141,6 +141,11 @@ def faq(lang):
|
||||||
return render_template("faq.html", lang=lang)
|
return render_template("faq.html", lang=lang)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/glossary/<string:lang>/')
|
||||||
|
def terms(lang):
|
||||||
|
return render_template("glossary.html", lang=lang)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/seed/<suuid:seed>')
|
@app.route('/seed/<suuid:seed>')
|
||||||
def view_seed(seed: UUID):
|
def view_seed(seed: UUID):
|
||||||
seed = Seed.get(id=seed)
|
seed = Seed.get(id=seed)
|
||||||
|
|
|
@ -49,6 +49,12 @@ If you are ready to start randomizing games, or want to start playing your favor
|
||||||
our discord server at the [Archipelago Discord](https://discord.gg/archipelago). There are always people ready to answer
|
our discord server at the [Archipelago Discord](https://discord.gg/archipelago). There are always people ready to answer
|
||||||
any questions you might have.
|
any questions you might have.
|
||||||
|
|
||||||
|
## What are some common terms I should know?
|
||||||
|
|
||||||
|
As randomizers and multiworld randomizers have been around for a while now there are quite a lot of common terms
|
||||||
|
and jargon that is used in conjunction by the communities surrounding them. For a lot of the terms that are more common
|
||||||
|
to Archipelago and its specific systems please see the [Glossary](/glossary/en).
|
||||||
|
|
||||||
## I want to add a game to the Archipelago randomizer. How do I do that?
|
## I want to add a game to the Archipelago randomizer. How do I do that?
|
||||||
|
|
||||||
The best way to get started is to take a look at our code on GitHub
|
The best way to get started is to take a look at our code on GitHub
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
# Multiworld Glossary
|
||||||
|
|
||||||
|
There are a lot of common terms used when playing in different game randomizer communities and in multiworld as well.
|
||||||
|
This document serves as a lookup for common terms that may be used by users in the community or in various other
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
## Item
|
||||||
|
Items are what get shuffled around in your world or other worlds that you then receive. This could be a sword, a stat
|
||||||
|
upgrade, a spell, or any other potential receivable for your game.
|
||||||
|
|
||||||
|
## Location
|
||||||
|
Locations are where items are placed in your game. Whenever you interact with a location, you or another player will
|
||||||
|
then receive an item. A location could be a chest, an enemy drop, a shop purchase, or any other interactable that can
|
||||||
|
contain items in your game.
|
||||||
|
|
||||||
|
## Check
|
||||||
|
A check is a common term for when you "check", or pick up, a location. In terms of Archipelago this is usually used for
|
||||||
|
when a player goes to a location and sends its item, or "checks" the location. Players will often reference their now
|
||||||
|
randomized locations as checks.
|
||||||
|
|
||||||
|
## Slot
|
||||||
|
A slot is the player name and number assigned during generation. The number of slots is equal to the number of players,
|
||||||
|
or "worlds", created. Each name must be unique as these are used to identify the slot user.
|
||||||
|
|
||||||
|
## World
|
||||||
|
World in terms of Archipelago can mean multiple things and is used interchangeably in many situations.
|
||||||
|
* During gameplay, a world is a single instance of a game, occupying one player "slot". However,
|
||||||
|
Archipelago allows multiple players to connect to the same slot; then those players can share a world
|
||||||
|
and complete it cooperatively. For games with native cooperative play, you can also play together and
|
||||||
|
share a world that way, usually with only one player connected to the multiworld.
|
||||||
|
* On the programming side, a world typically represents the package that integrates Archipelago with a
|
||||||
|
particular game. For example this could be the entire `worlds/factorio` directory.
|
||||||
|
|
||||||
|
## RNG
|
||||||
|
Acronym for "Random Number Generator." Archipelago uses its own custom Random object with a unique seed per generation,
|
||||||
|
or, if running from source, a seed can be supplied and this seed will control all randomization during generation as all
|
||||||
|
game worlds will have access to it.
|
||||||
|
|
||||||
|
## Seed
|
||||||
|
A "seed" is a number used to initialize a pseudorandom number generator. Whenever you generate a new game on Archipelago
|
||||||
|
this is a new "seed" as it has unique item placement, and you can create multiple "rooms" on the Archipelago site from a
|
||||||
|
single seed. Using the same seed results in the random placement being the same.
|
||||||
|
|
||||||
|
## Room
|
||||||
|
Whenever you generate a seed on the Archipelago website you will be put on a seed page that contains all the seed info
|
||||||
|
with a link to the spoiler if one exists and will show how many unique rooms exist per seed. Each room has its own
|
||||||
|
unique identifier that is separate from the seed. The room page is where you can find information to connect to the
|
||||||
|
multiworld and download any patches if necessary. If you have a particularly fun or interesting seed, and you want to
|
||||||
|
share it with somebody you can link them to this seed page, where they can generate a new room to play it! For seeds
|
||||||
|
generated with race mode enabled, the seed page will only show rooms created by the unique user so the seed page is
|
||||||
|
perfectly safe to share for racing purposes.
|
||||||
|
|
||||||
|
## Logic
|
||||||
|
Base behavior of all seeds generated by Archipelago is they are expected to be completable based on the requirements of
|
||||||
|
the settings. This is done by using "logic" in order to determine valid locations to place items while still being able
|
||||||
|
to reach said location without this item. For the purposes of the randomizer a location is considered "in logic" if you
|
||||||
|
can reach it with your current toolset of items or skills based on settings. Some players are able to obtain locations
|
||||||
|
"out of logic" by performing various glitches or tricks that the settings may not account for and tend to mention this
|
||||||
|
when sending out an item they obtained this way.
|
||||||
|
|
||||||
|
## Progression
|
||||||
|
Certain items will allow access to more locations and are considered progression items as they "progress" the seed.
|
||||||
|
|
||||||
|
## Trash
|
||||||
|
A term used for "filler" items that have no bearing on the generation and are either marginally useful for the player
|
||||||
|
or useless. These items can be very useful depending on the player but are never very important and as such are usually
|
||||||
|
termed trash.
|
||||||
|
|
||||||
|
## Burger King / BK Mode
|
||||||
|
A term used in multiworlds when a player is unable to continue to progress and is awaiting an item. The term came to be
|
||||||
|
after a player, allegedly, was unable to progress during a multiworld and went to Burger King while waiting to receive
|
||||||
|
items from other players.
|
||||||
|
|
||||||
|
* "Logical BK" is when the player is unable to progress according to the settings of their game but may still be able to do
|
||||||
|
things that would be "out of logic" by the generation.
|
||||||
|
|
||||||
|
* "Hard / full BK" is when the player is completely unable to progress even with tricks they may know and are unable to
|
||||||
|
continue to play, aside from doing something like killing enemies for experience or money.
|
||||||
|
|
||||||
|
## Sphere
|
||||||
|
Archipelago calculates the game playthrough by using a "sphere" system where it has a state for each player and checks
|
||||||
|
to see what the players are able to reach with their current items. Any location that is reachable with the current
|
||||||
|
state of items is a "sphere." For the purposes of Archipelago it starts playthrough calculation by distributing sphere 0
|
||||||
|
items which are items that are either forced in the player's inventory by the game or placed in the `start_inventory` in
|
||||||
|
their settings. Sphere 1 is then all accessible locations the players can reach with all the items they received from
|
||||||
|
sphere 0, or their starting inventory. The playthrough continues in this fashion calculating a number of spheres until
|
||||||
|
all players have completed their goal.
|
||||||
|
|
||||||
|
## Scouts / Scouting
|
||||||
|
In some games there are locations that have visible items even if the item itself is unobtainable at the current time.
|
||||||
|
Some games utilize a scouting feature where when the player "sees" the item it will give a free hint for the item in the
|
||||||
|
client letting the players know what the exact item is, since if the item was for that game it would know but the item
|
||||||
|
being foreign is a lot harder to represent visually.
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
window.addEventListener('load', () => {
|
||||||
|
const tutorialWrapper = document.getElementById('glossary-wrapper');
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
const ajax = new XMLHttpRequest();
|
||||||
|
ajax.onreadystatechange = () => {
|
||||||
|
if (ajax.readyState !== 4) { return; }
|
||||||
|
if (ajax.status === 404) {
|
||||||
|
reject("Sorry, the glossary page is not available in that language yet.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ajax.status !== 200) {
|
||||||
|
reject("Something went wrong while loading the glossary.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(ajax.responseText);
|
||||||
|
};
|
||||||
|
ajax.open('GET', `${window.location.origin}/static/assets/faq/` +
|
||||||
|
`glossary_${tutorialWrapper.getAttribute('data-lang')}.md`, true);
|
||||||
|
ajax.send();
|
||||||
|
}).then((results) => {
|
||||||
|
// Populate page with HTML generated from markdown
|
||||||
|
showdown.setOption('tables', true);
|
||||||
|
showdown.setOption('strikethrough', true);
|
||||||
|
showdown.setOption('literalMidWordUnderscores', true);
|
||||||
|
tutorialWrapper.innerHTML += (new showdown.Converter()).makeHtml(results);
|
||||||
|
adjustHeaderWidth();
|
||||||
|
|
||||||
|
// Reset the id of all header divs to something nicer
|
||||||
|
const headers = Array.from(document.querySelectorAll('h1, h2, h3, h4, h5, h6'));
|
||||||
|
const scrollTargetIndex = window.location.href.search(/#[A-z0-9-_]*$/);
|
||||||
|
for (let i=0; i < headers.length; i++){
|
||||||
|
const headerId = headers[i].innerText.replace(/[ ]/g,'-').toLowerCase()
|
||||||
|
headers[i].setAttribute('id', headerId);
|
||||||
|
headers[i].addEventListener('click', () =>
|
||||||
|
window.location.href = window.location.href.substring(0, scrollTargetIndex) + `#${headerId}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manually scroll the user to the appropriate header if anchor navigation is used
|
||||||
|
if (scrollTargetIndex > -1) {
|
||||||
|
try{
|
||||||
|
const scrollTarget = window.location.href.substring(scrollTargetIndex + 1);
|
||||||
|
document.getElementById(scrollTarget).scrollIntoView({ behavior: "smooth" });
|
||||||
|
} catch(error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
tutorialWrapper.innerHTML =
|
||||||
|
`<h2>This page is out of logic!</h2>
|
||||||
|
<h3>Click <a href="${window.location.origin}">here</a> to return to safety.</h3>`;
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,17 @@
|
||||||
|
{% extends 'pageWrapper.html' %}
|
||||||
|
|
||||||
|
{% block head %}
|
||||||
|
{% include 'header/grassHeader.html' %}
|
||||||
|
<title>Glossary</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/markdown.css") }}" />
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.9.1/showdown.min.js"
|
||||||
|
integrity="sha512-L03kznCrNOfVxOUovR6ESfCz9Gfny7gihUX/huVbQB9zjODtYpxaVtIaAkpetoiyV2eqWbvxMH9fiSv5enX7bw=="
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
<script type="application/ecmascript" src="{{ url_for('static', filename="assets/glossary.js") }}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div id="glossary-wrapper" data-lang="{{ lang }}" class="markdown">
|
||||||
|
<!-- Content generated by JavaScript -->
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -26,6 +26,7 @@
|
||||||
<li><a href="/user-content">User Content</a></li>
|
<li><a href="/user-content">User Content</a></li>
|
||||||
<li><a href="/weighted-settings">Weighted Settings Page</a></li>
|
<li><a href="/weighted-settings">Weighted Settings Page</a></li>
|
||||||
<li><a href="{{url_for('stats')}}">Game Statistics</a></li>
|
<li><a href="{{url_for('stats')}}">Game Statistics</a></li>
|
||||||
|
<li><a href="/common-terms">Common Multiworld Terms</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Game Info Pages</h2>
|
<h2>Game Info Pages</h2>
|
||||||
|
|
Loading…
Reference in New Issue