Add Raft to Archipelago (#174)
This commit is contained in:
parent
1e5c4c9b7c
commit
4291912577
|
@ -0,0 +1,31 @@
|
||||||
|
# Raft
|
||||||
|
|
||||||
|
## Where is the settings page?
|
||||||
|
The player settings page for this game is located <a href="../player-settings">here</a>. It contains all the options
|
||||||
|
you need to configure and export a config file.
|
||||||
|
|
||||||
|
## What does randomization do to this game?
|
||||||
|
All of the items from the Research Table, as well as all the note/blueprint pickups from story islands, are changed to location checks. Blueprint items themselves are never given. The Research Table recipes will *remove* the researched items for that recipe once learned, meaning many more resources must be put into the Research Table to get all the unlocks from it.
|
||||||
|
|
||||||
|
## What is the goal of Raft when randomized?
|
||||||
|
The goal remains the same: To pick up the note that has the frequency for the next unreleased story island from Tangaroa.
|
||||||
|
|
||||||
|
## Which items can be in another player's world?
|
||||||
|
All of the craftable items from the Research Table and Blueprints, as well as frequencies. Since there are more locations in Raft than there are items to receive, Resource Packs with basic earlygame materials and/or duplicate items may be added to the item pool (configurable).
|
||||||
|
|
||||||
|
## Which notable unlocks are not randomized?
|
||||||
|
Most of the story island quests (actions that unlock new areas on the island) remain unchanged. There are three exceptions: The Balboa Island Relay Station quest, the Caravan Island zipline parts quest, and the Caravan Island battery charger quest have all been changed to an Archipelago unlock, as the rewards from these are craftable items or frequencies.
|
||||||
|
Craftable items like the Machete are mixed into the Archipelago item pool, however quest items like Tape or Berries will function the same.
|
||||||
|
Decoration Packages are unchanged.
|
||||||
|
|
||||||
|
## What does another world's item look like in Raft?
|
||||||
|
Researches and pickups remain visually unchanged, regardless of what the unlock is.
|
||||||
|
|
||||||
|
## When the player receives an item, what happens?
|
||||||
|
A Raft notification will appear with the item information. The unlock will also appear in the chat. Unlocks that would normally give you the item (eg Machete) will NOT give it to you, but must instead be crafted.
|
||||||
|
|
||||||
|
## Are there any limitations compared to vanilla Raft?
|
||||||
|
- Mods that add new researchable technologies, modify story islands, or give items like blueprints are likely incompatible with Raftipelago.
|
||||||
|
- Some mods that add items that are always craftable (eg don't add them to the Research Table) may be compatible.
|
||||||
|
- Mods that do not affect items, notes, blueprints, or story islands have a good chance of being compatible with Raftipelago
|
||||||
|
- No mods have been comprehensively tested or verified to work with Raftipelago. Use at your own risk.
|
|
@ -0,0 +1,89 @@
|
||||||
|
# Raft Randomizer Setup Guide
|
||||||
|
|
||||||
|
## Required Software
|
||||||
|
|
||||||
|
- [Raft](https://store.steampowered.com/app/648800/Raft/)
|
||||||
|
- [Raft Mod Loader](https://www.raftmodding.com/loader) ("*RML*")
|
||||||
|
- [Raftipelago mod](https://www.raftmodding.com/mods/raftipelago)
|
||||||
|
|
||||||
|
## Installation Procedures
|
||||||
|
|
||||||
|
1. Install Raft. The currently-supported Raft version is Update 13: The Renovation Update. If you plan on playing Raft mainly with Archipelago, it's recommended to disable Raft auto-updating through Steam, as there is no beta channel to get old builds.
|
||||||
|
|
||||||
|
2. Install RML.
|
||||||
|
|
||||||
|
3. Install the Raftipelago mod from the Raft Modding website. You should open the auto-installation link on the webpage through RML. Alternatively, you can download the .rmod file and place it in the Mods folder manually.
|
||||||
|
|
||||||
|
4. Open RML and click Play. If you've already installed it, the shortcut in the Start Menu is called "RMLLauncher.exe". Raft should start.
|
||||||
|
|
||||||
|
5. Open the RML menu. This should open automatically when Raft first loads. If it does not, and you see RML information in the top center of the Raft main menu, press F9 to open it.
|
||||||
|
|
||||||
|
6. Navigate to the "Mod manager" tab in the left-hand menu.
|
||||||
|
|
||||||
|
7. Click on the plug icon for Raftipelago to load the mod.
|
||||||
|
|
||||||
|
## Installation Troubleshooting
|
||||||
|
|
||||||
|
You can press F10 to open the console to view any errors when loading the mod.
|
||||||
|
|
||||||
|
### DLL/Reflection/Image errors
|
||||||
|
|
||||||
|
Restart Raft and try again. These should be ephemeral errors.
|
||||||
|
|
||||||
|
### RML says to start Raft through Steam
|
||||||
|
|
||||||
|
If this happens, then RML is configured to only inject into an existing instance of Raft, rather than try and start a new one.
|
||||||
|
|
||||||
|
You can either:
|
||||||
|
- Click "Play" after Raft has loaded into the main menu
|
||||||
|
- Uncheck the box next to the "Disable Automatic Game Start" setting in the Settings menu then click Play.
|
||||||
|
|
||||||
|
### RML doesn't do anything when I click Play
|
||||||
|
|
||||||
|
If this happens, then RML is configured to only start a new instance of Raft, then inject into that specific instance. This also means that RML has detected an instance of Raft is already running, and will not start a new one.
|
||||||
|
|
||||||
|
You can either:
|
||||||
|
- Close the existing instance of Raft then click Play
|
||||||
|
- Check the box next to the "Disable Automatic Game Start" setting in the Settings menu then click Play.
|
||||||
|
|
||||||
|
## Joining a MultiWorld Game
|
||||||
|
|
||||||
|
1. Ensure you're on the Main Menu with Raftipelago loaded.
|
||||||
|
|
||||||
|
2. Open the Debug Console by pressing F10.
|
||||||
|
|
||||||
|
3. Type */connect {serverAddress} {username} {password}* into the console and hit Enter.
|
||||||
|
- Example: */connect archipelago.gg:12345 SunnyBat*
|
||||||
|
- serverAddress must not contain spaces.
|
||||||
|
- If your username or password contains spaces, surround that value with quotation marks ("). Adding quotation marks even when not necessary (eg "SunnyBat") is fine.
|
||||||
|
- If your username or password starts with a quotation mark, surround the value with an additional set of quotation marks (eg the value *"myP@s$w0rD* would be entered as *""myP@s$w0rD"*).
|
||||||
|
|
||||||
|
4. Start a new game or load an existing one.
|
||||||
|
- Raftipelago save games are marked as *incompatible* with vanilla Raft. This means when Raftipelago is not loaded, saves made with Raftipelago will show as corrupt/unselectable.
|
||||||
|
- Avoid using an existing game that was not created with your current run of Raftipelago (either vanilla or a different Raftipelago run). It will work, but if anything is unlocked, it will be automatically registered with Archipelago once the world is loaded. This is irreversible.
|
||||||
|
|
||||||
|
5. You can disconnect from an Archipelago server by typing */disconnect confirmDisconnect* into the console and hitting Enter.
|
||||||
|
|
||||||
|
## Multiplayer Raft
|
||||||
|
|
||||||
|
You're able to have multiple Raft players on a single Raftipelago world. This will work, with a few notes:
|
||||||
|
- Only the player that creates/loads the world can connect to Archipelago (this is the "host" of the Raft world). Other players do not need to connect; everything will be routed through the the host.
|
||||||
|
- Resource Packs are only received by the host and any other players connected to the Raft world when the resource pack is received.
|
||||||
|
- Players other than the host will be labeled as a "Raft Player (Steam name)" when using ingame chat, which will be routed through Archipelago chat.
|
||||||
|
- Ingame chat will only work when the host is connected to the Archipelago server.
|
||||||
|
|
||||||
|
## Game Troubleshooting
|
||||||
|
|
||||||
|
### The "Load game" button is disabled for my world / my world is corrupt
|
||||||
|
|
||||||
|
Be sure that you click the "Load game" button **after** you load Raftipelago. You can click the Load Game button again to reload all of the saves in your folder (there is no need to restart Raft if the mod loaded successfully).
|
||||||
|
|
||||||
|
### I'm certain I'm doing things correctly, but the world is still not loadable
|
||||||
|
|
||||||
|
You can bypass Raftipelago world verification checks by loading a backup of the world. If the backup is not loadable, the world is corrupted.
|
||||||
|
|
||||||
|
In the future, be sure that when you save the game, the Raftipelago mod is loaded.
|
||||||
|
|
||||||
|
### I disconnected from the server! What do I do to reconnect?
|
||||||
|
|
||||||
|
Open the console with F10 and type the */connect* command with your server/username/password in again. You do not need to save+quit to the main menu beforehand.
|
|
@ -279,6 +279,26 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"gameTitle": "Raft",
|
||||||
|
"tutorials": [
|
||||||
|
{
|
||||||
|
"name": "Multiworld Setup Guide",
|
||||||
|
"description": "A guide to setting up Raft integration for Archipelago multiworld games.",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"language": "English",
|
||||||
|
"filename": "raft/setup_en.md",
|
||||||
|
"link": "raft/setup/en",
|
||||||
|
"authors": [
|
||||||
|
"SunnyBat",
|
||||||
|
"Awareqwx"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"gameTitle": "Timespinner",
|
"gameTitle": "Timespinner",
|
||||||
"tutorials": [
|
"tutorials": [
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
def createResourcePackName(amount: int, itemName: str):
|
||||||
|
return "Resource Pack: " + str(amount) + " " + itemName
|
||||||
|
|
||||||
|
with open(os.path.join(os.path.dirname(__file__), 'items.json'), 'r') as file:
|
||||||
|
item_table = json.loads(file.read())
|
||||||
|
with open(os.path.join(os.path.dirname(__file__), 'progressives.json'), 'r') as file:
|
||||||
|
progressive_table = json.loads(file.read())
|
||||||
|
with open(os.path.join(os.path.dirname(__file__), 'resourcepacks.json'), 'r') as file:
|
||||||
|
resourcepack_items = json.loads(file.read())
|
||||||
|
|
||||||
|
lookup_id_to_name = {}
|
||||||
|
lookup_name_to_item = {}
|
||||||
|
advancement_item_names = set()
|
||||||
|
|
||||||
|
lastItemId = -1
|
||||||
|
for item in item_table:
|
||||||
|
item_name = item["name"]
|
||||||
|
lookup_id_to_name[item["id"]] = item_name
|
||||||
|
lookup_name_to_item[item_name] = item
|
||||||
|
if item["progression"]:
|
||||||
|
advancement_item_names.add(item_name)
|
||||||
|
lastItemId = max(lastItemId, item["id"])
|
||||||
|
|
||||||
|
progressive_item_list = {}
|
||||||
|
for item in progressive_table:
|
||||||
|
progressiveName = progressive_table[item]
|
||||||
|
if progressiveName not in progressive_item_list:
|
||||||
|
progressive_item_list[progressiveName] = []
|
||||||
|
progressive_item_list[progressiveName].append(item)
|
||||||
|
|
||||||
|
for progressiveItemName in progressive_item_list.keys():
|
||||||
|
lastItemId += 1
|
||||||
|
generatedItem = {}
|
||||||
|
generatedItem["id"] = lastItemId
|
||||||
|
generatedItem["name"] = progressiveItemName
|
||||||
|
generatedItem["progression"] = lookup_name_to_item[progressive_item_list[progressiveItemName][0]]["progression"]
|
||||||
|
lookup_name_to_item[progressiveItemName] = generatedItem
|
||||||
|
lookup_id_to_name[lastItemId] = progressiveItemName
|
||||||
|
|
||||||
|
# Generate resource pack items
|
||||||
|
for packItem in resourcepack_items:
|
||||||
|
for i in range(1, 16): # 1-15
|
||||||
|
lastItemId += 1
|
||||||
|
rpName = createResourcePackName(i, packItem)
|
||||||
|
generatedItem = {}
|
||||||
|
generatedItem["id"] = lastItemId
|
||||||
|
generatedItem["name"] = rpName
|
||||||
|
generatedItem["progression"] = False
|
||||||
|
lookup_name_to_item[rpName] = generatedItem
|
||||||
|
lookup_id_to_name[lastItemId] = rpName
|
||||||
|
|
||||||
|
lookup_id_to_name[None] = "Victory"
|
||||||
|
lookup_name_to_id = {name: id for id, name in lookup_id_to_name.items()}
|
|
@ -0,0 +1,12 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
with open(os.path.join(os.path.dirname(__file__), 'locations.json'), 'r') as file:
|
||||||
|
location_table = json.loads(file.read())
|
||||||
|
|
||||||
|
lookup_id_to_name = {}
|
||||||
|
for item in location_table:
|
||||||
|
lookup_id_to_name[item["id"]] = item["name"]
|
||||||
|
|
||||||
|
lookup_id_to_name[None] = "Tangaroa Next Frequency"
|
||||||
|
lookup_name_to_id = {name: id for id, name in lookup_id_to_name.items()}
|
|
@ -0,0 +1,61 @@
|
||||||
|
from Options import Range, Toggle, DefaultOnToggle, Choice
|
||||||
|
|
||||||
|
class UseResourcePacks(DefaultOnToggle):
|
||||||
|
"""Uses Resource Packs to fill out the item pool from Raft. Resource Packs have basic earlygame items such as planks, plastic, or food."""
|
||||||
|
displayname = "Use resource packs"
|
||||||
|
|
||||||
|
class MinimumResourcePackAmount(Range):
|
||||||
|
"""The minimum amount of resources available in a resource pack"""
|
||||||
|
displayname = "Minimum resource pack amount"
|
||||||
|
range_start = 1
|
||||||
|
range_end = 15
|
||||||
|
default = 1
|
||||||
|
|
||||||
|
class MaximumResourcePackAmount(Range):
|
||||||
|
"""The maximum amount of resources available in a resource pack"""
|
||||||
|
displayname = "Maximum resource pack amount"
|
||||||
|
range_start = 1
|
||||||
|
range_end = 15
|
||||||
|
default = 5
|
||||||
|
|
||||||
|
class DuplicateItems(Choice):
|
||||||
|
"""Adds duplicates of items to the item pool. These will be selected alongside
|
||||||
|
Resource Packs (if configured). Note that there are not many progression items,
|
||||||
|
and selecting Progression may produce many of the same duplicate item."""
|
||||||
|
displayname = "Duplicate items"
|
||||||
|
option_disabled = 0
|
||||||
|
option_progression = 1
|
||||||
|
option_non_progression = 2
|
||||||
|
option_any = 3
|
||||||
|
|
||||||
|
class IslandFrequencyLocations(Choice):
|
||||||
|
"""Sets where frequencies for story islands are located."""
|
||||||
|
displayname = "Frequency locations"
|
||||||
|
option_vanilla = 0
|
||||||
|
option_random_on_island = 1
|
||||||
|
option_progressive = 2
|
||||||
|
option_anywhere = 3
|
||||||
|
default = 1
|
||||||
|
|
||||||
|
class ProgressiveItems(DefaultOnToggle):
|
||||||
|
"""Makes some items, like the Bow and Arrow, progressive rather than raw unlocks."""
|
||||||
|
displayname = "Progressive items"
|
||||||
|
|
||||||
|
class BigIslandEarlyCrafting(Toggle):
|
||||||
|
"""Allows recipes that require items from big islands (eg leather) to lock earlygame items like the Receiver, Bolt, or Smelter."""
|
||||||
|
displayname = "Early recipes behind big islands"
|
||||||
|
|
||||||
|
class PaddleboardMode(Toggle):
|
||||||
|
"""Sets later story islands to in logic without an Engine or Steering Wheel. May require lots of paddling. Not recommended."""
|
||||||
|
displayname = "Paddleboard Mode"
|
||||||
|
|
||||||
|
raft_options = {
|
||||||
|
"use_resource_packs": UseResourcePacks,
|
||||||
|
"minimum_resource_pack_amount": MinimumResourcePackAmount,
|
||||||
|
"maximum_resource_pack_amount": MaximumResourcePackAmount,
|
||||||
|
"duplicate_items": DuplicateItems,
|
||||||
|
"island_frequency_locations": IslandFrequencyLocations,
|
||||||
|
"progressive_items": ProgressiveItems,
|
||||||
|
"big_island_early_crafting": BigIslandEarlyCrafting,
|
||||||
|
"paddleboard_mode": PaddleboardMode
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from BaseClasses import Entrance
|
||||||
|
|
||||||
|
with open(os.path.join(os.path.dirname(__file__), 'regions.json'), 'r') as file:
|
||||||
|
regionMap = json.loads(file.read())
|
||||||
|
|
||||||
|
def create_regions(world, player: int):
|
||||||
|
from . import create_region
|
||||||
|
from .Locations import location_table
|
||||||
|
|
||||||
|
# Create regions and assign locations to each region
|
||||||
|
for region in regionMap:
|
||||||
|
exit_array = regionMap[region]
|
||||||
|
if len(exit_array) == 0:
|
||||||
|
exit_array = None
|
||||||
|
new_region = create_region(world, player, region, [location["name"] for location in location_table if location["region"] == region], exit_array)
|
||||||
|
world.regions += [new_region]
|
||||||
|
|
||||||
|
menu = create_region(world, player, "Menu", None, ["Raft"])
|
||||||
|
world.regions += [menu]
|
||||||
|
menuConn = world.get_entrance("MenuToRaft", player)
|
||||||
|
menuConn.connect(world.get_region("Raft", player))
|
||||||
|
|
||||||
|
# Link regions together
|
||||||
|
for region in regionMap:
|
||||||
|
for linkedRegion in regionMap[region]:
|
||||||
|
connection = world.get_entrance(getConnectionName(region, linkedRegion), player)
|
||||||
|
connection.connect(world.get_region(linkedRegion, player))
|
||||||
|
|
||||||
|
def getConnectionName(entranceName: str, exitName: str):
|
||||||
|
return entranceName + "To" + exitName
|
|
@ -0,0 +1,180 @@
|
||||||
|
from ..generic.Rules import set_rule
|
||||||
|
from .Locations import location_table
|
||||||
|
from .Regions import regionMap
|
||||||
|
from ..AutoWorld import LogicMixin
|
||||||
|
|
||||||
|
class RaftLogic(LogicMixin):
|
||||||
|
def raft_paddleboard_mode_enabled(self, player):
|
||||||
|
return self.world.paddleboard_mode[player].value
|
||||||
|
|
||||||
|
def raft_big_islands_available(self, player):
|
||||||
|
return self.world.big_island_early_crafting[player].value or self.raft_can_access_radio_tower(player)
|
||||||
|
|
||||||
|
def raft_can_smelt_items(self, player):
|
||||||
|
return self.has("Smelter", player)
|
||||||
|
|
||||||
|
def raft_can_craft_bolt(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.has("Bolt", player)
|
||||||
|
|
||||||
|
def raft_can_craft_hinge(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.has("Hinge", player)
|
||||||
|
|
||||||
|
def raft_can_craft_battery(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.has("Battery", player)
|
||||||
|
|
||||||
|
def raft_can_craft_circuitBoard(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.has("Circuit board", player)
|
||||||
|
|
||||||
|
def raft_can_craft_reciever(self, player):
|
||||||
|
return self.raft_can_craft_circuitBoard(player) and self.raft_can_craft_hinge(player) and self.has("Receiver", player)
|
||||||
|
|
||||||
|
def raft_can_craft_antenna(self, player):
|
||||||
|
return self.raft_can_craft_circuitBoard(player) and self.raft_can_craft_bolt(player) and self.has("Antenna", player)
|
||||||
|
|
||||||
|
def raft_can_craft_plasticBottle(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.has("Empty bottle", player)
|
||||||
|
|
||||||
|
def raft_can_fire_bow(self, player):
|
||||||
|
return self.has("Basic bow", player) and self.has("Stone arrow", player)
|
||||||
|
|
||||||
|
def raft_can_craft_shears(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.raft_can_craft_hinge(player) and self.has("Shear", player)
|
||||||
|
|
||||||
|
def raft_can_craft_birdNest(self, player):
|
||||||
|
return self.has("Birds nest", player)
|
||||||
|
|
||||||
|
def raft_can_craft_engine(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.raft_can_craft_circuitBoard(player) and self.has("Engine", player)
|
||||||
|
|
||||||
|
def raft_can_craft_steeringWheel(self, player):
|
||||||
|
return (self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player)
|
||||||
|
and self.raft_can_craft_hinge(player) and self.has("Steering Wheel", player))
|
||||||
|
|
||||||
|
def raft_can_craft_machete(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player) and self.has("Machete", player)
|
||||||
|
|
||||||
|
def raft_can_craft_ziplineTool(self, player):
|
||||||
|
return self.raft_can_craft_hinge(player) and self.raft_can_craft_bolt(player) and self.has("Zipline tool", player)
|
||||||
|
|
||||||
|
def raft_can_get_dirt(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player) and self.has("Shovel", player)
|
||||||
|
|
||||||
|
def raft_can_craft_grassPlot(self, player):
|
||||||
|
return self.raft_can_get_dirt(player) and self.has("Grass plot", player)
|
||||||
|
|
||||||
|
def raft_can_craft_netLauncher(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.raft_can_craft_bolt(player) and self.has("Net launcher", player)
|
||||||
|
|
||||||
|
def raft_can_craft_netCanister(self, player):
|
||||||
|
return self.raft_can_smelt_items(player) and self.has("Net canister", player)
|
||||||
|
|
||||||
|
def raft_can_capture_animals(self, player):
|
||||||
|
return (self.raft_can_craft_netLauncher(player) and self.raft_can_craft_netCanister(player)
|
||||||
|
and self.raft_can_craft_grassPlot(player))
|
||||||
|
|
||||||
|
def raft_can_navigate(self, player): # Sail is added by default and not considered in Archipelago
|
||||||
|
return self.raft_can_craft_battery(player) and self.raft_can_craft_reciever(player) and self.raft_can_craft_antenna(player)
|
||||||
|
|
||||||
|
def raft_can_drive(self, player): # The player can go wherever they want with the engine
|
||||||
|
return self.raft_can_craft_engine(player) and self.raft_can_craft_steeringWheel(player)
|
||||||
|
|
||||||
|
def raft_can_access_radio_tower(self, player):
|
||||||
|
return self.raft_can_navigate(player)
|
||||||
|
|
||||||
|
def raft_can_complete_radio_tower(self, player):
|
||||||
|
return self.raft_can_access_radio_tower(player)
|
||||||
|
|
||||||
|
def raft_can_access_vasagatan(self, player):
|
||||||
|
return self.raft_can_complete_radio_tower(player) and self.raft_can_navigate(player) and self.has("Vasagatan Frequency", player)
|
||||||
|
|
||||||
|
def raft_can_complete_vasagatan(self, player):
|
||||||
|
return self.raft_can_access_vasagatan(player)
|
||||||
|
|
||||||
|
def raft_can_access_balboa_island(self, player):
|
||||||
|
return (self.raft_can_complete_vasagatan(player)
|
||||||
|
and (self.raft_can_drive(player) or self.raft_paddleboard_mode_enabled(player))
|
||||||
|
and self.has("Balboa Island Frequency", player))
|
||||||
|
|
||||||
|
def raft_can_complete_balboa_island(self, player):
|
||||||
|
return self.raft_can_access_balboa_island(player) and self.raft_can_craft_machete(player) and self.raft_can_fire_bow(player)
|
||||||
|
|
||||||
|
def raft_can_access_caravan_island(self, player):
|
||||||
|
return self.raft_can_complete_balboa_island(player) and (self.raft_can_drive(player) or self.raft_paddleboard_mode_enabled(player)) and self.has("Caravan Island Frequency", player)
|
||||||
|
|
||||||
|
def raft_can_complete_caravan_island(self, player):
|
||||||
|
return self.raft_can_access_caravan_island(player) and self.raft_can_craft_ziplineTool(player)
|
||||||
|
|
||||||
|
def raft_can_access_tangaroa(self, player):
|
||||||
|
return self.raft_can_complete_caravan_island(player) and (self.raft_can_drive(player) or self.raft_paddleboard_mode_enabled(player)) and self.has("Tangaroa Frequency", player)
|
||||||
|
|
||||||
|
def raft_can_complete_tangaroa(self, player):
|
||||||
|
return self.raft_can_access_tangaroa(player)
|
||||||
|
|
||||||
|
def set_rules(world, player):
|
||||||
|
regionChecks = {
|
||||||
|
"Raft": lambda state: True,
|
||||||
|
"ResearchTable": lambda state: True,
|
||||||
|
"RadioTower": lambda state: state.raft_can_access_radio_tower(player), # All can_access functions have state as implicit parameter for function
|
||||||
|
"Vasagatan": lambda state: state.raft_can_complete_radio_tower(player) and state.raft_can_access_vasagatan(player),
|
||||||
|
"BalboaIsland": lambda state: state.raft_can_complete_vasagatan(player) and state.raft_can_access_balboa_island(player),
|
||||||
|
"CaravanIsland": lambda state: state.raft_can_complete_balboa_island(player) and state.raft_can_access_caravan_island(player),
|
||||||
|
"Tangaroa": lambda state: state.raft_can_complete_caravan_island(player) and state.raft_can_access_tangaroa(player)
|
||||||
|
}
|
||||||
|
itemChecks = {
|
||||||
|
"Plank": lambda state: True,
|
||||||
|
"Plastic": lambda state: True,
|
||||||
|
"Clay": lambda state: True,
|
||||||
|
"Stone": lambda state: True,
|
||||||
|
"Rope": lambda state: True,
|
||||||
|
"Nail": lambda state: True,
|
||||||
|
"Scrap": lambda state: True,
|
||||||
|
"SeaVine": lambda state: True,
|
||||||
|
"Brick_Dry": lambda state: True,
|
||||||
|
"Thatch": lambda state: True, # Palm Leaf
|
||||||
|
"Placeable_GiantClam": lambda state: True,
|
||||||
|
"Leather": lambda state: state.raft_big_islands_available(player),
|
||||||
|
"Feather": lambda state: state.raft_big_islands_available(player) or state.raft_can_craft_birdNest(player),
|
||||||
|
"MetalIngot": lambda state: state.raft_can_smelt_items(player),
|
||||||
|
"CopperIngot": lambda state: state.raft_can_smelt_items(player),
|
||||||
|
"VineGoo": lambda state: state.raft_can_smelt_items(player),
|
||||||
|
"ExplosivePowder": lambda state: state.raft_big_islands_available(player) and state.raft_can_smelt_items(player),
|
||||||
|
"Glass": lambda state: state.raft_can_smelt_items(player),
|
||||||
|
"Bolt": lambda state: state.raft_can_craft_bolt(player),
|
||||||
|
"Hinge": lambda state: state.raft_can_craft_hinge(player),
|
||||||
|
"CircuitBoard": lambda state: state.raft_can_craft_circuitBoard(player),
|
||||||
|
"PlasticBottle_Empty": lambda state: state.raft_can_craft_plasticBottle(player),
|
||||||
|
"Shear": lambda state: state.raft_can_craft_shears(player),
|
||||||
|
"Wool": lambda state: state.raft_can_capture_animals(player) and state.raft_can_craft_shears(player),
|
||||||
|
"HoneyComb": lambda state: state.raft_can_access_balboa_island(player),
|
||||||
|
"Jar_Bee": lambda state: state.raft_can_access_balboa_island(player) and state.raft_can_smelt_items(player),
|
||||||
|
"Dirt": lambda state: state.raft_can_get_dirt(player),
|
||||||
|
"Egg": lambda state: state.raft_can_capture_animals(player),
|
||||||
|
# Specific items for story island location checks
|
||||||
|
"Machete": lambda state: state.raft_can_craft_machete(player),
|
||||||
|
"BowAndArrow": lambda state: state.raft_can_fire_bow(player),
|
||||||
|
"Zipline tool": lambda state: state.raft_can_craft_ziplineTool(player)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Region access rules
|
||||||
|
for region in regionMap:
|
||||||
|
if region != "Menu":
|
||||||
|
for exitRegion in world.get_region(region, player).exits:
|
||||||
|
set_rule(world.get_entrance(exitRegion.name, player), regionChecks[region])
|
||||||
|
|
||||||
|
# Location access rules
|
||||||
|
for location in location_table:
|
||||||
|
locFromWorld = world.get_location(location["name"], player)
|
||||||
|
if "requiresAccessToItems" in location: # Specific item access required
|
||||||
|
def fullLocationCheck(state, location=location):
|
||||||
|
canAccess = regionChecks[location["region"]](state)
|
||||||
|
for item in location["requiresAccessToItems"]:
|
||||||
|
if not itemChecks[item](state):
|
||||||
|
canAccess = False
|
||||||
|
break
|
||||||
|
return canAccess
|
||||||
|
set_rule(locFromWorld, fullLocationCheck)
|
||||||
|
else: # Only region access required
|
||||||
|
set_rule(locFromWorld, regionChecks[location["region"]])
|
||||||
|
|
||||||
|
# Victory requirement
|
||||||
|
world.completion_condition[player] = lambda state: state.has("Victory", player)
|
|
@ -0,0 +1,162 @@
|
||||||
|
import typing
|
||||||
|
import random
|
||||||
|
|
||||||
|
from .Locations import location_table, lookup_name_to_id as locations_lookup_name_to_id
|
||||||
|
from .Items import (createResourcePackName, item_table, progressive_table, progressive_item_list,
|
||||||
|
lookup_name_to_item, resourcepack_items as resourcePackItems, lookup_name_to_id as items_lookup_name_to_id)
|
||||||
|
|
||||||
|
from .Regions import create_regions, getConnectionName
|
||||||
|
from .Rules import set_rules
|
||||||
|
from .Options import raft_options
|
||||||
|
|
||||||
|
from BaseClasses import Region, RegionType, Entrance, Location, MultiWorld, Item
|
||||||
|
from ..AutoWorld import World
|
||||||
|
|
||||||
|
class RaftWorld(World):
|
||||||
|
"""
|
||||||
|
Raft is a flooded world exploration game. You're stranded on a small raft in the middle of the
|
||||||
|
ocean, and you must survive on trash floating by you on the top of the water and around/on any
|
||||||
|
islands that you come across.
|
||||||
|
"""
|
||||||
|
game: str = "Raft"
|
||||||
|
|
||||||
|
item_name_to_id = items_lookup_name_to_id.copy()
|
||||||
|
lastItemId = max(filter(lambda val: val is not None, item_name_to_id.values()))
|
||||||
|
|
||||||
|
location_name_to_id = locations_lookup_name_to_id
|
||||||
|
options = raft_options
|
||||||
|
|
||||||
|
data_version = 1
|
||||||
|
|
||||||
|
def generate_basic(self):
|
||||||
|
minRPSpecified = self.world.minimum_resource_pack_amount[self.player].value
|
||||||
|
maxRPSpecified = self.world.maximum_resource_pack_amount[self.player].value
|
||||||
|
minimumResourcePackAmount = min(minRPSpecified, maxRPSpecified)
|
||||||
|
maximumResourcePackAmount = max(minRPSpecified, maxRPSpecified)
|
||||||
|
# Generate item pool
|
||||||
|
pool = []
|
||||||
|
for item in item_table:
|
||||||
|
raft_item = self.create_item_replaceAsNecessary(item["name"])
|
||||||
|
pool.append(raft_item)
|
||||||
|
|
||||||
|
extraItemNamePool = []
|
||||||
|
extras = len(location_table) - len(item_table) - 1 # Victory takes up 1 unaccounted-for slot
|
||||||
|
if extras > 0:
|
||||||
|
if (self.world.use_resource_packs[self.player].value):
|
||||||
|
for packItem in resourcePackItems:
|
||||||
|
for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1):
|
||||||
|
extraItemNamePool.append(createResourcePackName(i, packItem))
|
||||||
|
|
||||||
|
if self.world.duplicate_items[self.player].value != 0:
|
||||||
|
dupeItemPool = item_table.copy()
|
||||||
|
# Remove frequencies if necessary
|
||||||
|
if self.world.island_frequency_locations[self.player].value != 3: # Not completely random locations
|
||||||
|
dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"])
|
||||||
|
|
||||||
|
# Remove progression or non-progression items if necessary
|
||||||
|
if (self.world.duplicate_items[self.player].value == 1): # Progression only
|
||||||
|
dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True)
|
||||||
|
elif (self.world.duplicate_items[self.player].value == 2): # Non-progression only
|
||||||
|
dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False)
|
||||||
|
|
||||||
|
dupeItemPool = list(dupeItemPool)
|
||||||
|
# Finally, add items as necessary
|
||||||
|
if len(dupeItemPool) > 0:
|
||||||
|
for item in dupeItemPool:
|
||||||
|
extraItemNamePool.append(item["name"])
|
||||||
|
|
||||||
|
if (len(extraItemNamePool) > 0):
|
||||||
|
for randomItem in random.choices(extraItemNamePool, k=extras):
|
||||||
|
raft_item = self.create_item_replaceAsNecessary(randomItem)
|
||||||
|
pool.append(raft_item)
|
||||||
|
|
||||||
|
self.world.itempool += pool
|
||||||
|
|
||||||
|
def set_rules(self):
|
||||||
|
set_rules(self.world, self.player)
|
||||||
|
|
||||||
|
def create_regions(self):
|
||||||
|
create_regions(self.world, self.player)
|
||||||
|
|
||||||
|
def fill_slot_data(self):
|
||||||
|
slot_data = {}
|
||||||
|
return slot_data
|
||||||
|
|
||||||
|
def create_item_replaceAsNecessary(self, name: str) -> Item:
|
||||||
|
isFrequency = "Frequency" in name
|
||||||
|
shouldUseProgressive = ((isFrequency and self.world.island_frequency_locations[self.player].value == 2)
|
||||||
|
or (not isFrequency and self.world.progressive_items[self.player].value))
|
||||||
|
if shouldUseProgressive and name in progressive_table:
|
||||||
|
name = progressive_table[name]
|
||||||
|
return self.create_item(name)
|
||||||
|
|
||||||
|
def create_item(self, name: str) -> Item:
|
||||||
|
item = lookup_name_to_item[name]
|
||||||
|
return RaftItem(name, item["progression"], self.item_name_to_id[name], player=self.player)
|
||||||
|
|
||||||
|
def create_resourcePack(self, rpName: str) -> Item:
|
||||||
|
return RaftItem(rpName, False, self.item_name_to_id[rpName], player=self.player)
|
||||||
|
|
||||||
|
def collect_item(self, state, item, remove=False):
|
||||||
|
if item.name in progressive_item_list:
|
||||||
|
prog_table = progressive_item_list[item.name]
|
||||||
|
if remove:
|
||||||
|
for item_name in reversed(prog_table):
|
||||||
|
if state.has(item_name, item.player):
|
||||||
|
return item_name
|
||||||
|
else:
|
||||||
|
for item_name in prog_table:
|
||||||
|
if not state.has(item_name, item.player):
|
||||||
|
return item_name
|
||||||
|
|
||||||
|
return super(RaftWorld, self).collect_item(state, item, remove)
|
||||||
|
|
||||||
|
def get_required_client_version(self) -> typing.Tuple[int, int, int]:
|
||||||
|
return max((0, 2, 0), super(RaftWorld, self).get_required_client_version())
|
||||||
|
|
||||||
|
def pre_fill(self):
|
||||||
|
if self.world.island_frequency_locations[self.player] == 0:
|
||||||
|
self.setLocationItem("Radio Tower Frequency to Vasagatan", "Vasagatan Frequency")
|
||||||
|
self.setLocationItem("Vasagatan Frequency to Balboa", "Balboa Island Frequency")
|
||||||
|
self.setLocationItem("Relay Station quest", "Caravan Island Frequency")
|
||||||
|
self.setLocationItem("Caravan Island Frequency to Tangaroa", "Tangaroa Frequency")
|
||||||
|
elif self.world.island_frequency_locations[self.player] == 1:
|
||||||
|
self.setLocationItemFromRegion("RadioTower", "Vasagatan Frequency")
|
||||||
|
self.setLocationItemFromRegion("Vasagatan", "Balboa Island Frequency")
|
||||||
|
self.setLocationItemFromRegion("BalboaIsland", "Caravan Island Frequency")
|
||||||
|
self.setLocationItemFromRegion("CaravanIsland", "Tangaroa Frequency")
|
||||||
|
# Victory item
|
||||||
|
self.world.get_location("Tangaroa Next Frequency", self.player).place_locked_item(
|
||||||
|
RaftItem("Victory", True, None, player=self.player))
|
||||||
|
|
||||||
|
def setLocationItem(self, location: str, itemName: str):
|
||||||
|
itemToUse = next(filter(lambda itm: itm.name == itemName, self.world.itempool))
|
||||||
|
self.world.itempool.remove(itemToUse)
|
||||||
|
self.world.get_location(location, self.player).place_locked_item(itemToUse)
|
||||||
|
|
||||||
|
def setLocationItemFromRegion(self, region: str, itemName: str):
|
||||||
|
itemToUse = next(filter(lambda itm: itm.name == itemName, self.world.itempool))
|
||||||
|
self.world.itempool.remove(itemToUse)
|
||||||
|
location = random.choice(list(loc for loc in location_table if loc["region"] == region))
|
||||||
|
self.world.get_location(location["name"], self.player).place_locked_item(itemToUse)
|
||||||
|
|
||||||
|
def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None):
|
||||||
|
ret = Region(name, RegionType.Generic, name, player)
|
||||||
|
ret.world = world
|
||||||
|
if locations:
|
||||||
|
for location in locations:
|
||||||
|
loc_id = locations_lookup_name_to_id.get(location, 0)
|
||||||
|
locationObj = RaftLocation(player, location, loc_id, ret)
|
||||||
|
ret.locations.append(locationObj)
|
||||||
|
if exits:
|
||||||
|
for exit in exits:
|
||||||
|
ret.exits.append(Entrance(player, getConnectionName(name, exit), ret))
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
class RaftLocation(Location):
|
||||||
|
game = "Raft"
|
||||||
|
|
||||||
|
|
||||||
|
class RaftItem(Item):
|
||||||
|
game = "Raft"
|
|
@ -0,0 +1,342 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 47001,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Backpack"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47002,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Leather helmet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47003,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Leather body armor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47004,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Leather greaves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47005,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Flippers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47006,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Head light"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47007,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Oxygen bottle"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47008,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Zipline tool"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47009,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Empty bottle"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47010,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Clay bowl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47011,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Bucket"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47012,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Healing salve"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47013,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Good healing salve"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47014,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Cookingpot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47015,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Advanced grill"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47016,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Advanced purifier"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47017,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Electric purifier"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47018,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Medium crop plot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47019,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Large crop plot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47020,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Grass plot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47021,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Scarecrow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47022,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Sprinkler"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47023,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Honey"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47024,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Battery"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47025,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Bolt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47026,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Circuit board"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47027,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Hinge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47028,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Stationary anchor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47029,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Engine controls"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47030,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Engine"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47031,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Receiver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47032,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Antenna"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47033,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Steering Wheel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47034,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Battery charger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47035,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Hammock"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47036,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Beehive"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47037,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Biofuel refiner"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47038,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Birds nest"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47039,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Smelter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47040,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Fuel tank"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47041,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Water tank"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47042,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Simple collection net"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47043,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Fuel pipe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47044,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Water pipe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47045,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Storage"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47046,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Large Storage"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47047,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Trashcan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47048,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Zipline"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47049,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Firework"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47050,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Metal axe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47051,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Binoculars"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47052,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Metal fishing rod"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47053,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Scrap hook"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47054,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Metal detector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47055,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Shear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47056,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Shovel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47057,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Sweep net"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47058,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Basic bow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47059,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Stone arrow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47060,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Metal arrow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47061,
|
||||||
|
"progression": false,
|
||||||
|
"name": "Metal Spear"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47062,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Machete"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47063,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Net launcher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47064,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Net canister"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47065,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Vasagatan Frequency"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47066,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Balboa Island Frequency"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47067,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Tangaroa Frequency"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 47068,
|
||||||
|
"progression": true,
|
||||||
|
"name": "Caravan Island Frequency"
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,875 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 48001,
|
||||||
|
"name": "Small trophy board",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Nail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48002,
|
||||||
|
"name": "Medium trophy board",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Nail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48003,
|
||||||
|
"name": "Simple collection net",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Rope",
|
||||||
|
"Nail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48004,
|
||||||
|
"name": "Advanced grill",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"MetalIngot",
|
||||||
|
"Rope",
|
||||||
|
"Nail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48005,
|
||||||
|
"name": "Large crop plot",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Rope",
|
||||||
|
"Nail",
|
||||||
|
"Hinge"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48006,
|
||||||
|
"name": "Scarecrow",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Thatch",
|
||||||
|
"Nail",
|
||||||
|
"Plastic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48007,
|
||||||
|
"name": "Hammock",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Thatch",
|
||||||
|
"Feather",
|
||||||
|
"Nail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48008,
|
||||||
|
"name": "Smelter",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Brick_Dry",
|
||||||
|
"Scrap",
|
||||||
|
"Nail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48009,
|
||||||
|
"name": "Medium crop plot",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Scrap"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48010,
|
||||||
|
"name": "Lantern",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Scrap"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48011,
|
||||||
|
"name": "Bucket",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Scrap",
|
||||||
|
"Rope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48012,
|
||||||
|
"name": "Advanced purifier",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Plastic",
|
||||||
|
"Glass"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48013,
|
||||||
|
"name": "Grass plot",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Dirt",
|
||||||
|
"Plank",
|
||||||
|
"Plastic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48014,
|
||||||
|
"name": "Paint brush",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Feather",
|
||||||
|
"Plank",
|
||||||
|
"Rope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48015,
|
||||||
|
"name": "Birds nest",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Thatch",
|
||||||
|
"Plank",
|
||||||
|
"Placeable_GiantClam"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48016,
|
||||||
|
"name": "Shovel",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"MetalIngot",
|
||||||
|
"Bolt",
|
||||||
|
"Plank"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48017,
|
||||||
|
"name": "Stone arrow",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Stone",
|
||||||
|
"Plastic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48018,
|
||||||
|
"name": "Metal arrow",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"MetalIngot",
|
||||||
|
"Feather"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48019,
|
||||||
|
"name": "Stationary anchor",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Rope",
|
||||||
|
"MetalIngot",
|
||||||
|
"Hinge"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48020,
|
||||||
|
"name": "Paint mill",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Scrap",
|
||||||
|
"Rope",
|
||||||
|
"Stone"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48021,
|
||||||
|
"name": "Storage",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Scrap",
|
||||||
|
"Rope",
|
||||||
|
"Hinge"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48022,
|
||||||
|
"name": "Metal axe",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Rope",
|
||||||
|
"Scrap",
|
||||||
|
"Bolt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48023,
|
||||||
|
"name": "Scrap hook",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Scrap",
|
||||||
|
"Rope",
|
||||||
|
"Plank",
|
||||||
|
"Bolt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48024,
|
||||||
|
"name": "Sweep net",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Rope",
|
||||||
|
"VineGoo",
|
||||||
|
"Bolt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48025,
|
||||||
|
"name": "Basic bow",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Rope",
|
||||||
|
"VineGoo",
|
||||||
|
"Bolt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48026,
|
||||||
|
"name": "Metal Spear",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Rope",
|
||||||
|
"MetalIngot",
|
||||||
|
"Bolt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48027,
|
||||||
|
"name": "Cookingpot",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Plastic",
|
||||||
|
"MetalIngot",
|
||||||
|
"VineGoo",
|
||||||
|
"Bolt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48028,
|
||||||
|
"name": "Beehive",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Plastic",
|
||||||
|
"Clay",
|
||||||
|
"Hinge",
|
||||||
|
"Jar_Bee"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48029,
|
||||||
|
"name": "Backpack",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Leather",
|
||||||
|
"Rope",
|
||||||
|
"Wool"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48030,
|
||||||
|
"name": "Leather helmet",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Leather",
|
||||||
|
"Wool"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48031,
|
||||||
|
"name": "Leather body armor",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Leather",
|
||||||
|
"Wool"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48032,
|
||||||
|
"name": "Leather greaves",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Leather",
|
||||||
|
"Wool"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48033,
|
||||||
|
"name": "Flippers",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plastic",
|
||||||
|
"SeaVine",
|
||||||
|
"VineGoo",
|
||||||
|
"Rope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48034,
|
||||||
|
"name": "Oxygen bottle",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plastic",
|
||||||
|
"Rope",
|
||||||
|
"PlasticBottle_Empty",
|
||||||
|
"VineGoo"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48035,
|
||||||
|
"name": "Empty bottle",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plastic",
|
||||||
|
"VineGoo"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48036,
|
||||||
|
"name": "Clay bowl",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Clay"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48037,
|
||||||
|
"name": "Healing salve",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Egg",
|
||||||
|
"Clay"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48038,
|
||||||
|
"name": "Good healing salve",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Egg",
|
||||||
|
"Clay",
|
||||||
|
"HoneyComb"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48039,
|
||||||
|
"name": "Sprinkler",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plastic",
|
||||||
|
"Scrap",
|
||||||
|
"Bolt",
|
||||||
|
"CircuitBoard"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48040,
|
||||||
|
"name": "Honey",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"HoneyComb",
|
||||||
|
"Glass"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48041,
|
||||||
|
"name": "Battery",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"CopperIngot",
|
||||||
|
"Plastic",
|
||||||
|
"Scrap"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48042,
|
||||||
|
"name": "Bolt",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"MetalIngot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48043,
|
||||||
|
"name": "Circuit board",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plastic",
|
||||||
|
"CopperIngot",
|
||||||
|
"VineGoo"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48044,
|
||||||
|
"name": "Hinge",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"MetalIngot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48045,
|
||||||
|
"name": "Binoculars",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"PlasticBottle_Empty",
|
||||||
|
"Bolt",
|
||||||
|
"Glass",
|
||||||
|
"Rope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48046,
|
||||||
|
"name": "Metal fishing rod",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Scrap",
|
||||||
|
"Bolt",
|
||||||
|
"Rope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48047,
|
||||||
|
"name": "Shear",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"MetalIngot",
|
||||||
|
"Hinge",
|
||||||
|
"Scrap"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48048,
|
||||||
|
"name": "Net launcher",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Scrap",
|
||||||
|
"Plastic",
|
||||||
|
"MetalIngot",
|
||||||
|
"Bolt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48049,
|
||||||
|
"name": "Net canister",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"ExplosivePowder",
|
||||||
|
"Stone",
|
||||||
|
"Rope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48050,
|
||||||
|
"name": "Large trophy board",
|
||||||
|
"region": "ResearchTable",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Plank",
|
||||||
|
"Nail"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48051,
|
||||||
|
"name": "Head light blueprint",
|
||||||
|
"region": "RadioTower"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48052,
|
||||||
|
"name": "Radio Tower Briefcase",
|
||||||
|
"region": "RadioTower"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48053,
|
||||||
|
"name": "Radio Tower Frequency to Vasagatan",
|
||||||
|
"region": "RadioTower"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48054,
|
||||||
|
"name": "Radio Tower Notepad 1",
|
||||||
|
"region": "RadioTower"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48055,
|
||||||
|
"name": "Radio Tower Notepad 2",
|
||||||
|
"region": "RadioTower"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48056,
|
||||||
|
"name": "Radio Tower Signalboard Trace",
|
||||||
|
"region": "RadioTower"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48057,
|
||||||
|
"name": "Vasagatan Recording 1",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48058,
|
||||||
|
"name": "Vasagatan Recording 2",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48059,
|
||||||
|
"name": "Vasagatan Recording 3",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48060,
|
||||||
|
"name": "Vasagatan Recording 4",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48061,
|
||||||
|
"name": "Vasagatan Recording 5",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48062,
|
||||||
|
"name": "Vasagatan Note from Oskar",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48063,
|
||||||
|
"name": "Vasagatan Note from Celine",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48064,
|
||||||
|
"name": "Vasagatan Note from Hannes",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48065,
|
||||||
|
"name": "Vasagatan Magazine Clipping",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48066,
|
||||||
|
"name": "Vasagatan Captain's Log 1",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48067,
|
||||||
|
"name": "Vasagatan Captain's Log 2",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48068,
|
||||||
|
"name": "Vasagatan Frequency to Balboa",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48069,
|
||||||
|
"name": "Vasagatan Wilkstrom's report",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48070,
|
||||||
|
"name": "Engine blueprint",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48071,
|
||||||
|
"name": "Steering Wheel blueprint",
|
||||||
|
"region": "Vasagatan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48072,
|
||||||
|
"name": "Machete blueprint",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48073,
|
||||||
|
"name": "Balboa Island Picture of two engineers",
|
||||||
|
"region": "BalboaIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"BowAndArrow"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48074,
|
||||||
|
"name": "Balboa Island Schedule of engineers",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48075,
|
||||||
|
"name": "Biofuel refiner blueprint",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48076,
|
||||||
|
"name": "Balboa Island Note from Hentry",
|
||||||
|
"region": "BalboaIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"BowAndArrow",
|
||||||
|
"Machete"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48077,
|
||||||
|
"name": "Balboa Island Correas diary 3",
|
||||||
|
"region": "BalboaIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"BowAndArrow",
|
||||||
|
"Machete"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48078,
|
||||||
|
"name": "Fuel tank blueprint",
|
||||||
|
"region": "BalboaIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"BowAndArrow",
|
||||||
|
"Machete"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48079,
|
||||||
|
"name": "Balboa Island Correas diary 1",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48080,
|
||||||
|
"name": "Balboa Island Correas diary 2",
|
||||||
|
"region": "BalboaIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"BowAndArrow"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48081,
|
||||||
|
"name": "Fuel pipe blueprint",
|
||||||
|
"region": "BalboaIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"BowAndArrow"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48082,
|
||||||
|
"name": "Balboa Island Bear map",
|
||||||
|
"region": "BalboaIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"BowAndArrow"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48083,
|
||||||
|
"name": "Balboa Island Doll murderer 4",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48084,
|
||||||
|
"name": "Balboa Island Doll murderer 1",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48085,
|
||||||
|
"name": "Balboa Island Doll murderer 3",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48086,
|
||||||
|
"name": "Balboa Island Doll murderer 5",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48087,
|
||||||
|
"name": "Balboa Island Doll murderer 2",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48088,
|
||||||
|
"name": "Caravan Island Journal 1 - First Entry",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48089,
|
||||||
|
"name": "Caravan Island Journal 2 - Pipe Experiment",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48090,
|
||||||
|
"name": "Caravan Island Journal 3 - Rocket Experiment",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48091,
|
||||||
|
"name": "Caravan Island Journal 4 - Mother's Letter",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48092,
|
||||||
|
"name": "Caravan Island Journal 5 - Dive Experiment",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48093,
|
||||||
|
"name": "Caravan Island Journal 6 - Kelp Experiment",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48094,
|
||||||
|
"name": "Caravan Island Journal 7 - Raft Society News Letter",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48095,
|
||||||
|
"name": "Caravan Island Journal 8 - Leaving Caravan Island",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48096,
|
||||||
|
"name": "Caravan Island Journal 9 - Doctor's Note",
|
||||||
|
"region": "CaravanIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Zipline tool"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48097,
|
||||||
|
"name": "Firework blueprint",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48098,
|
||||||
|
"name": "Battery Charger quest",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48099,
|
||||||
|
"name": "Zipline quest",
|
||||||
|
"region": "CaravanIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"ExplosivePowder"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48100,
|
||||||
|
"name": "Caravan Island Frequency to Tangaroa",
|
||||||
|
"region": "CaravanIsland",
|
||||||
|
"requiresAccessToItems": [
|
||||||
|
"Zipline tool"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48101,
|
||||||
|
"name": "Engine controls blueprint",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48102,
|
||||||
|
"name": "Metal detector blueprint",
|
||||||
|
"region": "CaravanIsland"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48103,
|
||||||
|
"name": "Tangaroa Ruben 1",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48104,
|
||||||
|
"name": "Tangaroa Ruben 2",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48105,
|
||||||
|
"name": "Tangaroa Ruben 3",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48106,
|
||||||
|
"name": "Tangaroa Ruben 4",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48107,
|
||||||
|
"name": "Tangaroa Ruben 5",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48108,
|
||||||
|
"name": "Tangaroa Gardener Diary",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48109,
|
||||||
|
"name": "Tangaroa Riot Log",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48110,
|
||||||
|
"name": "Tangaroa Tulley Note",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48111,
|
||||||
|
"name": "Tangaroa Cipher",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48112,
|
||||||
|
"name": "Tangaroa Next Frequency",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48113,
|
||||||
|
"name": "Water pipe blueprint",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48114,
|
||||||
|
"name": "Electric purifier blueprint",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48115,
|
||||||
|
"name": "Water tank blueprint",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48116,
|
||||||
|
"name": "Large Storage blueprint",
|
||||||
|
"region": "Tangaroa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 48117,
|
||||||
|
"name": "Relay Station quest",
|
||||||
|
"region": "BalboaIsland"
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"Healing salve": "progressive-salve",
|
||||||
|
"Good healing salve": "progressive-salve",
|
||||||
|
"Advanced purifier": "progressive-purifier",
|
||||||
|
"Electric purifier": "progressive-purifier",
|
||||||
|
"Medium crop plot": "progressive-crop-plot",
|
||||||
|
"Large crop plot": "progressive-crop-plot",
|
||||||
|
"Battery": "progressive-battery",
|
||||||
|
"Battery charger": "progressive-battery",
|
||||||
|
"Engine": "progressive-engine",
|
||||||
|
"Steering Wheel": "progressive-engine",
|
||||||
|
"Engine controls": "progressive-engine",
|
||||||
|
"Storage": "progressive-storage",
|
||||||
|
"Large Storage": "progressive-storage",
|
||||||
|
"Zipline tool": "progressive-zipline",
|
||||||
|
"Zipline": "progressive-zipline",
|
||||||
|
"Smelter": "progressive-metals",
|
||||||
|
"Metal detector": "progressive-metals",
|
||||||
|
"Basic bow": "progressive-bow",
|
||||||
|
"Stone arrow": "progressive-bow",
|
||||||
|
"Metal arrow": "progressive-bow",
|
||||||
|
"Vasagatan Frequency": "progressive-frequency",
|
||||||
|
"Balboa Island Frequency": "progressive-frequency",
|
||||||
|
"Caravan Island Frequency": "progressive-frequency",
|
||||||
|
"Tangaroa Frequency": "progressive-frequency"
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"Raft": ["RadioTower", "ResearchTable"],
|
||||||
|
"ResearchTable": [],
|
||||||
|
"RadioTower": ["Vasagatan"],
|
||||||
|
"Vasagatan": ["BalboaIsland"],
|
||||||
|
"BalboaIsland": ["CaravanIsland"],
|
||||||
|
"CaravanIsland": ["Tangaroa"],
|
||||||
|
"Tangaroa": []
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
[
|
||||||
|
"Plank",
|
||||||
|
"Plastic",
|
||||||
|
"Clay",
|
||||||
|
"Stone",
|
||||||
|
"Scrap",
|
||||||
|
"SeaVine",
|
||||||
|
"Thatch",
|
||||||
|
"Sand",
|
||||||
|
"Raw_Beet",
|
||||||
|
"Raw_Potato"
|
||||||
|
]
|
Loading…
Reference in New Issue