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.4.tar.gz (38.5 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.4-cp310-abi3-win_amd64.whl (656.8 kB view details)

Uploaded CPython 3.10+Windows x86-64

fs_sav-0.2.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (709.0 kB view details)

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

fs_sav-0.2.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (684.1 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.10+macOS 11.0+ ARM64

fs_sav-0.2.4-cp310-abi3-macosx_10_12_x86_64.whl (643.4 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for fs_sav-0.2.4.tar.gz
Algorithm Hash digest
SHA256 a51209e4c213f24d3295679ec5a5db36bc018bd319bc7294de9a1fb09eb73173
MD5 bc68765d48b4a4806d79164da62105ae
BLAKE2b-256 15230c4a5d4f4a6e932c22dd89d51497c5d4f1049017b89268a2013f162d61cc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fs_sav-0.2.4-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 656.8 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.4-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f1d386d1a1a0a5bb09feb9ad72525c50d8c4a462a3879dd54141928e37a2c354
MD5 7868e9fcc43c4d70dbbf39963b896a86
BLAKE2b-256 f325ef5c6336075420fd38e8a3f500f850d6b2b4084cdf0347ea9c927cbc5284

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fs_sav-0.2.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 534d6a58528220116d3ac1644afed75c2a9487e0b638513b013e68729547c3d1
MD5 5975ca70987a5755434e99c7864a4955
BLAKE2b-256 de6ee13c187beb87bb79bb81aaf43918c651a1cbac4c00521262af4390cea59e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fs_sav-0.2.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8889dc7041ed375687108b5087b513d2d0fe053bd90424806f6d41346110ed41
MD5 54d935cfee6fddf868bfda8085673c2b
BLAKE2b-256 ddb4349170f48074036afc2e16e6a698ea37996a2fb71710d27c29c313ec6eb7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fs_sav-0.2.4-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bbea3bbadfb6d22a038ef7f89ba1a1d0cd5520d35cf4ee089a749be17746ee3d
MD5 8a36cfe8d5da9ff2b2184ed57a53fcc0
BLAKE2b-256 c82f929e89a60a8d5aaa1993d19c5f8b118b06509b90aac70ae0b10f6c34f8ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fs_sav-0.2.4-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8a6a8af7132167218644d8046c7e00800c78ca2085ccf7b05cc27b11947f61cf
MD5 bac8badff40144c6cc1a81804f8ae6bb
BLAKE2b-256 2df28091f2f4a30fba0f03e3473bc0a7edff31a422f85635b8427ca6559c0b1f

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