Skip to content

Lingo: New game #1806

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

Merged
merged 170 commits into from
Nov 8, 2023
Merged
Show file tree
Hide file tree
Changes from 110 commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
15c83a3
Lingo: Initial pass at LL1 config
hatkirby Apr 10, 2023
1eddf00
Lingo: Deduped locations genned from doors
hatkirby Apr 11, 2023
6c9b28f
Lingo: Added backside entrances to Color Hallways
hatkirby Apr 11, 2023
ad72a4c
Lingo: It generates!
hatkirby Apr 11, 2023
d879819
Lingo: Fives are in Outside The Undeterred
hatkirby Apr 12, 2023
6fd98ff
Lingo: Handled colors field being a single value
hatkirby Apr 12, 2023
4c4ec0b
Lingo: Updated config documentation
hatkirby Apr 12, 2023
57b8aab
Lingo: Various code style changes
hatkirby Apr 12, 2023
e9f4e84
Lingo: Fixed location access rules
hatkirby Apr 12, 2023
804ea52
Lingo: Added some unit tests for progressive orange tower
hatkirby Apr 12, 2023
f092d08
Lingo: Wrote some documentation
hatkirby Apr 12, 2023
750a9e4
Lingo: Added panel and door IDs
hatkirby Apr 13, 2023
87ace8f
Lingo: Wrote script to validate level config file
hatkirby Apr 13, 2023
0c75ad6
Lingo: Game internal IDs are now sent in slot data
hatkirby Apr 13, 2023
0523277
Various data updates after first playtest
hatkirby Apr 14, 2023
ff027ef
Lingo: Sixes are required for PARANOID
hatkirby Apr 15, 2023
1201669
Lingo: Added death link option
hatkirby Apr 15, 2023
1caa0fb
Lingo: Fixed wrong Zero Door ID
hatkirby Apr 15, 2023
9f22dc4
Lingo: Events
hatkirby Apr 16, 2023
d86bf8d
Lingo: The Incomparable has extra requirements
hatkirby Apr 16, 2023
ca382c0
Lingo: ONE ROAD MANY TURNS only requires the four ordered panels
hatkirby Apr 16, 2023
db82e0c
Lingo: Room Room requires gray panels
hatkirby Apr 16, 2023
7690327
Lingo: Fixed Pilgrim Room being over-accessible
hatkirby Apr 16, 2023
46f8744
Lingo: Do not spawn Progressive Orange Tower w/o door shuffle
hatkirby Apr 16, 2023
50f5f51
Lingo: Combined sides of doors in symmetry room
hatkirby Apr 16, 2023
848c153
Lingo: Created painting items for Bold and Undeterred
hatkirby Apr 16, 2023
c42878b
Lingo: Fixed requirements for The Tenacious achievement
hatkirby Apr 16, 2023
b7a0a0a
Lingo: Blue is required for The Bearer
hatkirby Apr 16, 2023
661858f
Lingo: Added shuffle panels option
hatkirby Apr 17, 2023
18c9f6a
Lingo: Added seed for panel shuffling
hatkirby Apr 17, 2023
9538fe1
Lingo: Ok we didn't actually add the option before
hatkirby Apr 17, 2023
00a2f78
Lingo: Added painting shuffling
hatkirby Apr 18, 2023
a83ea41
Lingo: Implemented "simple doors"
hatkirby Apr 18, 2023
b1cf370
Lingo: Added more to the docs
hatkirby Apr 18, 2023
c22edb9
Lingo: The Red requires "black" in color shuffle
hatkirby Apr 18, 2023
f05fee6
Lingo: Generation in "The Colorful"
hatkirby Apr 18, 2023
9ceab81
Lingo: Make LOW required for the second room check
hatkirby Apr 19, 2023
101134d
Lingo: Removed "vanilla" orange tower option
hatkirby Apr 19, 2023
ec709cc
Lingo: Fixed painting logic issue in The Incomparable
hatkirby Apr 19, 2023
cd003a4
Lingo: Fixed a logic issue in Room Room
hatkirby Apr 20, 2023
e001578
Lingo: Handle arrow paintings in The Steady
hatkirby Apr 20, 2023
25cf390
Lingo: Edge case with painting shuffle could cause cycles
hatkirby Apr 20, 2023
76437a3
Lingo: Added a test case with many options set
hatkirby Apr 20, 2023
2db2793
Lingo: Minor syntax changes
hatkirby Apr 20, 2023
47e0e3a
Lingo: Fixed the pencil_painting2 hardcode
hatkirby Apr 21, 2023
040f734
Lingo: Split Wheelbarrow Hallway into four rooms
hatkirby Apr 21, 2023
5c06b45
Lingo: Minor documentation changes
hatkirby Apr 21, 2023
0076c3b
Lingo: Added setup guide
hatkirby Apr 21, 2023
986391b
Lingo: Handle special case of Eye Wall painting
hatkirby Apr 21, 2023
3ba68d8
Lingo: Renamed some items and locations
hatkirby Apr 22, 2023
6fc9f8b
Lingo: "Crossroads Doors" group
hatkirby Apr 22, 2023
aff7dd6
Lingo: Fix logic issue in Rhyme Room (Smiley)
hatkirby Apr 22, 2023
cd40f6c
Lingo: Should work as an apworld now
hatkirby Apr 22, 2023
28b7eef
Lingo: Added option to reduce location checks
hatkirby Apr 22, 2023
0fd51b1
Lingo: Randomized n/s/e/w afar paintings
hatkirby Apr 22, 2023
9bae8fb
Merge branch 'ArchipelagoMW:main' into lingo
hatkirby Apr 22, 2023
5dcc3bc
Lingo: Added traps
hatkirby Apr 22, 2023
473fa18
Lingo: Changed Yellow Backside logic
hatkirby Apr 23, 2023
b6ec14d
Lingo: Sanity check that required painting rooms are accessed
hatkirby Apr 24, 2023
33f7dcd
Lingo: Default reduce_checks to false
hatkirby Apr 27, 2023
b5d3ceb
Lingo: Progressive Art Gallery and Hallway Room
hatkirby Apr 28, 2023
fbedee7
Lingo: Junk item doors
hatkirby Apr 28, 2023
ff6e863
Lingo: BROOK NOD access change
hatkirby Apr 28, 2023
fb04bb3
Lingo: Fixed The Artistic rooms
hatkirby Apr 28, 2023
a00f49a
Lingo: Added game description
hatkirby Apr 28, 2023
351743c
Lingo: Potentially fixed generation error in some environments
hatkirby Apr 29, 2023
99de8d9
Lingo: Removed slashes from names
hatkirby May 1, 2023
9864236
Lingo: Added location for MASTERY panels
hatkirby May 1, 2023
6ede2f8
Lingo: Named Mastery Panels location
hatkirby May 3, 2023
e7af409
Lingo: Made Orange Tower less of a special case
hatkirby May 4, 2023
6b07549
Lingo: Force a good item onto the HI panel
hatkirby May 4, 2023
ed9db6d
Lingo: Fixed junk/trap item distribution
hatkirby May 4, 2023
1820ec8
Lingo: Added The Wanderer
hatkirby May 5, 2023
5a02b4a
Lingo: The Master achievements num is variable
hatkirby May 5, 2023
daf66d8
Lingo: Fix progressive orange towers being doubled
hatkirby May 6, 2023
ecef07a
Lingo: Added link to tracker in docs
hatkirby May 6, 2023
464d81e
Lingo: Removed event panels
hatkirby May 9, 2023
34c1627
Lingo: Refactored door rules a little bit
hatkirby May 9, 2023
66eb9d6
Merge branch 'ArchipelagoMW:main' into lingo
hatkirby May 10, 2023
c175c0b
Lingo: Broke region logic out into its own file
hatkirby May 11, 2023
5df8fdc
Merge branch 'lingo' of https://github.com/hatkirby/Archipelago into …
hatkirby May 11, 2023
2b9806a
Merge branch 'main' into lingo
hatkirby May 16, 2023
f5702b0
Lingo: Fix some logic issues related to The Observant
hatkirby May 17, 2023
6c21a3f
Lingo: Progressive Fearless
hatkirby May 18, 2023
886effb
Lingo: Topology is always present
hatkirby May 18, 2023
1de7467
Lingo: Added three locations to the lab
hatkirby May 18, 2023
1690e75
Lingo: Achievements in datafile are now named
hatkirby May 21, 2023
8544c91
Lingo: Undeterred / Directional Gallery door is not junk
hatkirby May 21, 2023
4454037
Lingo: Make Bearer SHORTCUT accessible from roof
hatkirby Jun 1, 2023
b5eb67c
Lingo: Entering through back of Wondrous is in logic
hatkirby Jun 4, 2023
725e16a
Lingo: First Floor access from Roof through sunwarp
hatkirby Jun 4, 2023
353cc8f
Lingo: Renamed Shortcut to Roof item
hatkirby Jun 4, 2023
842727f
Lingo: Reworked Knight/Night logic
hatkirby Jun 4, 2023
04064fd
Lingo: Red and yellow are not required for bearer SHORTCUT
hatkirby Jun 9, 2023
f56a2b4
Lingo: Knight Night -> Hidden Room entrance
hatkirby Jun 9, 2023
216fd8f
Lingo: Renamed some Number Hunt items
hatkirby Jun 9, 2023
f6e4b6e
Lingo: Add Atbash Trap
hatkirby Jun 16, 2023
2b10c7a
Lingo: Added 834283054 as a check
hatkirby Jun 18, 2023
d00ff60
Lingo: The Library is now a check
hatkirby Jun 18, 2023
9d6b58e
Lingo: Tweaked doc regarding wall sniping
hatkirby Jun 25, 2023
2a7f5c0
Lingo: Update documentation re wall snipes
hatkirby Jul 2, 2023
162d68b
Lingo: Fix relative import
hatkirby Jul 2, 2023
e8f3b95
Lingo: Cleaning up player_logic.py
hatkirby Jul 2, 2023
962cd5b
Merge branch 'main' into lingo
hatkirby Jul 2, 2023
0f80f92
Lingo: Room reachability events
hatkirby Jul 3, 2023
8a30e10
Lingo: items -> values
hatkirby Jul 3, 2023
cf3a7c7
Lingo: Gracefully handle plando interacting with good items list
hatkirby Jul 3, 2023
a4932d7
Lingo: Limit painting randomization iterations
hatkirby Jul 3, 2023
e639cbf
Lingo: Broke StaticLingoLogic into multiple functions
hatkirby Jul 3, 2023
86048ce
Lingo: Set data version
hatkirby Jul 3, 2023
2e82831
Lingo: Style fixes
hatkirby Jul 12, 2023
27af9be
Update worlds/lingo/test/__init__.py
hatkirby Jul 27, 2023
ca25ed2
Lingo: Merge server and client config files
hatkirby Jul 30, 2023
a35245f
Lingo: Added Level 2 check
hatkirby Jul 30, 2023
e2ab0e2
Lingo: Typo in options description
hatkirby Jul 30, 2023
bae6124
Lingo: Remove unnecessary slot data
hatkirby Aug 1, 2023
8f6ee53
Lingo: LEVEL 2 only activates as win condition
hatkirby Aug 2, 2023
2ae1009
Merge branch 'lingo' of https://github.com/hatkirby/Archipelago into …
hatkirby Aug 2, 2023
4e0ad56
Lingo: Tracker needs reduce_checks slot data
hatkirby Aug 3, 2023
6f09689
Lingo: Rename final Knight Night puzzle
hatkirby Aug 3, 2023
86c60d3
Lingo: Add puzzle skips
hatkirby Aug 4, 2023
19e9c1a
Lingo: Fix unit test harness
hatkirby Aug 4, 2023
63e9729
Lingo: Various suggestions
hatkirby Aug 4, 2023
1b9e5af
Merge branch 'main' into lingo
hatkirby Aug 4, 2023
0b994eb
Lingo: Updated fake pilgrimage
hatkirby Aug 8, 2023
846d10d
Lingo: Factored out get_option_value
hatkirby Aug 10, 2023
fef66ae
Lingo: Added panelsanity
hatkirby Aug 22, 2023
0331a21
Lingo: Reconfigured how LEVEL 2 rules work
hatkirby Aug 23, 2023
e8ed652
Lingo: Champion's Rest inner panels blocked by door
hatkirby Aug 26, 2023
0149d36
Lingo: Fixed incorrect Artistic painting IDs
hatkirby Sep 4, 2023
5106225
Lingo: Fixed Artistic painting orientations
hatkirby Sep 4, 2023
bdc2258
Lingo: Fixed cross tower logic
hatkirby Sep 7, 2023
8249ab7
Lingo: IDs are no longer assigned at runtime
hatkirby Sep 11, 2023
3b32eda
Lingo: Added documentation to assign_ids.rb
hatkirby Sep 12, 2023
84dedbf
Lingo: Reindexed location/item IDs
hatkirby Sep 17, 2023
25cc11c
Lingo: Fix progressive items being unnecessarily reindexed
hatkirby Sep 17, 2023
f1465d1
Lingo: Fix Wondrous -> Table entrance
hatkirby Sep 20, 2023
52d8113
Lingo: The Artistic (Hint Room) puzzles were updated
hatkirby Sep 20, 2023
9e44a66
Merge branch 'main' into lingo
hatkirby Sep 28, 2023
5cfb20c
Lingo: Unit test suggestions
hatkirby Sep 28, 2023
f61beb9
Lingo: Pass world object to sub functions
hatkirby Sep 28, 2023
fdcd15a
Lingo: Refactored out static class variables
hatkirby Sep 28, 2023
329b768
Lingo: Added more filler items
hatkirby Sep 28, 2023
4ccb641
Lingo: Cleaned up region connection code
hatkirby Sep 28, 2023
6478351
Lingo: Cleaned up redundant test harness stuff
hatkirby Sep 28, 2023
299d0b8
Lingo: Added early color hallways option
hatkirby Sep 28, 2023
ea3b20a
Merge branch 'main' into lingo
Berserker66 Oct 3, 2023
c36252f
Lingo: Fix failures on 3.8
hatkirby Oct 3, 2023
a57e63b
Merge branch 'lingo' of https://github.com/hatkirby/Archipelago into …
hatkirby Oct 3, 2023
058980d
Lingo: Update docs to new location of client & tracker
hatkirby Oct 3, 2023
e8fd2a8
Lingo: Addressed review comments
hatkirby Oct 10, 2023
4f9cfb3
Lingo: Removed a couple of extraneous comments
hatkirby Oct 10, 2023
99e3b16
Lingo: Fixed missing "global" statements
hatkirby Oct 10, 2023
6cf1b2c
Lingo: Clarify installation steps
hatkirby Oct 12, 2023
11935a3
Lingo: Raise exception when doors + reduced locations
hatkirby Oct 16, 2023
d3d1ec8
Lingo: Cellar replica panels are in Fifth Floor
hatkirby Oct 19, 2023
485e2d5
Lingo: Small logic updates
hatkirby Oct 19, 2023
6696d1d
Merge branch 'main' into lingo
hatkirby Oct 19, 2023
bf28250
Lingo: More tests
hatkirby Oct 19, 2023
a0b5d8a
Merge branch 'main' into lingo
hatkirby Oct 22, 2023
2e47c3c
Lingo: Updated to new options API
hatkirby Oct 22, 2023
524f55b
Lingo: First door is vanilla now
hatkirby Nov 4, 2023
2fb24aa
Lingo: Compatibility with update to The Ecstatic
hatkirby Nov 4, 2023
78ae6fb
Lingo: Removed other references to first door
hatkirby Nov 4, 2023
e9b510f
Proposed optimizations.
Nov 8, 2023
188da35
Removal of more unneeded `.value`s and fix lambda var capture
Nov 8, 2023
45c75e5
Add to CODEOWNERS and README.md
Nov 8, 2023
830ed47
Merge pull request #1 from ThePhar/lingo
hatkirby Nov 8, 2023
5313307
Optimize redundant one liner.
Nov 8, 2023
67213e5
whoops missed a spot
Nov 8, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4,428 changes: 4,428 additions & 0 deletions worlds/lingo/LL1.yaml

