Skip to main content

Foxhole save file parser - extracts stockpile data from .sav files

Project description

fs-sav

Foxhole save file parser - extracts stockpile data from .sav files.

Features

  • Parse Foxhole save files (.sav) using the uesave library
  • Extract stockpile information: items, locations, types, quantities
  • Watch files for changes with diff modes (NDJSON output)
  • Filter by hex, stockpile type, public/reserve status
  • Output compatible with foxhole-stockpiles
  • Python bindings via PyO3

Installation

Python (from PyPI)

pip install fs-sav

Rust CLI (from source)

cargo install --path .

Python (from source)

pip install maturin
maturin develop --features python

CLI Usage

Parse command

# Parse a save file
fs-sav parse path/to/War.sav

# Parse with compact output (no pretty printing)
fs-sav parse path/to/War.sav --compact

# Read from stdin
cat War.sav | fs-sav parse

Filter options

# Only public stockpiles (non-reserve)
fs-sav parse War.sav --public

# Only reserve stockpiles
fs-sav parse War.sav --reserves

# Filter by hex
fs-sav parse War.sav --hex TerminusHex

# Filter by stockpile type
fs-sav parse War.sav --type Seaport

# Only stockpiles with items
fs-sav parse War.sav --with-items

# Combine filters
fs-sav parse War.sav --hex TerminusHex --public --with-items

Watch command

# Watch for changes (outputs all stockpiles on each change)
fs-sav watch path/to/War.sav

# Watch with custom poll interval (seconds)
fs-sav watch path/to/War.sav --poll 2.0

# Only output stockpiles that changed (any field)
fs-sav watch path/to/War.sav --diff

# Only output stockpiles where items changed
fs-sav watch path/to/War.sav --diff-items

# Watch with filters
fs-sav watch path/to/War.sav --hex TerminusHex --public

Version

fs-sav version

Python Usage

import fs_sav

# Parse a save file
stockpiles = fs_sav.parse_save("path/to/War.sav")
print(f"Found {len(stockpiles)} stockpiles")

for stockpile in stockpiles:
    print(f"  {stockpile['name']} ({stockpile['type']}): {len(stockpile['items'])} items")

# Parse with filters
seaports = fs_sav.parse_save("War.sav", stockpile_type="Seaport")
reserves = fs_sav.parse_save("War.sav", reserves=True)
terminus_public = fs_sav.parse_save("War.sav", hex="TerminusHex", public=True)

# Parse from bytes
with open("War.sav", "rb") as f:
    data = f.read()
stockpiles = fs_sav.parse_save_bytes(data)

# Get parser info
info = fs_sav.info()
print(f"Implementation: {info['implementation']}, Version: {info['version']}")

Filter parameters

Parameter Type Description
public bool Only public stockpiles (non-reserve)
reserves bool Only reserve stockpiles
hex str Filter by hex name (e.g., "TerminusHex")
stockpile_type str Filter by type (e.g., "Seaport")
with_items bool Only stockpiles with items

Rust Library Usage

use fs_sav::{parse_save, ParseResult};

fn main() -> fs_sav::Result<()> {
    let result = parse_save("path/to/War.sav")?;
    println!("Found {} stockpiles", result.stockpiles.len());

    for stockpile in &result.stockpiles {
        println!("  {} ({:?}): {} items",
            stockpile.name,
            stockpile.stockpile_type,
            stockpile.items.len()
        );
    }

    Ok(())
}

Output Format

The output is a JSON array of stockpiles:

[
  {
    "name": "",
    "type": "Seaport",
    "hex": "TerminusHex",
    "coords": { "x": 0.457, "y": 0.664 },
    "is_reserve": false,
    "items": [
      { "code": "Rifle", "quantity": 100, "crated": false },
      { "code": "RifleAmmo", "quantity": 50, "crated": true }
    ],
    "timestamp": "2024-01-15T10:29:00Z"
  }
]

Stockpile Types

The parser recognizes all Foxhole stockpile types:

Category Types
Bases GarrisonStation, Keep, ForwardBase1, RelicBase1, FortBase (T1-T3), BorderBase, TownBase (T1-T3), FortGarrisonStation
Storage StorageFacility, Seaport, AircraftDepot
Facilities Hospital, Refinery, MaintenanceTunnel, FacilityFactorySmallArms, FacilityModificationCenter, FacilityTransfer (Liquid/Material/Resource), FacilityVehicleFactory (T1-T3)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fs_sav-0.2.3.tar.gz (38.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fs_sav-0.2.3-cp310-abi3-win_amd64.whl (656.9 kB view details)

Uploaded CPython 3.10+Windows x86-64

fs_sav-0.2.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (708.5 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

fs_sav-0.2.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (683.9 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

fs_sav-0.2.3-cp310-abi3-macosx_11_0_arm64.whl (618.2 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

fs_sav-0.2.3-cp310-abi3-macosx_10_12_x86_64.whl (643.2 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file fs_sav-0.2.3.tar.gz.

File metadata

  • Download URL: fs_sav-0.2.3.tar.gz
  • Upload date:
  • Size: 38.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for fs_sav-0.2.3.tar.gz
Algorithm Hash digest
SHA256 4db834dbe6a8ccae1060d3a76cc93ea1d698f3ea997b26638f4df80ffdbb371a
MD5 d4c4c4ee120141838d2cb435b65675f8
BLAKE2b-256 858c6aa761f61e3f3fd6c94ea519d9d81d9d16911be604f12ba87449db372d99

See more details on using hashes here.

File details

Details for the file fs_sav-0.2.3-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: fs_sav-0.2.3-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 656.9 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for fs_sav-0.2.3-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 9248c9766d4a615d963c59eeba721a2adf46b248b19dfbaf5d8562f6cf709111
MD5 43a65471c72535e486ec9adc04593a1f
BLAKE2b-256 13770d1d2ccd2a10d1f7ed08c4fbbdb0886d1b02f87c0e19c41bbb3a7b7bf19b

See more details on using hashes here.

File details

Details for the file fs_sav-0.2.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fs_sav-0.2.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ab391f8735fe9913cb9df94c6a450d792137d77bf7a62ed13b795823807872af
MD5 b0c5578906c4cdd0328b672e740df89f
BLAKE2b-256 1691dbcaa5ff88b788318c9415f6a119a1fbbc356b89cac0db4bdce15257bed4

See more details on using hashes here.

File details

Details for the file fs_sav-0.2.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fs_sav-0.2.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 56c85810bb00cf6a9971bb9db958a3a2d4efcd25983b014b917b64eb6e993a76
MD5 bc601c53991038d210873db27a8cdb6d
BLAKE2b-256 d7b0429a7a977d7103eec8c122bdb1778cd1e42527f273a36212aa52401ab3d4

See more details on using hashes here.

File details

Details for the file fs_sav-0.2.3-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fs_sav-0.2.3-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ed34991968c0f47d31cad32107e14d8dae1b6be6a002604431cbc46d33f480cf
MD5 9f4a0ae61a5fce0a8522801ab71b2900
BLAKE2b-256 ccfbe391b492f5047ffa2d373ef32989b948c775d9da277780b7c78c21e800e6

See more details on using hashes here.

File details

Details for the file fs_sav-0.2.3-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for fs_sav-0.2.3-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ca623a3a862b8a94c5d994727b314f36d33c21c30e3f8c9192ab77216a2a981c
MD5 09e4369b6ba87ce636d01855cd782b01
BLAKE2b-256 d157398fb1f1708fb7d023b6809aaec0938aa116a75889f3a68008fb70022572

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page