DS3: Add progressive locations, fix the randomize_weapons_level option and add some options ( Deathlink ) (#1206)
* Update items_data.py added `Red and White Round Shield`, `Crystal Scroll`, `Magic Stoneplate Ring`, and `Outrider Knight` gear. * Update locations_data.py Added `US: Red and White Round Shield`, `CKG: Magic Stoneplate Ring`, `GA: Outrider Knight` set, and `GA: Crystal Scroll` * Update __init__.py Add `Karla's Ashes` requirements * Update items_data.py Add `Irithyll Rapier, Hollow's Ashes, Irina's Ashes, Karla's Ashes, Cornyx's Ashes, and Orbeck's Ashes` * Update locations_data.py Add `Irithyll Rapier, Hollow's Ashes, Irina's Ashes, Karla's Ashes, Orbeck's Ashes, and Cornyx's Ashes` * Update items_data.py removed "hollows ashes" * Update locations_data.py remove "hollows ashes" * Revert "WebHost: Add the DarkSouls3 entry to upload and download the client file" This reverts commit 5e7c2d4cee485e373ffe60932134013548192c8e. * ds3: setup progressive locations * ds3: Use fill_slot_data instead of generate_output * ds3: Add no_spell_requirements, no_equip_load and death_link option * ds3: Add some progressive locations * DS3: Increment data_version * DS3: Fix item name in rule * DS3: Set required client version to 0.3.6 and added offsets between items and location tables for backward compatibility * DS3: Resolve Python 3.8 compatibility * DS3: Removed useless region for locations IDs consistency * DS3: Changed i in loop * DS3: Remove AP.json from the documentation * DS3: Put back json upload and download * DS3: Avoid empty downloads * DS3: Fix randomize_weapons_level option * DS3: Remove options duplicate entries * DS3: Change location rule according to review Co-authored-by: Br00ty <83629348+Br00ty@users.noreply.github.com>
This commit is contained in:
parent
70cab99caf
commit
0cbee4ac3e
|
@ -1,5 +1,5 @@
|
||||||
import typing
|
import typing
|
||||||
from Options import Toggle, Option
|
from Options import Toggle, Option, DeathLink
|
||||||
|
|
||||||
|
|
||||||
class AutoEquipOption(Toggle):
|
class AutoEquipOption(Toggle):
|
||||||
|
@ -19,6 +19,16 @@ class NoWeaponRequirementsOption(Toggle):
|
||||||
display_name = "No Weapon Requirements"
|
display_name = "No Weapon Requirements"
|
||||||
|
|
||||||
|
|
||||||
|
class NoSpellRequirementsOption(Toggle):
|
||||||
|
"""Disable the spell requirements permitting you to use any spell"""
|
||||||
|
display_name = "No Spell Requirements"
|
||||||
|
|
||||||
|
|
||||||
|
class NoEquipLoadOption(Toggle):
|
||||||
|
"""Disable the equip load constraint from the game"""
|
||||||
|
display_name = "No Equip load"
|
||||||
|
|
||||||
|
|
||||||
class RandomizeWeaponsLevelOption(Toggle):
|
class RandomizeWeaponsLevelOption(Toggle):
|
||||||
"""Enable this option to upgrade 33% ( based on the probability chance ) of the pool of weapons to a random value
|
"""Enable this option to upgrade 33% ( based on the probability chance ) of the pool of weapons to a random value
|
||||||
between +1 and +5/+10"""
|
between +1 and +5/+10"""
|
||||||
|
@ -37,5 +47,8 @@ dark_souls_options: typing.Dict[str, type(Option)] = {
|
||||||
"no_weapon_requirements": NoWeaponRequirementsOption,
|
"no_weapon_requirements": NoWeaponRequirementsOption,
|
||||||
"randomize_weapons_level": RandomizeWeaponsLevelOption,
|
"randomize_weapons_level": RandomizeWeaponsLevelOption,
|
||||||
"late_basin_of_vows": LateBasinOfVowsOption,
|
"late_basin_of_vows": LateBasinOfVowsOption,
|
||||||
|
"no_spell_requirements": NoSpellRequirementsOption,
|
||||||
|
"no_equip_load": NoEquipLoadOption,
|
||||||
|
"death_link": DeathLink,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,10 @@ from .data.locations_data import location_dictionary, fire_link_shrine_table, \
|
||||||
undead_settlement_table, road_of_sacrifice_table, consumed_king_garden_table, cathedral_of_the_deep_table, \
|
undead_settlement_table, road_of_sacrifice_table, consumed_king_garden_table, cathedral_of_the_deep_table, \
|
||||||
farron_keep_table, catacombs_of_carthus_table, smouldering_lake_table, irithyll_of_the_boreal_valley_table, \
|
farron_keep_table, catacombs_of_carthus_table, smouldering_lake_table, irithyll_of_the_boreal_valley_table, \
|
||||||
irithyll_dungeon_table, profaned_capital_table, anor_londo_table, lothric_castle_table, grand_archives_table, \
|
irithyll_dungeon_table, profaned_capital_table, anor_londo_table, lothric_castle_table, grand_archives_table, \
|
||||||
untended_graves_table, archdragon_peak_table, firelink_shrine_bell_tower_table
|
untended_graves_table, archdragon_peak_table, firelink_shrine_bell_tower_table, progressive_locations
|
||||||
from ..AutoWorld import World, WebWorld
|
from ..AutoWorld import World, WebWorld
|
||||||
from BaseClasses import MultiWorld, Location, Region, Item, RegionType, Entrance, Tutorial, ItemClassification
|
from BaseClasses import MultiWorld, Location, Region, Item, RegionType, Entrance, Tutorial, ItemClassification
|
||||||
from ..generic.Rules import set_rule
|
from ..generic.Rules import set_rule, add_item_rule
|
||||||
|
|
||||||
|
|
||||||
class DarkSouls3Web(WebWorld):
|
class DarkSouls3Web(WebWorld):
|
||||||
|
@ -79,8 +79,8 @@ class DarkSouls3World(World):
|
||||||
return DarkSouls3Item(name, item_classification, data, self.player)
|
return DarkSouls3Item(name, item_classification, data, self.player)
|
||||||
|
|
||||||
def create_regions(self):
|
def create_regions(self):
|
||||||
menu_region = Region("Menu", RegionType.Generic, "Menu", self.player)
|
|
||||||
self.multiworld.regions.append(menu_region)
|
menu_region = self.create_region("Menu", progressive_locations)
|
||||||
|
|
||||||
# Create all Vanilla regions of Dark Souls III
|
# Create all Vanilla regions of Dark Souls III
|
||||||
firelink_shrine_region = self.create_region("Firelink Shrine", fire_link_shrine_table)
|
firelink_shrine_region = self.create_region("Firelink Shrine", fire_link_shrine_table)
|
||||||
|
@ -163,6 +163,8 @@ class DarkSouls3World(World):
|
||||||
if location_table:
|
if location_table:
|
||||||
for name, address in location_table.items():
|
for name, address in location_table.items():
|
||||||
location = DarkSouls3Location(self.player, name, self.location_name_to_id[name], new_region)
|
location = DarkSouls3Location(self.player, name, self.location_name_to_id[name], new_region)
|
||||||
|
if region_name == "Menu":
|
||||||
|
add_item_rule(location, lambda item: not item.advancement)
|
||||||
new_region.locations.append(location)
|
new_region.locations.append(location)
|
||||||
self.multiworld.regions.append(new_region)
|
self.multiworld.regions.append(new_region)
|
||||||
return new_region
|
return new_region
|
||||||
|
@ -264,13 +266,13 @@ class DarkSouls3World(World):
|
||||||
for location in self.multiworld.get_filled_locations():
|
for location in self.multiworld.get_filled_locations():
|
||||||
if location.item.player == self.player:
|
if location.item.player == self.player:
|
||||||
items_id.append(location.item.code)
|
items_id.append(location.item.code)
|
||||||
items_address.append(item_dictionary[location.item.name])
|
items_address.append(item_dictionary_copy[location.item.name])
|
||||||
|
|
||||||
if location.player == self.player:
|
if location.player == self.player:
|
||||||
locations_address.append(location_dictionary[location.name])
|
locations_address.append(location_dictionary[location.name])
|
||||||
locations_id.append(location.address)
|
locations_id.append(location.address)
|
||||||
if location.item.player == self.player:
|
if location.item.player == self.player:
|
||||||
locations_target.append(item_dictionary[location.item.name])
|
locations_target.append(item_dictionary_copy[location.item.name])
|
||||||
else:
|
else:
|
||||||
locations_target.append(0)
|
locations_target.append(0)
|
||||||
|
|
||||||
|
@ -279,6 +281,9 @@ class DarkSouls3World(World):
|
||||||
"auto_equip": self.multiworld.auto_equip[self.player].value,
|
"auto_equip": self.multiworld.auto_equip[self.player].value,
|
||||||
"lock_equip": self.multiworld.lock_equip[self.player].value,
|
"lock_equip": self.multiworld.lock_equip[self.player].value,
|
||||||
"no_weapon_requirements": self.multiworld.no_weapon_requirements[self.player].value,
|
"no_weapon_requirements": self.multiworld.no_weapon_requirements[self.player].value,
|
||||||
|
"death_link": self.multiworld.death_link[self.player].value,
|
||||||
|
"no_spell_requirements": self.multiworld.no_spell_requirements[self.player].value,
|
||||||
|
"no_equip_load": self.multiworld.no_equip_load[self.player].value,
|
||||||
},
|
},
|
||||||
"seed": self.multiworld.seed_name, # to verify the server's multiworld
|
"seed": self.multiworld.seed_name, # to verify the server's multiworld
|
||||||
"slot": self.multiworld.player_name[self.player], # to connect to server
|
"slot": self.multiworld.player_name[self.player], # to connect to server
|
||||||
|
|
|
@ -152,6 +152,22 @@ goods_table = {
|
||||||
"Soul of Boreal Valley Vordt": 0x400002CF,
|
"Soul of Boreal Valley Vordt": 0x400002CF,
|
||||||
"Soul of a Stray Demon": 0x400002E7,
|
"Soul of a Stray Demon": 0x400002E7,
|
||||||
"Soul of a Demon": 0x400002E3,
|
"Soul of a Demon": 0x400002E3,
|
||||||
|
|
||||||
|
# Upgrade materials
|
||||||
|
**{"Titanite Shard #"+str(i): 0x400003E8 for i in range(1, 11)},
|
||||||
|
**{"Large Titanite Shard #"+str(i): 0x400003E9 for i in range(1, 11)},
|
||||||
|
**{"Titanite Chunk #"+str(i): 0x400003EA for i in range(1, 6)},
|
||||||
|
**{"Titanite Slab #"+str(i): 0x400003EB for i in range(1, 4)},
|
||||||
|
|
||||||
|
# Healing
|
||||||
|
**{"Estus Shard #"+str(i): 0x4000085D for i in range(1, 16)},
|
||||||
|
**{"Undead Bone Shard #"+str(i): 0x4000085F for i in range(1, 6)},
|
||||||
|
|
||||||
|
# Souls
|
||||||
|
**{"Soul of a Great Champion #"+str(i): 0x400001A4 for i in range(1, 3)},
|
||||||
|
**{"Soul of a Champion #"+str(i): 0x400001A3 for i in range(1, 5)},
|
||||||
|
**{"Soul of a Venerable Old Hand #"+str(i): 0x400001A2 for i in range(1, 5)},
|
||||||
|
**{"Soul of a Crestfallen Knight #"+str(i): 0x40000199 for i in range(1, 11)},
|
||||||
}
|
}
|
||||||
|
|
||||||
armor_table = {
|
armor_table = {
|
||||||
|
|
|
@ -437,12 +437,34 @@ archdragon_peak_table = {
|
||||||
"AP: Havel's Greatshield": 0x013376F0,
|
"AP: Havel's Greatshield": 0x013376F0,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
progressive_locations = {
|
||||||
|
# Upgrade materials
|
||||||
|
**{"Titanite Shard #"+str(i): 0x400003E8 for i in range(1, 11)},
|
||||||
|
**{"Large Titanite Shard #"+str(i): 0x400003E9 for i in range(1, 11)},
|
||||||
|
**{"Titanite Chunk #"+str(i): 0x400003EA for i in range(1, 6)},
|
||||||
|
**{"Titanite Slab #"+str(i): 0x400003EB for i in range(1, 4)},
|
||||||
|
|
||||||
|
# Healing
|
||||||
|
**{"Estus Shard #"+str(i): 0x4000085D for i in range(1, 16)},
|
||||||
|
**{"Undead Bone Shard #"+str(i): 0x4000085F for i in range(1, 6)},
|
||||||
|
|
||||||
|
# Items
|
||||||
|
**{"Firebomb #"+str(i): 0x40000124 for i in range(1, 5)},
|
||||||
|
**{"Throwing Knife #"+str(i): 0x40000136 for i in range(1, 3)},
|
||||||
|
|
||||||
|
# Souls
|
||||||
|
**{"Soul of a Deserted Corpse #" + str(i): 0x40000191 for i in range(1, 6)},
|
||||||
|
**{"Large Soul of a Deserted Corpse #" + str(i): 0x40000192 for i in range(1, 6)},
|
||||||
|
**{"Soul of an Unknown Traveler #" + str(i): 0x40000193 for i in range(1, 6)},
|
||||||
|
**{"Large Soul of an Unknown Traveler #" + str(i): 0x40000194 for i in range(1, 6)},
|
||||||
|
}
|
||||||
|
|
||||||
location_tables = [fire_link_shrine_table, firelink_shrine_bell_tower_table, high_wall_of_lothric, undead_settlement_table, road_of_sacrifice_table,
|
location_tables = [fire_link_shrine_table, firelink_shrine_bell_tower_table, high_wall_of_lothric, undead_settlement_table, road_of_sacrifice_table,
|
||||||
cathedral_of_the_deep_table, farron_keep_table, catacombs_of_carthus_table, smouldering_lake_table, irithyll_of_the_boreal_valley_table,
|
cathedral_of_the_deep_table, farron_keep_table, catacombs_of_carthus_table, smouldering_lake_table, irithyll_of_the_boreal_valley_table,
|
||||||
irithyll_dungeon_table, profaned_capital_table, anor_londo_table, lothric_castle_table, consumed_king_garden_table,
|
irithyll_dungeon_table, profaned_capital_table, anor_londo_table, lothric_castle_table, consumed_king_garden_table,
|
||||||
grand_archives_table, untended_graves_table, archdragon_peak_table]
|
grand_archives_table, untended_graves_table, archdragon_peak_table, progressive_locations]
|
||||||
|
|
||||||
location_dictionary = {**fire_link_shrine_table, **firelink_shrine_bell_tower_table, **high_wall_of_lothric, **undead_settlement_table, **road_of_sacrifice_table,
|
location_dictionary = {**fire_link_shrine_table, **firelink_shrine_bell_tower_table, **high_wall_of_lothric, **undead_settlement_table, **road_of_sacrifice_table,
|
||||||
**cathedral_of_the_deep_table, **farron_keep_table, **catacombs_of_carthus_table, **smouldering_lake_table, **irithyll_of_the_boreal_valley_table,
|
**cathedral_of_the_deep_table, **farron_keep_table, **catacombs_of_carthus_table, **smouldering_lake_table, **irithyll_of_the_boreal_valley_table,
|
||||||
**irithyll_dungeon_table, **profaned_capital_table, **anor_londo_table, **lothric_castle_table, **consumed_king_garden_table,
|
**irithyll_dungeon_table, **profaned_capital_table, **anor_londo_table, **lothric_castle_table, **consumed_king_garden_table,
|
||||||
**grand_archives_table, **untended_graves_table, **archdragon_peak_table}
|
**grand_archives_table, **untended_graves_table, **archdragon_peak_table, **progressive_locations}
|
||||||
|
|
Loading…
Reference in New Issue