Large diffs are not rendered by default.

104 changes: 104 additions & 0 deletions worlds/lingo/Options.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
from typing import Dict, Union
from BaseClasses import MultiWorld
from Options import Toggle, Option, Choice, DefaultOnToggle, Range


class ShuffleDoors(Choice):
"""If on, opening doors will require their respective "keys".
In "simple", doors are sorted into logical groups, which are all opened by receiving an item.
In "complex", the items are much more granular, and will usually only open a single door each."""
display_name = "Shuffle Doors"
option_none = 0
option_simple = 1
option_complex = 2


class ProgressiveOrangeTower(DefaultOnToggle):
"""When "Shuffle Doors" is on, this setting governs the manner in which the Orange Tower floors open up.
If off, there is an item for each floor of the tower, and each floor's item is the only one needed to access that floor.
If on, there are six progressive items, which open up the tower from the bottom floor upward.
"""
display_name = "Progressive Orange Tower"


class ReduceChecks(Toggle):
"""When "Shuffle Doors" is off, there are far more location checks than there are items.
Enabling reduce checks will remove many of the locations that are associated with opening doors.
This option is ignored if "Shuffle Doors" is on."""
display_name = "Reduce Checks"


class ShuffleColors(Toggle):
"""If on, an item is added to the pool for every puzzle color (besides White).
You will need to unlock the requisite colors in order to be able to solve puzzles of that color."""
display_name = "Shuffle Colors"


