diff options
Diffstat (limited to 'apworld/__init__.py')
| -rw-r--r-- | apworld/__init__.py | 49 |
1 files changed, 44 insertions, 5 deletions
| diff --git a/apworld/__init__.py b/apworld/__init__.py index 4e5777a..8b2e42e 100644 --- a/apworld/__init__.py +++ b/apworld/__init__.py | |||
| @@ -1,18 +1,27 @@ | |||
| 1 | """ | 1 | """ |
| 2 | Archipelago init file for Lingo 2 | 2 | Archipelago init file for Lingo 2 |
| 3 | """ | 3 | """ |
| 4 | from BaseClasses import ItemClassification, Item | 4 | from BaseClasses import ItemClassification, Item, Tutorial |
| 5 | from worlds.AutoWorld import WebWorld, World | 5 | from worlds.AutoWorld import WebWorld, World |
| 6 | from .items import Lingo2Item | 6 | from .items import Lingo2Item, ANTI_COLLECTABLE_TRAPS |
| 7 | from .options import Lingo2Options | 7 | from .options import Lingo2Options |
| 8 | from .player_logic import Lingo2PlayerLogic | 8 | from .player_logic import Lingo2PlayerLogic |
| 9 | from .regions import create_regions | 9 | from .regions import create_regions |
| 10 | from .static_logic import Lingo2StaticLogic | 10 | from .static_logic import Lingo2StaticLogic |
| 11 | from .version import APWORLD_VERSION | ||
| 11 | 12 | ||
| 12 | 13 | ||
| 13 | class Lingo2WebWorld(WebWorld): | 14 | class Lingo2WebWorld(WebWorld): |
| 14 | rich_text_options_doc = True | 15 | rich_text_options_doc = True |
| 15 | theme = "grass" | 16 | theme = "grass" |
| 17 | tutorials = [Tutorial( | ||
| 18 | "Multiworld Setup Guide", | ||
| 19 | "A guide to playing Lingo 2 with Archipelago.", | ||
| 20 | "English", | ||
| 21 | "en_Lingo_2.md", | ||
| 22 | "setup/en", | ||
| 23 | ["hatkirby"] | ||
| 24 | )] | ||
| 16 | 25 | ||
| 17 | 26 | ||
| 18 | class Lingo2World(World): | 27 | class Lingo2World(World): |
| @@ -32,6 +41,8 @@ class Lingo2World(World): | |||
| 32 | static_logic = Lingo2StaticLogic() | 41 | static_logic = Lingo2StaticLogic() |
| 33 | item_name_to_id = static_logic.item_name_to_id | 42 | item_name_to_id = static_logic.item_name_to_id |
| 34 | location_name_to_id = static_logic.location_name_to_id | 43 | location_name_to_id = static_logic.location_name_to_id |
| 44 | item_name_groups = static_logic.item_name_groups | ||
| 45 | location_name_groups = static_logic.location_name_groups | ||
| 35 | 46 | ||
| 36 | player_logic: Lingo2PlayerLogic | 47 | player_logic: Lingo2PlayerLogic |
| 37 | 48 | ||
| @@ -51,13 +62,29 @@ class Lingo2World(World): | |||
| 51 | total_locations = sum(len(locs) for locs in self.player_logic.locations_by_room.values()) | 62 | total_locations = sum(len(locs) for locs in self.player_logic.locations_by_room.values()) |
| 52 | 63 | ||
| 53 | item_difference = total_locations - len(pool) | 64 | item_difference = total_locations - len(pool) |
| 65 | |||
| 66 | if self.options.trap_percentage > 0: | ||
| 67 | num_traps = int(item_difference * self.options.trap_percentage / 100) | ||
| 68 | item_difference = item_difference - num_traps | ||
| 69 | |||
| 70 | trap_names = [] | ||
| 71 | trap_weights = [] | ||
| 72 | for letter_name, weight in self.static_logic.letter_weights.items(): | ||
| 73 | trap_names.append(f"Anti {letter_name}") | ||
| 74 | trap_weights.append(weight) | ||
| 75 | |||
| 76 | bad_letters = self.random.choices(trap_names, weights=trap_weights, k=num_traps) | ||
| 77 | pool += [self.create_item(trap_name) for trap_name in bad_letters] | ||
| 78 | |||
| 54 | for i in range(0, item_difference): | 79 | for i in range(0, item_difference): |
| 55 | pool.append(self.create_item("Nothing")) | 80 | pool.append(self.create_item(self.get_filler_item_name())) |
| 56 | 81 | ||
| 57 | self.multiworld.itempool += pool | 82 | self.multiworld.itempool += pool |
| 58 | 83 | ||
| 59 | def create_item(self, name: str) -> Item: | 84 | def create_item(self, name: str) -> Item: |
| 60 | return Lingo2Item(name, ItemClassification.filler if name == "Nothing" else ItemClassification.progression, | 85 | return Lingo2Item(name, ItemClassification.filler if name == self.get_filler_item_name() else |
| 86 | ItemClassification.trap if name in ANTI_COLLECTABLE_TRAPS else | ||
| 87 | ItemClassification.progression, | ||
| 61 | self.item_name_to_id.get(name), self.player) | 88 | self.item_name_to_id.get(name), self.player) |
| 62 | 89 | ||
| 63 | def set_rules(self): | 90 | def set_rules(self): |
| @@ -65,11 +92,23 @@ class Lingo2World(World): | |||
| 65 | 92 | ||
| 66 | def fill_slot_data(self): | 93 | def fill_slot_data(self): |
| 67 | slot_options = [ | 94 | slot_options = [ |
| 68 | "victory_condition", "shuffle_doors", | 95 | "cyan_door_behavior", |
| 96 | "daedalus_roof_access", | ||
| 97 | "keyholder_sanity", | ||
| 98 | "shuffle_control_center_colors", | ||
| 99 | "shuffle_doors", | ||
| 100 | "shuffle_gallery_paintings", | ||
| 101 | "shuffle_letters", | ||
| 102 | "shuffle_symbols", | ||
| 103 | "victory_condition", | ||
| 69 | ] | 104 | ] |
| 70 | 105 | ||
| 71 | slot_data = { | 106 | slot_data = { |
| 72 | **self.options.as_dict(*slot_options), | 107 | **self.options.as_dict(*slot_options), |
| 108 | "version": [self.static_logic.get_data_version(), APWORLD_VERSION], | ||
| 73 | } | 109 | } |
| 74 | 110 | ||
| 75 | return slot_data | 111 | return slot_data |
| 112 | |||
| 113 | def get_filler_item_name(self) -> str: | ||
| 114 | return "A Job Well Done" | ||
