SL2 Analyzer
Read a FromSoftware .sl2 save and report what is in it
Loading...
Searching...
No Matches
ds2.py File Reference

Go to the source code of this file.

Namespaces

namespace  sl2
 
namespace  sl2.ds2
 

Functions

 sl2.ds2.ds2_name (buf)
 Read a DS2 name, or None for an empty slot.
 
 sl2.ds2.ds2_inventory (buf, item_db)
 Sort both DS2 inventory regions into categories.
 
 sl2.ds2.ds2_phys_atk (stat)
 Physical attack bonus (ATK: Str/Dex) at a stat value: linear-interpolate the decade breakpoints of DS2_PHYS_ATK_BP, floored to the game's integer display.
 
 sl2.ds2.ds2_elem_def (stat)
 Shared DS2 elemental-defence curve: +6/pt to 10, +8/pt to 20, +1/pt to 60, +0.5/pt (one every other) to 99.
 
 sl2.ds2.ds2_derived_stats (stats)
 Compute DS2 base derived stats from the attribute block.
 
 sl2.ds2.ds2_covenants (buf)
 Every DS2 covenant the character has discovered, with its rank.
 
 sl2.ds2.ds2_parse (buf, item_db, game="ds2sotfs")
 Parse one DS2 slot into the unified character dict, or None if empty.
 
 sl2.ds2.load_ds2_bonfires (base_dir)
 
 sl2.ds2.load_ds2_bonfire_areas (base_dir)
 
 sl2.ds2.load_ds2_bosses (base_dir)
 
 sl2.ds2.load_ds2_boss_souls (base_dir)
 
 sl2.ds2.ds2_base_name (name)
 An inventory name with its " +N" reinforcement suffix removed.
 
 sl2.ds2.ds2_infer_bosses (world, ch, base_dir)
 Bosses this character has defeated, as {boss: [evidence]}, or None.
 
 sl2.ds2.ds2_visited_bonfires (world, bf_db)
 Names of the bonfires this character has discovered, or None.
 
 sl2.ds2.ds2_bonfire_areas (visited, area_db, bf_db)
 Group discovered bonfires by area, in the (area, count, names) shape DS1 and DS3 already emit, so all three render through the same section.
 
 sl2.ds2.ds2_augment (ch, data, entries, i, base_dir, dec=decrypt_ds2)
 DS2-only augment: attach world-block progression (bonfires, bosses) to a parsed character.
 
 sl2.ds2.ds2_active_slots (data, entries, slots, dec=decrypt_ds2)
 Which DS2 block entries hold a character still listed in the menu.
 

Variables

tuple sl2.ds2.DS2_GAMES = ("ds2sotfs", "ds2vanilla")
 The two DS2 releases.
 
dict sl2.ds2.DS2_FAMILY = {"dsr": "ds1", "ptde": "ds1", "ds2vanilla": "ds2sotfs"}
 Game id to the id whose lookup tables it uses (attribute reference, derived stats, themes).
 
 sl2.ds2.DS2_NAME_OFF
 DS2 character-slot offsets (absolute, into decrypted game data).
 
 sl2.ds2.DS2_SOULS_OFF
 DS2 character-slot offsets (absolute, into decrypted game data).
 
 sl2.ds2.DS2_SOULMEM_OFF
 DS2 character-slot offsets (absolute, into decrypted game data).
 
 sl2.ds2.DS2_HP_OFF
 DS2 character-slot offsets (absolute, into decrypted game data).
 
 sl2.ds2.DS2_NG_OFF
 DS2 character-slot offsets (absolute, into decrypted game data).
 
 sl2.ds2.DS2_TITLE_NAME_OFF
 DS2 header (BND4 entry 0) title-list layout: each menu slot's name sits at DS2_TITLE_NAME_OFF + DS2_TITLE_STRIDE * title_index.
 
 sl2.ds2.DS2_TITLE_STRIDE
 DS2 header (BND4 entry 0) title-list layout: each menu slot's name sits at DS2_TITLE_NAME_OFF + DS2_TITLE_STRIDE * title_index.
 
int sl2.ds2.DS2_TITLE_PLAYTIME_OFF = 66
 Play time (u32 seconds) inside a header title record: name is at record base +0, the play-time counter at +66.
 
 sl2.ds2.DS2_CLASS_OFF
 Starting class (byte) and current covenant (byte) offsets in the slot block.
 
 sl2.ds2.DS2_COVENANT_OFF
 Starting class (byte) and current covenant (byte) offsets in the slot block.
 
dict sl2.ds2.DS2_CLASS
 DS2 starting-class and covenant id→name (from the SOTFS Cheat Engine table dropdowns).
 