class ShufflePanels(Choice):
"""If on, the puzzles on each panel are randomized.
On "rearrange", the puzzles are the same as the ones in the base game, but are placed in different areas."""
display_name = "Shuffle Panels"
option_none = 0
option_rearrange = 1


class ShufflePaintings(Toggle):
"""If on, the destination, location, and appearance of the painting warps in the game will be randomized."""
display_name = "Shuffle Paintings"


class VictoryCondition(Choice):
"""Change the victory condition."""
display_name = "Victory Condition"
option_the_end = 0
option_the_master = 1


class MasteryAchievements(Range):
"""The number of achievements required to unlock THE MASTER.
In the base game, 21 achievements are needed.
If you include The Scientific and The Unchallenged, which are in the base game but are not counted for mastery, 23 would be required.
If you include the custom achievement (The Wanderer), 24 would be required.
"""
display_name = "Mastery Achievements"
range_start = 1
range_end = 24
default = 21


class TrapPercentage(Range):
"""Replaces junk items with traps, at the specified rate."""
display_name = "Trap Percentage"
range_start = 0
range_end = 100
default = 20


class DeathLink(Toggle):
"""If on: Whenever another player on death link dies, you will be returned to the starting room."""
display_name = "Death Link"


lingo_options: Dict[str, type] = {
"shuffle_doors": ShuffleDoors,
"progressive_orange_tower": ProgressiveOrangeTower,
"reduce_checks": ReduceChecks,
"shuffle_colors": ShuffleColors,
"shuffle_panels": ShufflePanels,
"shuffle_paintings": ShufflePaintings,
"victory_condition": VictoryCondition,
"mastery_achievements": MasteryAchievements,
"trap_percentage": TrapPercentage,
"death_link": DeathLink
}


