From 37c869f16ff6c1aaef82e256dc86057587bcdcb5 Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:11:52 -0400 Subject: [PATCH 1/2] . From bc8448c5b5967be8872a7a29dd3af51242a1e215 Mon Sep 17 00:00:00 2001 From: Exempt-Medic Date: Tue, 15 Oct 2024 13:45:22 -0400 Subject: [PATCH 2/2] Preliminary Review --- worlds/civ_6/Civ6Client.py | 14 +++++----- worlds/civ_6/CivVIInterface.py | 4 +-- worlds/civ_6/Container.py | 3 +-- worlds/civ_6/Data.py | 6 ++--- worlds/civ_6/DeathLink.py | 2 +- worlds/civ_6/Enum.py | 3 +++ worlds/civ_6/Items.py | 20 +++++++-------- worlds/civ_6/Locations.py | 6 ++--- worlds/civ_6/Options.py | 18 ++++++------- worlds/civ_6/Regions.py | 7 +++-- worlds/civ_6/Rules.py | 4 +-- worlds/civ_6/__init__.py | 8 +++--- worlds/civ_6/docs/en_Civilization VI.md | 34 ++++++++++++------------- worlds/civ_6/docs/setup_en.md | 14 +++++----- 14 files changed, 72 insertions(+), 71 deletions(-) diff --git a/worlds/civ_6/Civ6Client.py b/worlds/civ_6/Civ6Client.py index a84095bf2549..5d8b79de5088 100644 --- a/worlds/civ_6/Civ6Client.py +++ b/worlds/civ_6/Civ6Client.py @@ -2,7 +2,7 @@ import logging import os import traceback -from typing import Dict, List +from typing import Dict, List, Optional import zipfile from CommonClient import ClientCommandProcessor, CommonContext, get_base_parser, logger, server_loop, gui_enabled @@ -13,7 +13,7 @@ from .CivVIInterface import CivVIInterface, ConnectionState from .Enum import CivVICheckType from .Items import CivVIItemData, generate_item_table, get_item_by_civ_name -from .Locations import generate_era_location_table +from .Locations import CivVILocationData, generate_era_location_table from .TunerClient import TunerErrorException, TunerTimeoutException @@ -51,8 +51,8 @@ class CivVIContext(CommonContext): items_handling = 0b111 tuner_sync_task = None game_interface: CivVIInterface - location_name_to_civ_location = {} - location_name_to_id = {} + location_name_to_civ_location: Dict[str, CivVILocationData] = {} + location_name_to_id: Dict[str, int] = {} item_id_to_civ_item: Dict[int, CivVIItemData] = {} item_table: Dict[str, CivVIItemData] = {} processing_multiple_items = False @@ -118,7 +118,7 @@ class CivVIManager(GameManager): logging_pairs = [ ("Client", "Archipelago") ] - base_title = "Archipelago Civlization VI Client" + base_title = "Archipelago Civilization VI Client" self.ui = CivVIManager(self) self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") @@ -153,7 +153,7 @@ async def tuner_sync_task(ctx: CivVIContext): continue else: try: - if ctx.processing_multiple_items == True: + if ctx.processing_multiple_items: await asyncio.sleep(3) else: state = await ctx.game_interface.is_in_game() @@ -201,7 +201,7 @@ async def handle_checked_location(ctx: CivVIContext): await ctx.send_msgs([{"cmd": "LocationChecks", "locations": checked_location_ids}]) -async def handle_receive_items(ctx: CivVIContext, last_received_index_override: int = None): +async def handle_receive_items(ctx: CivVIContext, last_received_index_override: Optional[int] = None): try: last_received_index = last_received_index_override or await ctx.game_interface.get_last_received_index() if len(ctx.items_received) - last_received_index > 1: diff --git a/worlds/civ_6/CivVIInterface.py b/worlds/civ_6/CivVIInterface.py index aba4032bf083..51c1914a5ac8 100644 --- a/worlds/civ_6/CivVIInterface.py +++ b/worlds/civ_6/CivVIInterface.py @@ -1,6 +1,6 @@ from enum import Enum from logging import Logger -from typing import List +from typing import List, Optional from .Items import CivVIItemData from .TunerClient import TunerClient, TunerConnectionException, TunerTimeoutException @@ -15,7 +15,7 @@ class ConnectionState(Enum): class CivVIInterface: logger: Logger tuner: TunerClient - last_error: str = None + last_error: Optional[str] = None def __init__(self, logger: Logger): self.logger = logger diff --git a/worlds/civ_6/Container.py b/worlds/civ_6/Container.py index 268ef993b666..d2ea665ed4b5 100644 --- a/worlds/civ_6/Container.py +++ b/worlds/civ_6/Container.py @@ -75,8 +75,7 @@ def generate_new_items(world: 'CivVIWorld') -> str: """ Generates the XML for the new techs/civics as well as the blockers used to prevent players from researching their own items """ - locations: List[CivVILocation] = world.multiworld.get_locations( - world.player) + locations: List[CivVILocation] = world.multiworld.get_filled_locations(world.player) techs = [location for location in locations if location.location_type == CivVICheckType.TECH] civics = [location for location in locations if location.location_type == diff --git a/worlds/civ_6/Data.py b/worlds/civ_6/Data.py index 70899a652431..90d04c79b50b 100644 --- a/worlds/civ_6/Data.py +++ b/worlds/civ_6/Data.py @@ -2,7 +2,7 @@ import json import os import pkgutil -from typing import List +from typing import Dict, List _cache = {} @@ -18,7 +18,7 @@ def _get_data(key: str): @dataclass -class CivVIBoostData(): +class CivVIBoostData: Type: str EraType: str Prereq: List[str] @@ -41,7 +41,7 @@ def get_boosts_data() -> List[CivVIBoostData]: return boosts -def get_era_required_items_data() -> List[str]: +def get_era_required_items_data() -> Dict[str, List[str]]: return _get_data("era_required_items") diff --git a/worlds/civ_6/DeathLink.py b/worlds/civ_6/DeathLink.py index 3bf4ceef1d35..22ee579cfbd9 100644 --- a/worlds/civ_6/DeathLink.py +++ b/worlds/civ_6/DeathLink.py @@ -68,7 +68,7 @@ async def handle_check_deathlink(ctx: CommonContext): f"was tired of sitting in BK and decided to fight a {result} instead", f"purposely lost to a {result} as a cry for help", f"is wanting to remind everyone that they are here to have fun and not to win", - f"is reconisdering their pursuit of a domination victory", + f"is reconsidering their pursuit of a domination victory", f"had their plans toppled by a {result}", ] player = ctx.player_names[ctx.slot] diff --git a/worlds/civ_6/Enum.py b/worlds/civ_6/Enum.py index d814e05a12ec..498e9f29efab 100644 --- a/worlds/civ_6/Enum.py +++ b/worlds/civ_6/Enum.py @@ -1,4 +1,6 @@ from enum import Enum + + class EraType(Enum): ERA_ANCIENT = "ERA_ANCIENT" ERA_CLASSICAL = "ERA_CLASSICAL" @@ -10,6 +12,7 @@ class EraType(Enum): ERA_INFORMATION = "ERA_INFORMATION" ERA_FUTURE = "ERA_FUTURE" + class CivVICheckType(Enum): TECH = "TECH" CIVIC = "CIVIC" diff --git a/worlds/civ_6/Items.py b/worlds/civ_6/Items.py index fe612069fe9f..0667b19f1ef8 100644 --- a/worlds/civ_6/Items.py +++ b/worlds/civ_6/Items.py @@ -57,7 +57,7 @@ class FillerItemRarity(Enum): FILLER_DISTRIBUTION: Dict[FillerItemRarity, float] = { FillerItemRarity.RARE: 0.025, - FillerItemRarity.UNCOMMON: .2, + FillerItemRarity.UNCOMMON: 0.2, FillerItemRarity.COMMON: 0.775, } @@ -113,7 +113,7 @@ class CivVIItem(Item): civ_vi_id: int item_type: CivVICheckType - def __init__(self, item: CivVIItemData, player: int, classification: ItemClassification = None): + def __init__(self, item: CivVIItemData, player: int, classification: Optional[ItemClassification] = None): super().__init__(item.name, classification or item.classification, item.code, player) self.civ_vi_id = item.civ_vi_id self.item_type = item.item_type @@ -271,21 +271,21 @@ def generate_item_table() -> Dict[str, CivVIItemData]: progressive_items = get_flat_progressive_districts() - item_table = {} + item_table: Dict[str, CivVIItemData] = {} def get_id_base(): return len(item_table.keys()) - item_table = {**item_table, **_generate_tech_items(get_id_base(), required_items, progressive_items)} - item_table = {**item_table, **_generate_civics_items(get_id_base(), required_items, progressive_items)} - item_table = {**item_table, **_generate_progressive_district_items(get_id_base())} - item_table = {**item_table, **_generate_progressive_era_items(get_id_base())} - item_table = {**item_table, **_generate_goody_hut_items(get_id_base())} + item_table.update(**_generate_tech_items(get_id_base(), required_items, progressive_items)) + item_table.update(**_generate_civics_items(get_id_base(), required_items, progressive_items)) + item_table.update(**_generate_progressive_district_items(get_id_base())) + item_table.update(**_generate_progressive_era_items(get_id_base())) + item_table.update(**_generate_goody_hut_items(get_id_base())) return item_table -def get_items_by_type(item_type: CivVICheckType, item_table: Dict[str, CivVIItemData]) -> Dict[str, CivVIItemData]: +def get_items_by_type(item_type: CivVICheckType, item_table: Dict[str, CivVIItemData]) -> List[CivVIItemData]: """ Returns a list of items that match the given item type """ @@ -297,4 +297,4 @@ def get_random_filler_by_rarity(world: 'CivVIWorld', rarity: FillerItemRarity) - Returns a random filler item by rarity """ items = [item for item in get_filler_item_data().values() if item.rarity == rarity] - return items[world.random.randint(0, len(items) - 1)] + return world.random.choice(items) diff --git a/worlds/civ_6/Locations.py b/worlds/civ_6/Locations.py index 14b458e45b80..e8fc29691580 100644 --- a/worlds/civ_6/Locations.py +++ b/worlds/civ_6/Locations.py @@ -9,7 +9,7 @@ # Locs that should have progression items (keypoint techs/civics, ~1 per era) PRIORITY_LOCATIONS = [ - "TECH_ANCEINT_09", + "TECH_ANCIENT_09", "TECH_CLASSICAL_15", "TECH_MEDIEVAL_20", "TECH_RENAISSANCE_33", @@ -52,7 +52,7 @@ ] -class CivVILocationData(): +class CivVILocationData: game: str = "Civilization VI" name: str cost: int @@ -61,7 +61,7 @@ class CivVILocationData(): code: int era_type: EraType location_type: CivVICheckType - pre_reqs: List[str] + pre_reqs: Optional[List[str]] def __init__(self, name: str, cost: int, uiTreeRow: int, id: int, era_type: EraType, location_type: CivVICheckType, pre_reqs: Optional[List[str]] = None): self.name = name diff --git a/worlds/civ_6/Options.py b/worlds/civ_6/Options.py index 930ce229f469..9dc87801eb24 100644 --- a/worlds/civ_6/Options.py +++ b/worlds/civ_6/Options.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from Options import Choice, DeathLink, DefaultOnToggle, PerGameCommonOptions, Range, StartInventory, StartInventoryPool, Toggle +from Options import Choice, DeathLink, DefaultOnToggle, PerGameCommonOptions, Range, StartInventoryPool, Toggle class ProgressionStyle(Choice): @@ -18,12 +18,12 @@ class ProgressionStyle(Choice): class ShuffleGoodyHuts(DefaultOnToggle): - """Shuffles the goody hut rewards. Goody huts will only contain junk items and location checks are received sequentially (GOODY_HUT_1, GOODY_HUT_2, etc).""" + """Shuffles the goody hut rewards. Goody huts will only contain junk items and location checks are received sequentially (GOODY_HUT_1, GOODY_HUT_2, etc.).""" display_name = "Shuffle Goody Hut Rewards" class BoostSanity(Toggle): - """Boosts for Civics/Techs are location checks. Boosts can now be triggered even if the item has already been researched. If it is dependent upon a unit that is now obsolete, you can click toggle on/off the relevant tech in the tech tree.""" + """Boosts for Civics/Techs are location checks. Boosts can now be triggered even if the item has already been researched. If it is dependent upon a unit that is now obsolete, you can click to toggle on/off the relevant tech in the tech tree.""" display_name = "Boostsanity" @@ -33,7 +33,7 @@ class ExcludeMissableBoosts(Toggle): class ResearchCostMultiplier(Choice): - """Multiplier for research cost of techs and civics, higher values make research more expensive. Cheap = 0.5x, Expensive = 1.5x. Default is 1. """ + """Multiplier for research cost of techs and civics, higher values make research more expensive. Cheap = 0.5x, Expensive = 1.5x.""" display_name = "Tech/Civic Cost Multiplier" option_cheap = 0.5 option_default = 1 @@ -43,9 +43,9 @@ class ResearchCostMultiplier(Choice): class PreHintItems(Choice): """Controls if/what items in the tech/civics trees are pre-hinted for the multiworld. - All : All items in the tech & civics trees are pre-hinted. + All: All items in the tech & civics trees are pre-hinted. Progression items: Only locations in the trees containing progression items are pre-hinted. - No Junk: pre-hint the progression and useful items. + No Junk: Pre-hint the progression and useful items. None: No items are pre-hinted. """ display_name = "Tech/Civic Tree pre-hinted Items" @@ -62,12 +62,12 @@ class HideItemNames(Toggle): class InGameFlagProgressionItems(DefaultOnToggle): - """If enabled, an advisor icon will be added to any location that contains a progression item""" + """If enabled, an advisor icon will be added to any location that contains a progression item.""" display_name = "Advisor Indicates Progression Items" class DeathLinkEffect(Choice): - """What happens when a unit dies. Default is Unit Killed. + """What happens when a unit dies. Faith, and Gold will be decreased by the amount specified in 'Death Link Effect Percent'. Era score is decreased by 1. Any will select any of these options any time a death link is received.""" @@ -82,7 +82,7 @@ class DeathLinkEffect(Choice): class DeathLinkEffectPercent(Range): - """The percentage of the effect that will be applied. Only applicable for Gold and Faith effects. Default is 20%""" + """The percentage of the effect that will be applied. Only applicable for Gold and Faith effects.""" display_name = "Death Link Effect Percent" default = 20 range_start = 1 diff --git a/worlds/civ_6/Regions.py b/worlds/civ_6/Regions.py index 8e4a57301c5c..406a96aece1f 100644 --- a/worlds/civ_6/Regions.py +++ b/worlds/civ_6/Regions.py @@ -1,7 +1,7 @@ -from typing import TYPE_CHECKING, Dict, List +from typing import TYPE_CHECKING, Dict, List, Optional from BaseClasses import CollectionState, LocationProgressType, Region from .Data import get_era_required_items_data, get_progressive_districts_data -from .Items import format_item_name, get_item_by_civ_name +from .Items import CivVIItemData, format_item_name, get_item_by_civ_name from .Enum import CivVICheckType, EraType from .Locations import CivVILocation from .ProgressiveDistricts import get_flat_progressive_districts @@ -9,10 +9,9 @@ if TYPE_CHECKING: from . import CivVIWorld - from Items import CivVIItemData -def get_prereqs_for_era(end_era: EraType, exclude_progressive_items: bool = True, item_table: Dict[str, 'CivVIItemData'] = None) -> List['CivVIItemData']: +def get_prereqs_for_era(end_era: EraType, exclude_progressive_items: bool = True, item_table: Optional[Dict[str, CivVIItemData]] = None) -> List[CivVIItemData]: """Gets the specific techs/civics that are required for the specified era""" era_required_items = get_era_required_items_data()[end_era.value].copy() diff --git a/worlds/civ_6/Rules.py b/worlds/civ_6/Rules.py index 1678bfafbff7..b546cf35ed72 100644 --- a/worlds/civ_6/Rules.py +++ b/worlds/civ_6/Rules.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Callable, List, Dict +from typing import TYPE_CHECKING, List, Dict from BaseClasses import CollectionState from .Items import get_item_by_civ_name from .Data import get_boosts_data @@ -17,7 +17,7 @@ def create_boost_rules(world: 'CivVIWorld'): boost_locations = [location for location in world.location_table.values() if location.location_type == CivVICheckType.BOOST] for location in boost_locations: boost_data = next((boost for boost in boost_data_list if boost.Type == location.name), None) - world_location = world.multiworld.get_location(location.name, world.player) + world_location = world.get_location(location.name) forbid_item(world_location, "Progressive Era", world.player) if not boost_data or boost_data.PrereqRequiredCount == 0: continue diff --git a/worlds/civ_6/__init__.py b/worlds/civ_6/__init__.py index b9b7f3c96a16..a81772c9038b 100644 --- a/worlds/civ_6/__init__.py +++ b/worlds/civ_6/__init__.py @@ -98,9 +98,9 @@ def create_items(self) -> None: data = get_era_required_items_data() early_items = data[EraType.ERA_ANCIENT.value] early_locations = [location for location in self.location_table.values() if location.era_type == EraType.ERA_ANCIENT.value] - for item_name, data in self.item_table.items(): + for item_name, item_data in self.item_table.items(): # These item types are handled individually - if data.item_type in [CivVICheckType.PROGRESSIVE_DISTRICT, CivVICheckType.ERA, CivVICheckType.GOODY]: + if item_data.item_type in [CivVICheckType.PROGRESSIVE_DISTRICT, CivVICheckType.ERA, CivVICheckType.GOODY]: continue # If we're using progressive districts, we need to check if we need to create a different item instead @@ -118,7 +118,7 @@ def create_items(self) -> None: for location in early_locations: found_location = None try: - found_location = self.multiworld.get_location(location.name, self.player) + found_location = self.get_location(location.name) forbid_item(found_location, item_to_create, self.player) except KeyError: pass @@ -167,7 +167,7 @@ def post_fill(self) -> None: if location_data.location_type != CivVICheckType.CIVIC and location_data.location_type != CivVICheckType.TECH: continue - location: CivVILocation = self.multiworld.get_location(location_name, self.player) + location: CivVILocation = self.get_location(location_name) if not location.item or not show_flags.get(location.item.classification, False): continue diff --git a/worlds/civ_6/docs/en_Civilization VI.md b/worlds/civ_6/docs/en_Civilization VI.md index 8b738b41338e..d4664e70ea7b 100644 --- a/worlds/civ_6/docs/en_Civilization VI.md +++ b/worlds/civ_6/docs/en_Civilization VI.md @@ -1,13 +1,13 @@ -# Civlization 6 Archipelago +# Civilization 6 Archipelago ## What does randomization do to this game? -In Civilization VI, the tech and civic trees are both shuffled. This presents some interesting ways to play the game in a non-standard way. If you are feeling adventurous, you can enable the `boostsanity` option in order to really change up the way you normally would play a Civ game. Details on the option can be found in the "Boostsanity" section below. +In Civilization VI, the tech and civic trees are both shuffled. This presents some interesting ways to play the game in a non-standard way. If you are feeling adventurous, you can enable the "boostsanity" option in order to really change up the way you normally would play a Civ game. Details on the option can be found in the [Boostsanity](#boostsanity) section below. -There are a few changes that the Archipelago mod introduces in order to make this playable/fun. These are detailed in the __FAQ__ section below. +There are a few changes that the Archipelago mod introduces in order to make this playable/fun. These are detailed in the [__FAQ__](#faqs) section below. ## What is the goal of Civilization VI when randomized? -The goal of randomized Civlization VI remains the same. Pursue any victory type you have enabled in your game settings, the one you normally go for may or may not be feasible based on how things have been changed up! +The goal of randomized Civilization VI remains the same. Pursue any victory type you have enabled in your game settings, the one you normally go for may or may not be feasible based on how things have been changed up! ## Which items can be in another player's world? All technologies and civics can be found in another player's world. @@ -20,13 +20,13 @@ A short period after receiving an item, you will get a notification indicating y ## FAQs - Do I need the DLC to play this? - - Yes, you need both Rise & Fall and Gathering Storm. If there is enough interest then I can eventually add support for Archipellago runs that don't require both expansions. + - Yes, you need both Rise & Fall and Gathering Storm. If there is enough interest, then I can eventually add support for Archipelago runs that don't require both expansions. - Does this work with Multiplayer? - It does not and, despite my best efforts, probably won't until there's a new way for external programs to be able to interact with the game. -- Does my mod that reskins Barbarians as various Pro Wrestlers work with this?? +- Does my mod that reskins Barbarians as various Pro Wrestlers work with this? - Only one way to find out! Any mods that modify techs/civics will most likely cause issues, though. - "Help! I can't see any of the items that have been sent to me!" - - Both trees by default will show you the researchable Archipelago locations. To view the normal tree, you can click "Toggle Archipelago Tree" on the top left corner of the tree view. + - Both trees by default will show you the researchable Archipelago locations. To view the normal tree, you can click "Toggle Archipelago Tree" in the top-left corner of the tree view. - "Oh no! I received the Machinery tech and now instead of getting an Archer next turn, I have to wait an additional 10 turns to get a Crossbowman!" - Vanilla prevents you from building units of the same class from an earlier tech level after you have researched a later variant. For example, this could be problematic if someone unlocks Crossbowmen for you right out the gate since you won't be able to make Archers (which have a much lower production cost). Solution: You can now go in to the tech tree, click "Toggle Archipelago Tree" to view your unlocked techs, and then can click any tech you have unlocked to toggle whether it is currently active or not. @@ -35,25 +35,25 @@ Solution: You can now go in to the tech tree, click "Toggle Archipelago Tree" to In the event you lose one of your units in combat (this means captured units don't count), then you will send a death link event to the rest of your friends. - I enabled `progressive districts` but I have no idea techs/civics what items are locked behind progression now! - - Any technology or civic that grants you a new building in a district (or grants you the district itself) is now locked behind a progressive item. For example, `PROGRESSIVE_CAMPUS` would give you these items in the following order: - 1. `TECH_WRITING` - 2. `TECH_EDUCATION` + - Any technology or civic that grants you a new building in a district (or grants you the district itself) is now locked behind a progressive item. For example, `PROGRESSIVE_CAMPUS` would give you these items in the following order: + 1. `TECH_WRITING` + 2. `TECH_EDUCATION` 3. `TECH_CHEMISTRY` - - If you want to see the details around each item, you can review [this file](https://github.com/hesto2/civilization_vi_apworld/blob/main/data/progressive_districts.json) + - If you want to see the details around each item, you can review [this file](https://github.com/hesto2/civilization_vi_apworld/blob/main/data/progressive_districts.json). ## Boostsanity -Boostsanity takes all of the Eureka & Inspiration events and makes them location checks. This feature is the one to changeup the way Civilization is played in an AP multiworld/randomizer to date. What normally are mundane tasks that are passively collected now become a novel and interesting bucket list that you need to pay attention to in order to unlock items for yourself and others! -Boosts have logic associated with them in order to verify you can always reach the ones you need to, when you need to. One side effect of this is that when boostsanity is enabled, previously some "Useful" items are now flagged as "Progression" (Urbanization, Pottery, The Wheel, to name a few). +Boostsanity takes all of the Eureka & Inspiration events and makes them location checks. This feature is the one to change up the way Civilization is played in an AP multiworld/randomizer. What normally are mundane tasks that are passively collected now become a novel and interesting bucket list that you need to pay attention to in order to unlock items for yourself and others! +Boosts have logic associated with them in order to verify you can always reach the ones you need to, when you need to. One side effect of this is that when boostsanity is enabled, some previously "Useful" items are now flagged as "Progression" (Urbanization, Pottery, The Wheel, to name a few). ### Boostsanity FAQs -- Someone sent me a tech/civic and I'm worried I won't be able to boost it anymore! - - Fear not! The mod has been updated, and through a lot of wizardry 🧙‍♂️ you will be able to boost civics/techs that have already been received. Additionally the UI has been updated to show you whether they have been boosted or not after receiving them still. +- Someone sent me a tech/civic, and I'm worried I won't be able to boost it anymore! + - Fear not! Through a lot of wizardry 🧙‍♂️ you can boost civics/techs that have already been received. Additionally, the UI has been updated to show you whether they have been boosted or not after receiving them. - I need to kill a unit with a slinger/archer/musketman or some other obsolete unit I can't build anymore, how can I do this?? - Don't forget you can go into the Tech Tree and click on a Vanilla tech you've received in order to toggle it on/off. This is necessary in order to pursue some of the boosts if you receive techs in certain orders. -- Something happened and I'm not able to unlock the boost due to game rules! +- Something happened, and I'm not able to unlock the boost due to game rules! - A few scenarios you may worry about: "Found a religion", "Make an alliance with another player", "Develop an alliance to level 2", "Build a wonder from X Era", to name a few. Any boost that is "miss-able" has been flagged as an "Excluded" location and will not ever receive a progression item. For a list of how each boost is flagged, take a look [here](https://github.com/hesto2/civilization_vi_apworld/blob/main/data/boosts.json). - I'm worried that my `PROGRESSIVE_ERA` item is going to be stuck in a boost I won't have time to complete before my maximum unlocked era ends! - Due to the unpredictable timing of boosts and unlocking them, this could lead to a hard lock in certain scenarios. As a result, `PROGRESSIVE_ERA` items will never be located at a boost check. - There's too many boosts, how will I know which one's I should focus on?! - - In order to give a little more focus to all the boosts rather than just arbitrarily picking them at random, items in both of the vanilla trees will now have an advisor icon on them if it's associated boost contains a progression item. + - In order to give a little more focus to all the boosts rather than just arbitrarily picking them at random, items in both of the vanilla trees will now have an advisor icon on them if its associated boost contains a progression item. diff --git a/worlds/civ_6/docs/setup_en.md b/worlds/civ_6/docs/setup_en.md index 6e1e236287ff..f437b58fd956 100644 --- a/worlds/civ_6/docs/setup_en.md +++ b/worlds/civ_6/docs/setup_en.md @@ -1,16 +1,16 @@ # Setup Guide for Civilization VI Archipelago -This guide is meant to help you get up and running with Civlization VI in your Archipelago run. Note that this requires you to have both Rise & Fall as well as Gathering Storm installed. This will not work unless both of those DLCs are enabled. +This guide is meant to help you get up and running with Civilization VI in Archipelago. Note that this requires you to have both Rise & Fall and Gathering Storm installed. This will not work unless both of those DLCs are enabled. ## Requirements -The following are required in order to play Civ VI in Archipelago +The following are required in order to play Civ VI in Archipelago: - Windows OS (Firaxis does not support the necessary tooling for Mac, or Linux) -- Installed [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) v0.4.5 or higher.\ +- Installed [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) v0.4.5 or higher. -- The latest version of the [Civ VI AP Mod](https://github.com/hesto2/civilization_archipelago_mod). +- The latest version of the [Civ VI AP Mod](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). ## Enabling the tuner @@ -19,11 +19,11 @@ Depending on how you installed Civ 6 you will have to navigate to one of the fol - `YOUR_USER/Documents/My Games/Sid Meier's Civilization VI/AppOptions.txt` - `YOUR_USER/AppData/Local/Firaxis Games/Sid Meier's Civilization VI/AppOptions.txt` -Once you have located your `AppOptions.txt`, do a search for `Enable FireTuner`. Set `EnableTuner` to `1` instead of `0`. **NOTE**: While this is active, achievments will be disabled. +Once you have located your `AppOptions.txt`, do a search for `Enable FireTuner`. Set `EnableTuner` to `1` instead of `0`. **NOTE**: While this is active, achievements will be disabled. ## Mod Installation -1. Download and unzip the latest release of the mod from [github](https://github.com/hesto2/civilization_archipelago_mod/releases). +1. Download and unzip the latest release of the mod from [GitHub](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). 2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods` @@ -46,6 +46,6 @@ When configuring your game, make sure to start the game in the Ancient Era and l ## Troubleshooting -- If you are getting an error: `The remote computer refused the network connection`, or something else related to the client (or tuner) not being able to connect, it likely indicates the tuner is not actually enabled. One simple way to verify that it is enabled is, after completing the setup steps, to go Main Menu -> Options -> Look for an option named "Tuner" and verify it is set to "Enabled" +- If you are getting an error: "The remote computer refused the network connection", or something else related to the client (or tuner) not being able to connect, it likely indicates the tuner is not actually enabled. One simple way to verify that it is enabled is, after completing the setup steps, go to Main Menu → Options → Look for an option named "Tuner" and verify it is set to "Enabled" - If your game gets in a state where someone has sent you items or you have sent locations but these are not correctly replicated to the multiworld, you can run `/resync` from the Civ 6 client. This may take up to a minute depending on how many items there are.