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

Go to the source code of this file.

Namespaces

namespace  sl2
 
namespace  sl2.ds1
 

Functions

 sl2.ds1.ds1_derived_stats (stats)
 DS1 base derived stats that are closed-form functions of attributes only.
 
 sl2.ds1.load_ds1_bonfires (base_dir)
 
 sl2.ds1.load_ds1_boss_flags (base_dir)
 
 sl2.ds1.ds1_attach_flags (ch, buf, base_dir, game)
 Merge DS1 boss-defeat FLAGS into ch["bosses"] as flag evidence.
 
 sl2.ds1.load_ds1_known_flags (base_dir)
 
 sl2.ds1.load_ds1_world_events (base_dir)
 
 sl2.ds1.ds1_bonfires (buf, db)
 DS1 bonfires the character has found, grouped by area.
 
 sl2.ds1.ds1_augment (ch, data, entries, i, base_dir, dec)
 DS1-only augment: attach the bonfire list, which needs the db folder the parse function never sees.
 
 sl2.ds1.ds1_resolve (item_db, cat, iid)
 Resolve a DS1 item id to a display name, unwrapping any upgrade baked in.
 
 sl2.ds1.dsr_find_anchor (buf)
 Find the true DSR stat anchor.
 
 sl2.ds1.ds1_inventory (buf, item_db)
 Sort the DS1 inventory into categories.
 
 sl2.ds1.ds1_deaths (buf, game)
 Total deaths for a DS1 slot, or None when the struct isn't where expected.
 
 sl2.ds1.ds1_attach_playtime (ch, menu)
 Attach play time from DS1's load-screen roster block.
 
 sl2.ds1.ds1_character (buf, item_db, m, game, ng)
 Build the unified full-tier dict from a located DS1 stat anchor.
 
 sl2.ds1.dsr_parse (buf, item_db)
 Parse one DSR slot into the unified dict (full tier), or None if empty.
 
 sl2.ds1.ptde_find_anchor (buf)
 Find the PtDE stat anchor (full tier).
 
 sl2.ds1.ptde_parse (buf, item_db)
 Parse one PtDE slot (full tier).
 

Variables

dict sl2.ds1._DS1_BONFIRE_CACHE = {}
 Load the DS1 bonfire table (db_ds1/bonfires.json, NetBonfireDb id → [name, area]).
 
dict sl2.ds1._DS1_BOSSFLAG_CACHE = {}
 Load the DS1 boss-defeat flag table (db_ds1/boss_flags.json, canonical boss name → [region byte offset, uint32 mask]).
 
dict sl2.ds1.DS1_FLAG_BASE = {"dsr": 127721, "ptde": 127273}
 Where the event-flag region starts in a decrypted DS1 slot, per game.
 
 sl2.ds1.DS1_FLAG_MAX_DENSITY
 Sanity gate on that base.
 
 sl2.ds1.DS1_FLAG_SPAN
 Sanity gate on that base.
 
dict sl2.ds1._KNOWN_FLAG_CACHE = {}
 Load the DS1 world-state flag table (category → [[offset, mask, name]]).
 
dict sl2.ds1._WORLD_EVENT_CACHE = {}
 Load the DS1 world-event table (family → [[offset, mask, Japanese name]]).
 
 sl2.ds1.DS1_BONFIRE_REC
 DS1 bonfire record: 20 bytes, id then state (the rest is unread flags).
 
 sl2.ds1.DS1_BONFIRE_STATE_D
 DS1 bonfire record: 20 bytes, id then state (the rest is unread flags).
 
dict sl2.ds1.DS1_BONFIRE_STATE
 The state values a real record can hold, and what each means.
 
int sl2.ds1.DS1_BONFIRE_MIN_RUN = 5
 Shortest believable run, so a stray id in unrelated data cannot pass.
 
 sl2.ds1.DSR_MAGIC = bytes.fromhex("00FFFFFFFF000000000000000000000000FFFFFFFF")
 Anchor pattern that sits next to the DSR character block.
 
 sl2.ds1.DSR_SOULS_D
 DSR field distances from the anchor.
 
 sl2.ds1.DSR_HP_D
 DSR field distances from the anchor.
 
 sl2.ds1.DSR_STAM_D
 DSR field distances from the anchor.
 
 sl2.ds1.DSR_LEVEL_D
 DSR field distances from the anchor.
 
 sl2.ds1.DSR_CLASS_D
 DSR field distances from the anchor.
 
 sl2.ds1.DSR_HUM_D
 DSR field distances from the anchor.
 
 sl2.ds1.DSR_NG_D
 
 sl2.ds1.DSR_NAME_D
 
int sl2.ds1.DSR_GENDER_D = -237
 Gender (u8) distance from the anchor.
 
dict sl2.ds1.DS1_GENDER = {0: "Female", 1: "Male"}
 DS1 gender enum.
 
dict sl2.ds1.DS1_DEATHS_OFF = {"ptde": 0x1F118, "dsr": 0x1F2D8}
 Total deaths (u32), at a slot-absolute offset per release rather than a distance from the moving anchor — the counter lives in a fixed struct near the event-flag region, not in the character block.
 
 sl2.ds1.DS1_DEATHS_SENTINEL
 
 sl2.ds1.DS1_DEATHS_SENTINEL_D
 
int sl2.ds1.DS1_MENU_ENTRY = 10
 DS1's load-screen roster lives in BND4 entry 10, one fixed record per slot: name at +0 (UTF-16), soul level at +36, play time at +40 as a uint32 of SECONDS.
 
 sl2.ds1.DS1_MENU_LEVEL_D
 
 sl2.ds1.DS1_MENU_PLAYTIME_D
 
int sl2.ds1.DS1_EQUIP_BASE = 40
 DS1 derived values that are pure functions of one attribute, so they can be computed exactly rather than guessed.
 
tuple sl2.ds1.DS1_SLOT_BREAKS = (10, 12, 14, 16, 19, 23, 28, 34, 41, 50)
 
 sl2.ds1.DSR_STAT_D
 DSR attribute distances from the anchor (uint8 each), in display order.
 
dict sl2.ds1.DS1_CLASS
 DS1 class ids to names.
 
dict sl2.ds1.DS1_CAT
 DS1 inventory slot type (top nibble) to category.
 
 sl2.ds1.DS1_INV_START
 Where the DS1 inventory scan begins, and the anchor that marks the first real slot.
 
 sl2.ds1.DS1_INV_ANCHOR
 Where the DS1 inventory scan begins, and the anchor that marks the first real slot.
 
 sl2.ds1.DS1_INV_END = bytes.fromhex("00000000FFFFFFFFFFFFFFFF")
 End-of-inventory marker.
 
dict sl2.ds1.DS1_INFUSION
 DS1 weapon infusion paths, keyed by the hundreds digit of the id's upgrade suffix (id = base + path*100 + level).