def get_option_value(world: MultiWorld, player: int, name: str) -> Union[bool, int]:
option = getattr(world, name, None)

if option is None:
return 0

if issubclass(lingo_options[name], Toggle):
return bool(option[player].value)
return option[player].value
149 changes: 149 additions & 0 deletions worlds/lingo/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
"""
Archipelago init file for Lingo
"""
import typing

from BaseClasses import Region, Location, MultiWorld, Item, Entrance, Tutorial, ItemClassification
from worlds.AutoWorld import World, WebWorld
from .static_logic import StaticLingoLogic, Room, RoomEntrance
from .items import LingoItem, StaticLingoItems
from .locations import LingoLocation, StaticLingoLocations
from .Options import lingo_options, get_option_value
from .testing import LingoTestOptions
from worlds.generic.Rules import set_rule
from .rules import LingoLogic, set_rules
from .player_logic import LingoPlayerLogic
from .regions import create_regions
from math import floor


class LingoWebWorld(WebWorld):
theme = "grass"
tutorials = [Tutorial(
"Multiworld Setup Guide",
"A guide to playing Lingo with Archipelago.",
"English",
"setup_en.md",
"setup/en",
["hatkirby"]
)]


class LingoWorld(World):
"""
Lingo is a first person indie puzzle game in the vein of The Witness. You find yourself in a mazelike, non-Euclidean
world filled with 800 word puzzles that use a variety of different mechanics.
"""
game = "Lingo"
web = LingoWebWorld()

