Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/Mark-Prime/vdm

A *hopefully* simple rust package that makes vdm parsing and viewing as easy as possible for source engine games.
https://github.com/Mark-Prime/vdm

Last synced: about 1 month ago
JSON representation

A *hopefully* simple rust package that makes vdm parsing and viewing as easy as possible for source engine games.

Awesome Lists containing this project

README

        

# VDM

A rust library for parsing and modifying [.vdm](https://developer.valvesoftware.com/wiki/Demo_Recording_Tools#Demo_editor) files used in source games.

Included features:

- Easily parse .vdm files.
- Create a new .vdm from scratch.
- Modify, delete and add actions.
- Export to a file.

## Usage

Add this to your `Cargo.toml`

```
[dependencies]
vdm = "1"
```

### Examples

#### Creating a new .vdm

The quickest way to get stated is by making a brand new .vdm file and exporting it.

```rust
let vdm = VDM::new();

// Include the file path you wish to export to
vdm.export("example.vdm"));
```

However, this would result in a blank .vdm file. Instead, let's add a new action to it.

```rust
let mut vdm = VDM::new();

// This will create a new action and automatically append it to the vdm.
let mut action = vdm.create_action(ActionType::SkipAhead);

// Gather the props from the action to edit them.
let mut props = action.props();

// Name the action for easy organization when exported
props.name = "Skip 5 seconds in".to_string();

// Skip 5 seconds into the demo
props.skip_to_time = Some(5.0);

// Save the new props to the action
action.set_props(props);

// Save the action to the vdm
vdm.set_last(action);

vdm.export("example.vdm");
```

This is rather verbose, but we can shorten it quite a bit by knowing what we want to do.

```rust
let mut vdm = VDM::new();

// create_action() always create the action at the end, we don't need to save it because it's easy to access later.
let mut props = vdm.create_action(ActionType::SkipAhead).props_mut();

// Since we used .props_mut() we can directly edit the Action without needing to set anything after.
// Set is available if you want to completely replace an Action or its properties with .set_nth_props()
props.name = "Skip 5 seconds in".to_string();
props.skip_to_time = Some(5.0);

vdm.export("example.vdm");
```

example.vdm

```vdm
demoactions
{
"1"
{
factory "SkipAhead"
name "Unnamed"
skiptotime "5.000"
}
}
```

Because no start time is listed, it will happen as soon as possible after the demo starts.

#### Editing an existing .vdm file

You can also parse/edit existing .vdm files in a very similar way.

In this example, we're going to change when the skipping starts in the previous example.

```rust
let mut vdm = VDM::open("example.vdm").unwrap();

// Grab the first actions properties.
let mut props = vdm.first().props();

// This sets the starting point 100 game ticks into the demo
// 66 ticks = 1 second
props.start_tick = Some(100);

// You could also use vdm.set_nth_props(0, props);
vdm.set_first_props(props);

vdm.export("example.vdm");
```

Alternatively, we could also borrow it as mutable using .first_mut() and .props_mut() which cuts it down even further.

```rust
let mut vdm = VDM::open("example.vdm").unwrap();
// Grab the first actions properties as mutable.
let mut props = vdm.first_mut().props_mut();

// This sets the starting point 100 game ticks into the demo
// 66 ticks = 1 second
props.start_tick = Some(500);

// export without needing to set anything.
vdm.export("example.vdm");
```

example.vdm

```vdm
demoactions
{
"1"
{
factory "SkipAhead"
name "Unnamed"
skiptotime "5.000"
starttick "100"
}
}
```

The .vdm file will only ever show actions that work with that specific action. SkipAhead will never show RGB values for example.

#### Deleting an Action

Let's say we need to delete the action we just made. It's simple!

```rust
let mut vdm = VDM::open("example.vdm").unwrap();

// Remove whatever the last action is.
vdm.remove_last();

// Alternatively you can remove the first or nth element
// vdm.remove(n);
// vdm.remove_first();

vdm.export("example.vdm");
```

example.vdm

```vdm
demoactions
{
}
```

### Action Types

- SkipAhead
- StopPlayback
- PlayCommands
- ScreenFadeStart
- TextMessageStart
- PlayCDTrackStart
- PlaySoundStart
- Pause
- ChangePlaybackRate
- ZoomFov

Dev command: cargo watch -q -c -x "run -q"

License: MIT OR Apache-2.0