dict sl2.ds2.DS2_COVENANT
 
 sl2.ds2.DS2_COV_DISC_D
 Per-covenant discovered flag and rank, as two dense byte runs in covenant-id order just past the current-covenant byte.
 
 sl2.ds2.DS2_COV_RANK_D
 Per-covenant discovered flag and rank, as two dense byte runs in covenant-id order just past the current-covenant byte.
 
 sl2.ds2.DS2_COV_MAX_RANK
 Per-covenant discovered flag and rank, as two dense byte runs in covenant-id order just past the current-covenant byte.
 
 sl2.ds2.DS2_GENDER_OFF
 Gender (u8) and hollowing level (u8) offsets in the slot block.
 
 sl2.ds2.DS2_HOLLOW_OFF
 Gender (u8) and hollowing level (u8) offsets in the slot block.
 
int sl2.ds2.DS2_DEATHS_OFF = 104
 Total deaths (u32) in the slot block.
 
dict sl2.ds2.DS2_GENDER = {0: "Male", 1: "Female"}
 DS2 gender enum.
 
 sl2.ds2.DS2_WORLD_ENTRY_DELTA
 Bonfire (rest-point) progression lives in a separate WORLD block, not the character-status block.
 
 sl2.ds2.DS2_BONFIRE_FLAG_DELTA
 Bonfire (rest-point) progression lives in a separate WORLD block, not the character-status block.
 
 sl2.ds2.DS2_BONFIRE_MIN_RUN
 Bonfire (rest-point) progression lives in a separate WORLD block, not the character-status block.
 
 sl2.ds2.DS2_STAT_OFF
 DS2 attribute offsets (uint16 each), in display order; Level last.
 
 sl2.ds2.DS2_STAMINA_BASE
 DS2 derived-stat bases (values BEFORE rings/equipment).
 
 sl2.ds2.DS2_EQUIP_BASE
 DS2 derived-stat bases (values BEFORE rings/equipment).
 
 sl2.ds2.DS2_AGL_BASE
 DS2 derived-stat bases (values BEFORE rings/equipment).
 
 sl2.ds2.DS2_IFRAMES
 Roll i-frames by Agility value (fextralife/community breakpoints).
 
tuple sl2.ds2.DS2_SLOT_BREAKS = (10, 13, 16, 20, 25, 30, 40, 50, 60, 75, 94)
 Attunement values at which a spell slot is unlocked (fextralife Attunement).
 
 sl2.ds2.DS2_PHYS_ATK_BP
 Physical attack bonus (ATK: Str / ATK: Dex) by stat value — decade breakpoints of the weapon-independent curve (the weapon then applies its own scaling on top).
 
 sl2.ds2.DS2_INV_RANGE
 Shared elemental-defence curve breakpoint rates (per stat point): +6 (1-10), +8 (11-20), +1 (21-60), +0.5 (61-99); base 0.
 
 sl2.ds2.DS2_KEY_RANGE
 Shared elemental-defence curve breakpoint rates (per stat point): +6 (1-10), +8 (11-20), +1 (21-60), +0.5 (61-99); base 0.
 
dict sl2.ds2.DS2_STACKABLE
 DS2 categories whose slot +8 field is a real count (float durability elsewhere).
 
dict sl2.ds2.DS2_UPGRADEABLE = {"weapons", "armors"}
 Categories whose slot +12 field carries a reinforcement level.
 
 sl2.ds2.DS2_REINF_OFF
 Byte offsets inside the uint32 upgrade field of a 16-byte item record: the LOW byte (+12) is the reinforcement level (0..10); the next byte (+13) is the infusion id.
 
 sl2.ds2.DS2_INFUSE_OFF
 Byte offsets inside the uint32 upgrade field of a 16-byte item record: the LOW byte (+12) is the reinforcement level (0..10); the next byte (+13) is the infusion id.
 
dict sl2.ds2.DS2_INFUSION
 DS2 infusion ids to names.
 
dict sl2.ds2.DS2_GREAT_SOULS
 The four DS2 "Old" great souls (from the Lost Sinner, the Rotten, the Old Iron King, and the Duke's Dear Freja).
 
dict sl2.ds2._DS2_BONFIRE_CACHE = {}
 Load the DS2 bonfire id→name table (db_ds2/bonfires.json, keyed by the low-16-bit id as 4-hex).
 
dict sl2.ds2._DS2_AREA_CACHE = {}
 Load the DS2 bonfire→area table (db_ds2/bonfire_areas.json): bonfire id → the area it belongs to, so discovered bonfires group the way DS1's and DS3's do instead of listing 77 flat names.
 
dict sl2.ds2._DS2_BOSS_CACHE = {}
 Load the DS2 boss-defeat flag table (db_ds2/boss_flags.json, world-block byte offset as hex → boss name).
 
dict sl2.ds2._DS2_BOSS_SOUL_CACHE = {}
 Load the DS2 boss-soul → boss-name table (db_ds2/boss_souls.json).
 
dict sl2.ds2.DS2_BOSS_GATE
 Progression gates: a boss proven dead by something the character has.
 
dict sl2.ds2.DS2_ITEM_GATE
 Inventory item held ⇒ boss dead (item only obtainable past it).
 
dict sl2.ds2.DS2_BOSS_PREREQ
 Boss defeated ⇒ its mandatory predecessors also defeated (each list is the full transitive set, so a single pass closes it).