base_id = 444400
topology_present = True
data_version = 1

static_logic = StaticLingoLogic()
static_items = StaticLingoItems(base_id)
static_locat = StaticLingoLocations(base_id)
option_definitions = lingo_options

item_name_to_id = {
name: data.code for name, data in static_items.ALL_ITEM_TABLE.items()
}
location_name_to_id = {
name: data.code for name, data in static_locat.ALL_LOCATION_TABLE.items()
if data.code is not None
}

# This is just used for unit testing. It should remain at the default values for actual play.
test_options: LingoTestOptions = LingoTestOptions()

def _get_slot_data(self):
return {
'door_ids_by_item_id': {
data.code: data.door_ids for data in self.static_items.ALL_ITEM_TABLE.values()
if data.code is not None and len(data.door_ids) > 0
},
'painting_ids_by_item_id': {
data.code: data.painting_ids for data in self.static_items.ALL_ITEM_TABLE.values()
if data.code is not None and len(data.painting_ids) > 0
},
'panel_ids_by_location_id': {
data.code: data.panel_ids() for data in self.static_locat.ALL_LOCATION_TABLE.values()
if data.code is not None
},
'seed': self.multiworld.per_slot_randoms[self.player].randint(0, 1000000),
}

def generate_early(self):
self.player_logic = LingoPlayerLogic(self.multiworld, self.player, self.static_logic, self.test_options)

