/py-slippi

Python library for parsing SSBM replay files

Primary LanguagePythonMIT LicenseMIT

⚠️ py-slippi is no longer maintained

I recommend peppi-py instead.

py-slippi

Py-slippi is a Python parser for .slp game replay files for Super Smash Brothers Melee for the Nintendo GameCube. These replays are generated by Jas Laferriere's Slippi recording code, which runs on a Wii or the Dolphin emulator.

Installation

Requires Python >= 3.7. To install, run the following command (optionally inside a virtual environment):

pip install py-slippi

API Docs

See the Module Index for detailed API docs, starting with slippi.game.

Usage

py-slippi supports both event-based and object-based parsing. Object-based parsing is generally easier, but event-based parsing is more efficient and supports reading partial or in-progress games.

Object-based parsing:

>>> from slippi import Game
>>> Game('test/replays/game.slp')
Game(
    end=End(
        lras_initiator=None,
        method=Method.CONCLUSIVE),
    frames=[...](5209),
    metadata=Metadata(
        console_name=None,
        date=2018-06-22 07:52:59+00:00,
        duration=5209,
        platform=Platform.DOLPHIN,
        players=(
            Player(
                characters={InGameCharacter.MARTH: 5209},
                netplay_name=None),
            Player(
                characters={InGameCharacter.FOX: 5209},
                netplay_name=None),
            None,
            None)),
    start=Start(
        is_frozen_ps=None,
        is_pal=None,
        is_teams=False,
        players=(
            Player(
                character=CSSCharacter.MARTH,
                costume=3,
                stocks=4,
                tag=,
                team=None,
                type=Type.HUMAN,
                ucf=UCF(
                    dash_back=DashBack.OFF,
                    shield_drop=ShieldDrop.OFF)),
            Player(
                character=CSSCharacter.FOX,
                costume=0,
                stocks=4,
                tag=,
                team=None,
                type=Type.CPU,
                ucf=UCF(
                    dash_back=DashBack.OFF,
                    shield_drop=ShieldDrop.OFF)),
            None,
            None),
        random_seed=3803194226,
        slippi=Slippi(
            version=1.0.0),
        stage=Stage.YOSHIS_STORY))

Frame data is elided when you print games, but you can inspect a sample frame with e.g. game.frames[0].

>>> from slippi import Game
# pass `skip_frames=True` to skip frame data, for a significant speedup
>>> Game('test/replays/game.slp', skip_frames=True)

Event-driven API:

>>> from slippi.parse import parse
>>> from slippi.parse import ParseEvent
>>> handlers = {ParseEvent.METADATA: print}
>>> parse('test/replays/game.slp', handlers)
Metadata(
    console_name=None,
    date=2018-06-22 07:52:59+00:00,
    duration=5209,
    platform=Platform.DOLPHIN,
    players=(
        Player(
            characters={InGameCharacter.MARTH: 5209},
            netplay_name=None),
        Player(
            characters={InGameCharacter.FOX: 5209},
            netplay_name=None),
        None,
        None))

👉 You can pass a stream to parse, such as sys.stdin.buffer! This is useful for e.g. decompressing with gunzip, or reading from an in-progress replay via tail -c+1 -f.