def create_regions(self):
create_regions(self.multiworld, self.player, self.static_logic, self.player_logic)

def create_items(self):
pool = []

for name in self.player_logic.REAL_ITEMS:
new_item = self.create_item(name)
pool.append(new_item)

for location, item in self.player_logic.EVENT_LOC_TO_ITEM.items():
event_item = LingoItem(item, ItemClassification.progression, None, player=self.player)
location_obj = self.multiworld.get_location(location, self.player)
location_obj.place_locked_item(event_item)

if self.player_logic.FORCED_GOOD_ITEM != "":
new_item = self.create_item(self.player_logic.FORCED_GOOD_ITEM)
location_obj = self.multiworld.get_location("Starting Room - HI", self.player)
location_obj.place_locked_item(new_item)

item_difference = len(self.player_logic.REAL_LOCATIONS) - len(pool)
if item_difference > 0:
trap_percentage = get_option_value(self.multiworld, self.player, "trap_percentage")
traps = floor(item_difference * trap_percentage / 100.0)
non_traps = item_difference - traps

for i in range(0, non_traps):
pool.append(self.create_item("Nothing"))

if traps > 0:
traps_list = ["Slowness Trap", "Iceland Trap", "Atbash Trap"]

for i in range(0, traps):
pool.append(self.create_item(traps_list[i % len(traps_list)]))

self.multiworld.itempool += pool

def create_item(self, name: str) -> Item:
item = StaticLingoItems.ALL_ITEM_TABLE[name]

if item.progression:
classification = ItemClassification.progression
elif item.trap:
classification = ItemClassification.trap
else:
classification = ItemClassification.filler

new_item = LingoItem(name, classification, item.code, player=self.player)
return new_item

def set_rules(self):
set_rules(self.multiworld, self.player, self.player_logic)

self.multiworld.completion_condition[self.player] = \
lambda state: state.has("Victory", self.player)

def fill_slot_data(self):
slot_data = self._get_slot_data()

for option_name in lingo_options:
slot_data[option_name] = get_option_value(self.multiworld, self.player, option_name)

if get_option_value(self.multiworld, self.player, "shuffle_paintings"):
slot_data["painting_entrance_to_exit"] = self.player_logic.PAINTING_MAPPING
slot_data["paintings"] = {
painting.id: {"orientation": painting.orientation, "move": painting.move}
for painting in self.static_logic.PAINTINGS.values()
}

return slot_data
43 changes: 43 additions & 0 deletions worlds/lingo/docs/en_Lingo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Lingo

## Where is the settings page?

The [player settings page for this game](../player-settings) contains all the options you need to configure and export a
config file.

## What does randomization do to this game?

There are a couple of modes of randomization currently available, and you can pick and choose which ones you would like
to use.

* **Door shuffle**: There are many doors in the game, which are opened by completing a set of panels. With door shuffle
on, the doors become items and only open up once you receive the corresponding item. The panel sets that would
ordinarily open the doors become locations.

* **Color shuffle**: There are ten different colours of puzzle in the game, each representing a different mechanic. With
color
shuffle on, you would start with only access to white puzzles. Puzzles of other colours will require you to receive an
item in order to solve them (e.g. you can't solve any red puzzles until you receive the "Red" item).

* **Panel shuffle**: Panel shuffling replaces the puzzles on each panel with different ones. So far, the only mode of
panel shuffling is "rearrange" mode, which simply shuffles the already-existing puzzles from the base game onto
different panels.

* **Painting shuffle**: This randomizes the appearance of the paintings in the game, as well as which of them are warps,
and the locations that they warp you to. It is the equivalent of an entrance randomizer in another game.

## What is a "check" in this game?

Most panels / panel sets that open a door are now location checks, even if door shuffle is not enabled. Various other
puzzles are also location checks, including the achievement panels for each area.

## What about wall snipes?

"Wall sniping" refers to the fact that you are able to solve puzzles on the other side of opaque walls. This randomizer
does not change how wall snipes work, but it will never require the use of them. There are three puzzles from the base
game that you would ordinarily be expected to wall snipe. The randomizer moves these panels out of the wall or otherwise
reveals them so that a snipe is not necessary.

Because of this, all wall snipes are considered out of logic. This includes sniping The Bearer's MIDDLE while standing
outside The Bold, sniping The Colorful without opening all of the color doors, and sniping WELCOME from next to WELCOME
BACK.
38 changes: 38 additions & 0 deletions worlds/lingo/docs/setup_en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Lingo Randomizer Setup

## Required Software

- [Lingo](https://store.steampowered.com/app/1814170/Lingo/)
- [Lingo Archipelago Randomizer](https://github.com/hatkirby/lingo-archipelago/releases)

## Optional Software

- [Archipelago Text Client](https://github.com/ArchipelagoMW/Archipelago/releases)
- [Lingo AP Tracker](https://github.com/hatkirby/lingo-ap-tracker/releases)

## Installation

1. Download the Lingo Archipelago Randomizer from the above link.
2. Open up Lingo, go to settings, and click View Game Data. This should open up a folder in Windows Explorer.
3. Unzip the contents of the randomizer into the "maps" folder.
4. Installation complete! You may have to click Return to go back to the main menu and then click Settings again in
order to get the randomizer to show up in the level selection list.

## Joining a Multiworld game

1. Launch Lingo
2. Click on Settings, and then Level. Choose Archipelago from the list.
3. Start a new game. Leave the name field blank (anything you type in will be ignored).
4. Enter the Archipelago address, slot name, and password into the fields.
5. Press Connect.
6. Enjoy!

To continue an earlier game, you can perform the exact same steps as above. You do not have to re-select Archipelago in
the level selection screen if you were using Archipelago the last time you launched the game.

In order to play the base game again, simply return to the level selection screen and choose Level 1 (or whatever else
you want to play). The randomizer will not affect gameplay unless you launch it by starting a new game while it is
selected in the level selection screen, so it is safe to play the game normally while the client is installed.

**Note**: Running the randomizer modifies the game's memory. If you want to play the base game after playing the randomizer,
you need to restart Lingo first.
Loading